From 9bc3523d11081b973ad34f212cb5cacf3126a27f Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Fri, 30 Mar 2012 20:05:55 +0000 Subject: * python/python.c (gdbpy_decode_line): Move cleanup creation out of TRY_CATCH. Fix error handling. * python/py-value.c (convert_value_from_python): Move 'old' declaration to innermost scope. --- gdb/ChangeLog | 7 +++++++ gdb/python/py-value.c | 3 ++- gdb/python/python.c | 29 +++++++++++++++++++++-------- 3 files changed, 30 insertions(+), 9 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index f6c7735..118401c 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2012-03-30 Tom Tromey + + * python/python.c (gdbpy_decode_line): Move cleanup creation out + of TRY_CATCH. Fix error handling. + * python/py-value.c (convert_value_from_python): Move 'old' + declaration to innermost scope. + 2012-03-29 Joel Brobecker Andrey Smirnov diff --git a/gdb/python/py-value.c b/gdb/python/py-value.c index 58513d8..6f67bdb 100644 --- a/gdb/python/py-value.c +++ b/gdb/python/py-value.c @@ -1250,7 +1250,6 @@ struct value * convert_value_from_python (PyObject *obj) { struct value *value = NULL; /* -Wall */ - struct cleanup *old; volatile struct gdb_exception except; int cmp; @@ -1319,6 +1318,8 @@ convert_value_from_python (PyObject *obj) s = python_string_to_target_string (obj); if (s != NULL) { + struct cleanup *old; + old = make_cleanup (xfree, s); value = value_cstring (s, strlen (s), builtin_type_pychar); do_cleanups (old); diff --git a/gdb/python/python.c b/gdb/python/python.c index 735d94d..938275a 100644 --- a/gdb/python/python.c +++ b/gdb/python/python.c @@ -503,7 +503,7 @@ gdbpy_decode_line (PyObject *self, PyObject *args) appease gcc. */ struct symtab_and_line sal; const char *arg = NULL; - char *copy = NULL; + char *copy_to_free = NULL, *copy = NULL; struct cleanup *cleanups; PyObject *result = NULL; PyObject *return_result = NULL; @@ -515,14 +515,14 @@ gdbpy_decode_line (PyObject *self, PyObject *args) cleanups = make_cleanup (null_cleanup, NULL); + sals.sals = NULL; TRY_CATCH (except, RETURN_MASK_ALL) { if (arg) { copy = xstrdup (arg); - make_cleanup (xfree, copy); + copy_to_free = copy; sals = decode_line_1 (©, 0, 0, 0); - make_cleanup (xfree, sals.sals); } else { @@ -532,6 +532,13 @@ gdbpy_decode_line (PyObject *self, PyObject *args) sals.nelts = 1; } } + + if (sals.sals != NULL && sals.sals != &sal) + { + make_cleanup (xfree, copy_to_free); + make_cleanup (xfree, sals.sals); + } + if (except.reason < 0) { do_cleanups (cleanups); @@ -575,7 +582,16 @@ gdbpy_decode_line (PyObject *self, PyObject *args) } if (copy && strlen (copy) > 0) - unparsed = PyString_FromString (copy); + { + unparsed = PyString_FromString (copy); + if (unparsed == NULL) + { + Py_DECREF (result); + Py_DECREF (return_result); + return_result = NULL; + goto error; + } + } else { unparsed = Py_None; @@ -585,13 +601,10 @@ gdbpy_decode_line (PyObject *self, PyObject *args) PyTuple_SetItem (return_result, 0, unparsed); PyTuple_SetItem (return_result, 1, result); + error: do_cleanups (cleanups); return return_result; - - error: - do_cleanups (cleanups); - return NULL; } /* Parse a string and evaluate it as an expression. */ -- cgit v1.1