From: Tom Tromey Date: Mon, 20 May 2013 20:24:49 +0000 (+0000) Subject: * python/py-inferior.c (gdbpy_inferiors): Update. Hoist X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=b86af38a5a769f23d1af78761c654d68703c6237;p=binutils-gdb.git * python/py-inferior.c (gdbpy_inferiors): Update. Hoist get_addr_from_python calls out of TRY_CATCH. (infpy_write_memory, infpy_search_memory): Likewise. * python/py-utils.c (get_addr_from_python): Return negative value on error. Use TRY_CATCH. * python/python-internal.h (get_addr_from_python): Use CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 319625ab1fc..12184a5ba6f 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,13 @@ +2013-05-20 Tom Tromey + + * python/py-inferior.c (gdbpy_inferiors): Update. Hoist + get_addr_from_python calls out of TRY_CATCH. + (infpy_write_memory, infpy_search_memory): Likewise. + * python/py-utils.c (get_addr_from_python): Return negative + value on error. Use TRY_CATCH. + * python/python-internal.h (get_addr_from_python): Use + CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION. + 2013-05-20 Tom Tromey * python/py-event.c (evpy_emit_event): Decref the diff --git a/gdb/python/py-inferior.c b/gdb/python/py-inferior.c index d35d09a39fb..4e68cdd230b 100644 --- a/gdb/python/py-inferior.c +++ b/gdb/python/py-inferior.c @@ -406,7 +406,6 @@ gdbpy_inferiors (PyObject *unused, PyObject *unused2) static PyObject * infpy_read_memory (PyObject *self, PyObject *args, PyObject *kw) { - int error = 0; CORE_ADDR addr, length; void *buffer = NULL; membuf_object *membuf_obj; @@ -418,15 +417,12 @@ infpy_read_memory (PyObject *self, PyObject *args, PyObject *kw) &addr_obj, &length_obj)) return NULL; + if (get_addr_from_python (addr_obj, &addr) < 0 + || get_addr_from_python (length_obj, &length) < 0) + return NULL; + TRY_CATCH (except, RETURN_MASK_ALL) { - if (!get_addr_from_python (addr_obj, &addr) - || !get_addr_from_python (length_obj, &length)) - { - error = 1; - break; - } - buffer = xmalloc (length); read_memory (addr, buffer, length); @@ -437,12 +433,6 @@ infpy_read_memory (PyObject *self, PyObject *args, PyObject *kw) GDB_PY_HANDLE_EXCEPTION (except); } - if (error) - { - xfree (buffer); - return NULL; - } - membuf_obj = PyObject_New (membuf_object, &membuf_object_type); if (membuf_obj == NULL) { @@ -475,7 +465,6 @@ static PyObject * infpy_write_memory (PyObject *self, PyObject *args, PyObject *kw) { Py_ssize_t buf_len; - int error = 0; const char *buffer; CORE_ADDR addr, length; PyObject *addr_obj, *length_obj = NULL; @@ -498,21 +487,16 @@ infpy_write_memory (PyObject *self, PyObject *args, PyObject *kw) return NULL; #endif + if (get_addr_from_python (addr_obj, &addr) < 0) + goto fail; + + if (!length_obj) + length = buf_len; + else if (get_addr_from_python (length_obj, &length) < 0) + goto fail; + TRY_CATCH (except, RETURN_MASK_ALL) { - if (!get_addr_from_python (addr_obj, &addr)) - { - error = 1; - break; - } - - if (!length_obj) - length = buf_len; - else if (!get_addr_from_python (length_obj, &length)) - { - error = 1; - break; - } write_memory_with_notification (addr, (gdb_byte *) buffer, length); } #ifdef IS_PY3K @@ -520,11 +504,13 @@ infpy_write_memory (PyObject *self, PyObject *args, PyObject *kw) #endif GDB_PY_HANDLE_EXCEPTION (except); - - if (error) - return NULL; - Py_RETURN_NONE; + + fail: +#ifdef IS_PY3K + PyBuffer_Release (&pybuf); +#endif + return NULL; } /* Destructor of Membuf objects. */ @@ -660,34 +646,26 @@ infpy_search_memory (PyObject *self, PyObject *args, PyObject *kw) return NULL; #endif - if (get_addr_from_python (start_addr_obj, &start_addr) - && get_addr_from_python (length_obj, &length)) - { - if (!length) - { - PyErr_SetString (PyExc_ValueError, - _("Search range is empty.")); + if (get_addr_from_python (start_addr_obj, &start_addr) < 0) + goto fail; + + if (get_addr_from_python (length_obj, &length) < 0) + goto fail; -#ifdef IS_PY3K - PyBuffer_Release (&pybuf); -#endif - return NULL; - } - /* Watch for overflows. */ - else if (length > CORE_ADDR_MAX - || (start_addr + length - 1) < start_addr) - { - PyErr_SetString (PyExc_ValueError, - _("The search range is too large.")); - -#ifdef IS_PY3K - PyBuffer_Release (&pybuf); -#endif - return NULL; - } + if (!length) + { + PyErr_SetString (PyExc_ValueError, + _("Search range is empty.")); + goto fail; + } + /* Watch for overflows. */ + else if (length > CORE_ADDR_MAX + || (start_addr + length - 1) < start_addr) + { + PyErr_SetString (PyExc_ValueError, + _("The search range is too large.")); + goto fail; } - else - return NULL; TRY_CATCH (except, RETURN_MASK_ALL) { @@ -695,16 +673,21 @@ infpy_search_memory (PyObject *self, PyObject *args, PyObject *kw) buffer, pattern_size, &found_addr); } - GDB_PY_HANDLE_EXCEPTION (except); - #ifdef IS_PY3K PyBuffer_Release (&pybuf); #endif + GDB_PY_HANDLE_EXCEPTION (except); if (found) return PyLong_FromLong (found_addr); else Py_RETURN_NONE; + + fail: +#ifdef IS_PY3K + PyBuffer_Release (&pybuf); +#endif + return NULL; } /* Implementation of gdb.Inferior.is_valid (self) -> Boolean. diff --git a/gdb/python/py-utils.c b/gdb/python/py-utils.c index 9188e3883ac..eac161f2b48 100644 --- a/gdb/python/py-utils.c +++ b/gdb/python/py-utils.c @@ -313,39 +313,46 @@ gdbpy_convert_exception (struct gdb_exception exception) /* Converts OBJ to a CORE_ADDR value. - Returns 1 on success or 0 on failure, with a Python exception set. This - function can also throw GDB exceptions. + Returns 0 on success or -1 on failure, with a Python exception set. */ int get_addr_from_python (PyObject *obj, CORE_ADDR *addr) { if (gdbpy_is_value_object (obj)) - *addr = value_as_address (value_object_to_value (obj)); + { + volatile struct gdb_exception except; + + TRY_CATCH (except, RETURN_MASK_ALL) + { + *addr = value_as_address (value_object_to_value (obj)); + } + GDB_PY_SET_HANDLE_EXCEPTION (except); + } else { PyObject *num = PyNumber_Long (obj); gdb_py_ulongest val; if (num == NULL) - return 0; + return -1; val = gdb_py_long_as_ulongest (num); Py_XDECREF (num); if (PyErr_Occurred ()) - return 0; + return -1; if (sizeof (val) > sizeof (CORE_ADDR) && ((CORE_ADDR) val) != val) { PyErr_SetString (PyExc_ValueError, _("Overflow converting to address.")); - return 0; + return -1; } *addr = val; } - return 1; + return 0; } /* Convert a LONGEST to the appropriate Python object -- either an diff --git a/gdb/python/python-internal.h b/gdb/python/python-internal.h index 2e090963baf..29c22f7dd39 100644 --- a/gdb/python/python-internal.h +++ b/gdb/python/python-internal.h @@ -433,7 +433,8 @@ extern PyObject *gdbpy_gdberror_exc; extern void gdbpy_convert_exception (struct gdb_exception) CPYCHECKER_SETS_EXCEPTION; -int get_addr_from_python (PyObject *obj, CORE_ADDR *addr); +int get_addr_from_python (PyObject *obj, CORE_ADDR *addr) + CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION; PyObject *gdb_py_object_from_longest (LONGEST l); PyObject *gdb_py_object_from_ulongest (ULONGEST l);