[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