[SATYR PATCH v2] do not double-free list elements in python bindings

Michal Toman mtoman at redhat.com
Mon Jul 15 10:45:45 UTC 2013


---
 python/py_base_stacktrace.c   | 17 ----------
 python/py_base_stacktrace.h   |  1 -
 python/py_base_thread.c       | 18 ----------
 python/py_base_thread.h       |  1 -
 python/py_gdb_stacktrace.c    | 76 +++++++------------------------------------
 python/py_gdb_thread.c        |  3 +-
 python/py_java_stacktrace.c   |  3 +-
 python/py_java_thread.c       |  3 +-
 python/py_koops_stacktrace.c  | 10 +++---
 python/py_python_stacktrace.c |  3 +-
 10 files changed, 24 insertions(+), 111 deletions(-)

diff --git a/python/py_base_stacktrace.c b/python/py_base_stacktrace.c
index 5739e3c..72d96f0 100644
--- a/python/py_base_stacktrace.c
+++ b/python/py_base_stacktrace.c
@@ -205,23 +205,6 @@ threads_prepare_linked_list(struct sr_py_multi_stacktrace *stacktrace)
     return 0;
 }
 
-int
-threads_free_python_list(struct sr_py_multi_stacktrace *stacktrace)
-{
-    int i;
-    PyObject *item;
-    for (i = 0; i < PyList_Size(stacktrace->threads); ++i)
-    {
-        item = PyList_GetItem(stacktrace->threads, i);
-        if (!item)
-            return -1;
-        Py_DECREF(item);
-    }
-    Py_DECREF(stacktrace->threads);
-
-    return 0;
-}
-
 PyObject *
 threads_to_python_list(struct sr_stacktrace *stacktrace, PyTypeObject *thread_type, PyTypeObject *frame_type)
 {
diff --git a/python/py_base_stacktrace.h b/python/py_base_stacktrace.h
index 6b12fa4..41eee62 100644
--- a/python/py_base_stacktrace.h
+++ b/python/py_base_stacktrace.h
@@ -49,7 +49,6 @@ struct sr_py_multi_stacktrace
 
 /* helpers */
 int threads_prepare_linked_list(struct sr_py_multi_stacktrace *stacktrace);
-int threads_free_python_list(struct sr_py_multi_stacktrace *stacktrace);
 PyObject *threads_to_python_list(struct sr_stacktrace *stacktrace,
                                  PyTypeObject *thread_type, PyTypeObject *frame_type);
 
diff --git a/python/py_base_thread.c b/python/py_base_thread.c
index 5bbbade..ff2eab7 100644
--- a/python/py_base_thread.c
+++ b/python/py_base_thread.c
@@ -152,24 +152,6 @@ frames_prepare_linked_list(struct sr_py_base_thread *thread)
     return 0;
 }
 
-int
-frames_free_python_list(struct sr_py_base_thread *thread)
-{
-    int i;
-    PyObject *item;
-
-    for (i = 0; i < PyList_Size(thread->frames); ++i)
-    {
-        item = PyList_GetItem(thread->frames, i);
-        if (!item)
-            return -1;
-        Py_DECREF(item);
-    }
-    Py_DECREF(thread->frames);
-
-    return 0;
-}
-
 PyObject *
 frames_to_python_list(struct sr_thread *thread, PyTypeObject *frame_type)
 {
diff --git a/python/py_base_thread.h b/python/py_base_thread.h
index e9f1af7..aa3f1b7 100644
--- a/python/py_base_thread.h
+++ b/python/py_base_thread.h
@@ -44,7 +44,6 @@ struct sr_py_base_thread
 
 /* helpers */
 int frames_prepare_linked_list(struct sr_py_base_thread *thread);
-int frames_free_python_list(struct sr_py_base_thread *thread);
 PyObject *frames_to_python_list(struct sr_thread *thread, PyTypeObject *frame_type);
 
 int sr_py_base_thread_cmp(struct sr_py_base_thread *self, struct sr_py_base_thread *other);
diff --git a/python/py_gdb_stacktrace.c b/python/py_gdb_stacktrace.c
index bde65d2..4b47b94 100644
--- a/python/py_gdb_stacktrace.c
+++ b/python/py_gdb_stacktrace.c
@@ -194,41 +194,6 @@ gdb_prepare_linked_lists(struct sr_py_gdb_stacktrace *stacktrace)
     return 0;
 }
 
-int
-stacktrace_free_thread_python_list(struct sr_py_gdb_stacktrace *stacktrace)
-{
-    int i;
-    PyObject *item;
-    for (i = 0; i < PyList_Size(stacktrace->threads); ++i)
-    {
-        item = PyList_GetItem(stacktrace->threads, i);
-        if (!item)
-            return -1;
-        Py_DECREF(item);
-    }
-    Py_DECREF(stacktrace->threads);
-
-    return 0;
-}
-
-int
-stacktrace_free_sharedlib_python_list(struct sr_py_gdb_stacktrace *stacktrace)
-{
-    int i;
-    PyObject *item;
-
-    for (i = 0; i < PyList_Size(stacktrace->libs); ++i)
-    {
-        item = PyList_GetItem(stacktrace->libs, i);
-        if (!item)
-            return -1;
-        Py_DECREF(item);
-    }
-    Py_DECREF(stacktrace->libs);
-
-    return 0;
-}
-
 PyObject *
 thread_linked_list_to_python_list(struct sr_gdb_stacktrace *stacktrace)
 {
@@ -294,17 +259,10 @@ stacktrace_rebuild_thread_python_list(struct sr_py_gdb_stacktrace *stacktrace)
     struct sr_gdb_thread *newlinkedlist = sr_gdb_thread_dup(stacktrace->stacktrace->threads, true);
     if (!newlinkedlist)
         return -1;
-    if (stacktrace_free_thread_python_list(stacktrace) < 0)
-    {
-        struct sr_gdb_thread *next;
-        while (newlinkedlist)
-        {
-            next = newlinkedlist->next;
-            sr_gdb_thread_free(newlinkedlist);
-            newlinkedlist = next;
-        }
-        return -1;
-    }
+
+    /* the list will decref all of its elements */
+    Py_DECREF(stacktrace->threads);
+
     stacktrace->stacktrace->threads = newlinkedlist;
     stacktrace->threads = threads_to_python_list((struct sr_stacktrace *)stacktrace->stacktrace,
                                                  &sr_py_gdb_thread_type, &sr_py_gdb_frame_type);
@@ -317,17 +275,9 @@ stacktrace_rebuild_sharedlib_python_list(struct sr_py_gdb_stacktrace *stacktrace
     struct sr_gdb_sharedlib *newlinkedlist = sr_gdb_sharedlib_dup(stacktrace->stacktrace->libs, true);
     if (!newlinkedlist)
         return -1;
-    if (stacktrace_free_sharedlib_python_list(stacktrace) < 0)
-    {
-        struct sr_gdb_sharedlib *next;
-        while (newlinkedlist)
-        {
-            next = newlinkedlist->next;
-            sr_gdb_sharedlib_free(newlinkedlist);
-            newlinkedlist = next;
-        }
-        return -1;
-    }
+
+    /* the list will decref all of its elements */
+    Py_DECREF(stacktrace->libs);
     stacktrace->stacktrace->libs = newlinkedlist;
     stacktrace->libs = sharedlib_linked_list_to_python_list(stacktrace->stacktrace);
     return 0;
@@ -387,8 +337,9 @@ void
 sr_py_gdb_stacktrace_free(PyObject *object)
 {
     struct sr_py_gdb_stacktrace *this = (struct sr_py_gdb_stacktrace*)object;
-    stacktrace_free_thread_python_list(this);
-    stacktrace_free_sharedlib_python_list(this);
+    /* the list will decref all of its elements */
+    Py_DECREF(this->threads);
+    Py_DECREF(this->libs);
     this->stacktrace->threads = NULL;
     this->stacktrace->libs = NULL;
     sr_gdb_stacktrace_free(this->stacktrace);
@@ -624,11 +575,8 @@ sr_py_gdb_stacktrace_normalize(PyObject *self, PyObject *args)
     /* need to rebuild python list manually */
     struct sr_gdb_stacktrace *tmp = sr_gdb_stacktrace_dup(this->stacktrace);
     sr_normalize_gdb_stacktrace(tmp);
-    if (stacktrace_free_thread_python_list(this) < 0)
-    {
-        sr_gdb_stacktrace_free(tmp);
-        return NULL;
-    }
+    /* the list will decref all of its elements */
+    Py_DECREF(this->threads);
 
     this->stacktrace->threads = tmp->threads;
     tmp->threads = NULL;
diff --git a/python/py_gdb_thread.c b/python/py_gdb_thread.c
index f9fde3c..4891375 100644
--- a/python/py_gdb_thread.c
+++ b/python/py_gdb_thread.c
@@ -161,7 +161,8 @@ void
 sr_py_gdb_thread_free(PyObject *object)
 {
     struct sr_py_gdb_thread *this = (struct sr_py_gdb_thread *)object;
-    frames_free_python_list((struct sr_py_base_thread*) this);
+    /* the list will decref all of its elements */
+    Py_DECREF(this->frames);
     this->thread->frames = NULL;
     sr_gdb_thread_free(this->thread);
     PyObject_Del(object);
diff --git a/python/py_java_stacktrace.c b/python/py_java_stacktrace.c
index 7a9477d..2686912 100644
--- a/python/py_java_stacktrace.c
+++ b/python/py_java_stacktrace.c
@@ -135,7 +135,8 @@ void
 sr_py_java_stacktrace_free(PyObject *object)
 {
     struct sr_py_java_stacktrace *this = (struct sr_py_java_stacktrace*)object;
-    threads_free_python_list((struct sr_py_multi_stacktrace *)this);
+    /* the list will decref all of its elements */
+    Py_DECREF(this->threads);
     this->stacktrace->threads = NULL;
     sr_java_stacktrace_free(this->stacktrace);
     PyObject_Del(object);
diff --git a/python/py_java_thread.c b/python/py_java_thread.c
index 3c8a77b..7869fef 100644
--- a/python/py_java_thread.c
+++ b/python/py_java_thread.c
@@ -156,7 +156,8 @@ void
 sr_py_java_thread_free(PyObject *object)
 {
     struct sr_py_java_thread *this = (struct sr_py_java_thread *)object;
-    frames_free_python_list((struct sr_py_base_thread *)this);
+    /* the list will decref all of its elements */
+    Py_DECREF(this->frames);
     this->thread->frames = NULL;
     sr_java_thread_free(this->thread);
     PyObject_Del(object);
diff --git a/python/py_koops_stacktrace.c b/python/py_koops_stacktrace.c
index c748721..0057cb1 100644
--- a/python/py_koops_stacktrace.c
+++ b/python/py_koops_stacktrace.c
@@ -194,7 +194,8 @@ void
 sr_py_koops_stacktrace_free(PyObject *object)
 {
     struct sr_py_koops_stacktrace *this = (struct sr_py_koops_stacktrace*)object;
-    frames_free_python_list((struct sr_py_base_thread *)this);
+    /* the list will decref all of its elements */
+    Py_DECREF(this->frames);
     this->stacktrace->frames = NULL;
     sr_koops_stacktrace_free(this->stacktrace);
     PyObject_Del(object);
@@ -252,11 +253,8 @@ sr_py_koops_stacktrace_normalize(PyObject *self, PyObject *args)
     /* need to rebuild python list manually */
     struct sr_koops_stacktrace *tmp = sr_koops_stacktrace_dup(this->stacktrace);
     sr_normalize_koops_stacktrace(tmp);
-    if (frames_free_python_list((struct sr_py_base_thread *)this) < 0)
-    {
-        sr_koops_stacktrace_free(tmp);
-        return NULL;
-    }
+    /* the list will decref all of its elements */
+    Py_DECREF(this->frames);
 
     this->stacktrace->frames = tmp->frames;
     tmp->frames = NULL;
diff --git a/python/py_python_stacktrace.c b/python/py_python_stacktrace.c
index 0f16b07..1b45e64 100644
--- a/python/py_python_stacktrace.c
+++ b/python/py_python_stacktrace.c
@@ -151,7 +151,8 @@ void
 sr_py_python_stacktrace_free(PyObject *object)
 {
     struct sr_py_python_stacktrace *this = (struct sr_py_python_stacktrace*)object;
-    frames_free_python_list((struct sr_py_base_thread *)this);
+    /* the list will decref all of its elements */
+    Py_DECREF(this->frames);
     this->stacktrace->frames = NULL;
     sr_python_stacktrace_free(this->stacktrace);
     PyObject_Del(object);
-- 
1.8.3.1



More information about the Crash-catcher mailing list