2013-08-30 Phil Muldoon <pmuldoon@redhat.com>
authorPhil Muldoon <pmuldoon@redhat.com>
Fri, 30 Aug 2013 10:12:19 +0000 (10:12 +0000)
committerPhil Muldoon <pmuldoon@redhat.com>
Fri, 30 Aug 2013 10:12:19 +0000 (10:12 +0000)
PR python/15461

* python/py-arch.c (ARCHPY_REQUIRE_VALID): New macro.
(archpy_name): Check for valid architecture.
(archpy_disassemble): Ditto.

2013-08-30  Phil Muldoon  <pmuldoon@redhat.com>

* gdb.python/py-arch.exp: Tests for invalid architecture.

gdb/ChangeLog
gdb/python/py-arch.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.python/py-arch.exp

index f676c3f3eaad4221e2b6a23045d167a9d1a240b1..a03e72ce8160fd1eb6594986598c0f3923a43314 100644 (file)
@@ -1,3 +1,11 @@
+2013-08-30  Phil Muldoon  <pmuldoon@redhat.com>
+
+       PR python/15461
+
+       * python/py-arch.c (ARCHPY_REQUIRE_VALID): New macro.
+       (archpy_name): Check for valid architecture.
+       (archpy_disassemble): Ditto.
+
 2013-08-29  Joel Brobecker  <brobecker@adacore.com>
 
        * rs6000-nat.c (rs6000_ptrace32): Cast "addr" to "uintptr_t"
index 7098a8ab5b8949aebb3767a666a489ce4ec861e0..a31ffdd9ed8d269096d083e442aab784245cc5bd 100644 (file)
@@ -30,6 +30,18 @@ typedef struct arch_object_type_object {
 
 static struct gdbarch_data *arch_object_data = NULL;
 
+/* Require a valid Architecture.  */
+#define ARCHPY_REQUIRE_VALID(arch_obj, arch)                   \
+  do {                                                         \
+    arch = arch_object_to_gdbarch (arch_obj);                  \
+    if (arch == NULL)                                          \
+      {                                                                \
+       PyErr_SetString (PyExc_RuntimeError,                    \
+                        _("Architecture is invalid."));        \
+       return NULL;                                            \
+      }                                                                \
+  } while (0)
+
 static PyTypeObject arch_object_type
     CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("arch_object");
 
@@ -82,9 +94,14 @@ gdbarch_to_arch_object (struct gdbarch *gdbarch)
 static PyObject *
 archpy_name (PyObject *self, PyObject *args)
 {
-  struct gdbarch *gdbarch = arch_object_to_gdbarch (self);
-  const char *name = (gdbarch_bfd_arch_info (gdbarch))->printable_name;
-  PyObject *py_name = PyString_FromString (name);
+  struct gdbarch *gdbarch = NULL;
+  const char *name;
+  PyObject *py_name;
+
+  ARCHPY_REQUIRE_VALID (self, gdbarch);
+
+  name = (gdbarch_bfd_arch_info (gdbarch))->printable_name;
+  py_name = PyString_FromString (name);
 
   return py_name;
 }
@@ -104,7 +121,9 @@ archpy_disassemble (PyObject *self, PyObject *args, PyObject *kw)
   gdb_py_ulongest start_temp;
   long count = 0, i;
   PyObject *result_list, *end_obj = NULL, *count_obj = NULL;
-  struct gdbarch *gdbarch = arch_object_to_gdbarch (self);
+  struct gdbarch *gdbarch = NULL;
+
+  ARCHPY_REQUIRE_VALID (self, gdbarch);
 
   if (!PyArg_ParseTupleAndKeywords (args, kw, GDB_PY_LLU_ARG "|OO", keywords,
                                     &start_temp, &end_obj, &count_obj))
index 3b259c7cd4d6217aa9d932fef3688ec75116cd3f..67dc81367b829ed07603e9a9e200823c31a5ba38 100644 (file)
@@ -1,3 +1,7 @@
+2013-08-30  Phil Muldoon  <pmuldoon@redhat.com>
+
+       * gdb.python/py-arch.exp: Tests for invalid architecture.
+
 2013-08-29  Sterling Augustine  <saugustine@google.com>
 
        * boards/remote-stdio-gdbserver.exp: Set rcp_prog and
index 7413b44096ad1968f9e79ec1f56bdb782469bebe..174b151c1cd1eba7de60c6070906e85a1cb7139f 100644 (file)
@@ -26,6 +26,14 @@ if ![runto_main] {
    return -1
 }
 
+# Test python/15461.  Invalid architectures should not trigger an
+# internal GDB assert.
+gdb_py_test_silent_cmd "python empty = gdb.Architecture()" "get empty arch" 0
+gdb_test "python print(empty.name())" ".*Architecture is invalid.*" \
+    "Test empty architecture.name does not trigger an assert"
+gdb_test "python print(empty.disassemble())" ".*Architecture is invalid.*" \
+    "Test empty architecture.disassemble does not trigger an assert"
+
 gdb_py_test_silent_cmd "python frame = gdb.selected_frame()" "get frame" 0
 gdb_py_test_silent_cmd "python arch = frame.architecture()" "get arch" 0
 gdb_py_test_silent_cmd "python pc = frame.pc()" "get pc" 0