diff options
author | Riccardo Schirone <ret2libc@users.noreply.github.com> | 2019-11-13 14:54:21 +0100 |
---|---|---|
committer | Giampaolo Rodola <g.rodola@gmail.com> | 2019-11-13 21:54:21 +0800 |
commit | 7d512c8e4442a896d56505be3e78f1156f443465 (patch) | |
tree | 387459430317a6ba3e5975697e7f2ce069197bf1 /psutil/_psutil_sunos.c | |
parent | ef032158fd72790ab2be14e99c45c32d66d96291 (diff) | |
download | psutil-7d512c8e4442a896d56505be3e78f1156f443465.tar.gz |
Use Py_CLEAR instead of Py_DECREF to also set the variable to NULL (#1616)
These files contain loops that convert system data into python objects
and during the process they create objects and dereference their
refcounts after they have been added to the resulting list.
However, in case of errors during the creation of those python objects,
the refcount to previously allocated objects is dropped again with
Py_XDECREF, which should be a no-op in case the paramater is NULL. Even
so, in most of these loops the variables pointing to the objects are
never set to NULL, even after Py_DECREF is called at the end of the loop
iteration. This means, after the first iteration, if an error occurs
those python objects will get their refcount dropped two times,
resulting in a possible double-free.
Diffstat (limited to 'psutil/_psutil_sunos.c')
-rw-r--r-- | psutil/_psutil_sunos.c | 43 |
1 files changed, 21 insertions, 22 deletions
diff --git a/psutil/_psutil_sunos.c b/psutil/_psutil_sunos.c index 919e76d6..31d6f364 100644 --- a/psutil/_psutil_sunos.c +++ b/psutil/_psutil_sunos.c @@ -300,8 +300,8 @@ psutil_proc_environ(PyObject *self, PyObject *args) { if (PyDict_SetItem(py_retdict, py_envname, py_envval) < 0) goto error; - Py_DECREF(py_envname); - Py_DECREF(py_envval); + Py_CLEAR(py_envname); + Py_CLEAR(py_envval); } psutil_free_cstrings_array(env, env_count); @@ -655,10 +655,10 @@ psutil_users(PyObject *self, PyObject *args) { goto error; if (PyList_Append(py_retlist, py_tuple)) goto error; - Py_DECREF(py_username); - Py_DECREF(py_tty); - Py_DECREF(py_hostname); - Py_DECREF(py_tuple); + Py_CLEAR(py_username); + Py_CLEAR(py_tty); + Py_CLEAR(py_hostname); + Py_CLEAR(py_tuple); } endutxent(); @@ -714,9 +714,9 @@ psutil_disk_partitions(PyObject *self, PyObject *args) { goto error; if (PyList_Append(py_retlist, py_tuple)) goto error; - Py_DECREF(py_dev); - Py_DECREF(py_mountp); - Py_DECREF(py_tuple); + Py_CLEAR(py_dev); + Py_CLEAR(py_mountp); + Py_CLEAR(py_tuple); } fclose(file); return py_retlist; @@ -767,8 +767,7 @@ psutil_per_cpu_times(PyObject *self, PyObject *args) { goto error; if (PyList_Append(py_retlist, py_cputime)) goto error; - Py_DECREF(py_cputime); - py_cputime = NULL; + Py_CLEAR(py_cputime); } } @@ -824,7 +823,7 @@ psutil_disk_io_counters(PyObject *self, PyObject *args) { if (PyDict_SetItemString(py_retdict, ksp->ks_name, py_disk_info)) goto error; - Py_DECREF(py_disk_info); + Py_CLEAR(py_disk_info); } } ksp = ksp->ks_next; @@ -959,8 +958,8 @@ psutil_proc_memory_maps(PyObject *self, PyObject *args) { goto error; if (PyList_Append(py_retlist, py_tuple)) goto error; - Py_DECREF(py_path); - Py_DECREF(py_tuple); + Py_CLEAR(py_path); + Py_CLEAR(py_tuple); // increment pointer p += 1; @@ -1075,7 +1074,7 @@ psutil_net_io_counters(PyObject *self, PyObject *args) { goto error; if (PyDict_SetItemString(py_retdict, ksp->ks_name, py_ifc_info)) goto error; - Py_DECREF(py_ifc_info); + Py_CLEAR(py_ifc_info); goto next; next: @@ -1273,7 +1272,7 @@ psutil_net_connections(PyObject *self, PyObject *args) { goto error; if (PyList_Append(py_retlist, py_tuple)) goto error; - Py_DECREF(py_tuple); + Py_CLEAR(py_tuple); } } #if defined(AF_INET6) @@ -1287,7 +1286,7 @@ psutil_net_connections(PyObject *self, PyObject *args) { #ifdef NEW_MIB_COMPLIANT processed_pid = tp6.tcp6ConnCreationProcess; #else - processed_pid = 0; + processed_pid = 0; #endif if (pid != -1 && processed_pid != pid) continue; @@ -1316,14 +1315,14 @@ psutil_net_connections(PyObject *self, PyObject *args) { goto error; if (PyList_Append(py_retlist, py_tuple)) goto error; - Py_DECREF(py_tuple); + Py_CLEAR(py_tuple); } } #endif // UDPv4 else if (mibhdr.level == MIB2_UDP || mibhdr.level == MIB2_UDP_ENTRY) { num_ent = mibhdr.len / sizeof(mib2_udpEntry_t); - assert(num_ent * sizeof(mib2_udpEntry_t) == mibhdr.len); + assert(num_ent * sizeof(mib2_udpEntry_t) == mibhdr.len); for (i = 0; i < num_ent; i++) { memcpy(&ude, databuf.buf + i * sizeof ude, sizeof ude); #ifdef NEW_MIB_COMPLIANT @@ -1355,7 +1354,7 @@ psutil_net_connections(PyObject *self, PyObject *args) { goto error; if (PyList_Append(py_retlist, py_tuple)) goto error; - Py_DECREF(py_tuple); + Py_CLEAR(py_tuple); } } #if defined(AF_INET6) @@ -1388,7 +1387,7 @@ psutil_net_connections(PyObject *self, PyObject *args) { goto error; if (PyList_Append(py_retlist, py_tuple)) goto error; - Py_DECREF(py_tuple); + Py_CLEAR(py_tuple); } } #endif @@ -1561,7 +1560,7 @@ psutil_net_if_stats(PyObject* self, PyObject* args) { goto error; if (PyDict_SetItemString(py_retdict, ksp->ks_name, py_ifc_info)) goto error; - Py_DECREF(py_ifc_info); + Py_CLEAR(py_ifc_info); } } |