From: Tom Tromey Date: Thu, 19 May 2016 03:19:17 +0000 (-0600) Subject: Fix PR python/19438, PR python/18393 - initialize dictionaries X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=0f6ed0e0efe2c4dcd35b0e483dc3b5da7fe4edf0;p=binutils-gdb.git Fix PR python/19438, PR python/18393 - initialize dictionaries This fixes PR python/19438 and PR python/18393. Both bugs are about invoking dir() on some Python object implemented by gdb, and getting a crash. The crash happens because the dictionary field of these objects was not initialized. Apparently what happens is that this field can be lazily initialized by Python when assigning to an attribute; and it can also be handled ok when using dir() but without __dict__ defined; but gdb defines __dict__ because this isn't supplied automatically by Python. The docs on this seem rather sparse, but this patch works ok. An alternative might be to lazily create the dictionary in gdb_py_generic_dict, but I went with this approach because it seemed more straightforward. Built and regtested on x86-64 Fedora 23. 2016-05-23 Tom Tromey PR python/19438, PR python/18393: * python/py-objfile.c (objfpy_initialize): Initialize self->dict. * python/py-progspace.c (pspy_initialize): Initialize self->dict. 2016-05-23 Tom Tromey PR python/19438, PR python/18393: * gdb.python/py-progspace.exp: Add "dir" test. * gdb.python/py-objfile.exp: Add "dir" test. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 9239665feab..07bc5d20dc1 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2016-05-23 Tom Tromey + + PR python/19438, PR python/18393: + * python/py-objfile.c (objfpy_initialize): Initialize self->dict. + * python/py-progspace.c (pspy_initialize): Initialize self->dict. + 2016-05-23 Gary Benson * nat/gdb_thread_db.h (td_thr_validate_ftype): Remove typedef. diff --git a/gdb/python/py-objfile.c b/gdb/python/py-objfile.c index cd26c5b49cd..82df4b20199 100644 --- a/gdb/python/py-objfile.c +++ b/gdb/python/py-objfile.c @@ -196,7 +196,10 @@ static int objfpy_initialize (objfile_object *self) { self->objfile = NULL; - self->dict = NULL; + + self->dict = PyDict_New (); + if (self->dict == NULL) + return 0; self->printers = PyList_New (0); if (self->printers == NULL) diff --git a/gdb/python/py-progspace.c b/gdb/python/py-progspace.c index e1258c76254..6fc53cb95d3 100644 --- a/gdb/python/py-progspace.c +++ b/gdb/python/py-progspace.c @@ -97,7 +97,10 @@ static int pspy_initialize (pspace_object *self) { self->pspace = NULL; - self->dict = NULL; + + self->dict = PyDict_New (); + if (self->dict == NULL) + return 0; self->printers = PyList_New (0); if (self->printers == NULL) diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 2aadae090ae..1f0e3f99f59 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2016-05-23 Tom Tromey + + PR python/19438, PR python/18393: + * gdb.python/py-progspace.exp: Add "dir" test. + * gdb.python/py-objfile.exp: Add "dir" test. + 2016-05-23 Yao Qi * gdb.arch/thumb-prologue.exp: Use standard_testfile. diff --git a/gdb/testsuite/gdb.python/py-objfile.exp b/gdb/testsuite/gdb.python/py-objfile.exp index 1bbb4cf20ba..62ca3091983 100644 --- a/gdb/testsuite/gdb.python/py-objfile.exp +++ b/gdb/testsuite/gdb.python/py-objfile.exp @@ -45,6 +45,8 @@ gdb_test "python print (objfile.filename)" "${testfile}" \ gdb_test "python print (objfile.username)" "${testfile}" \ "Get objfile user name" +gdb_test_no_output "python dir(objfile)" + gdb_test "python print (gdb.lookup_objfile (\"${testfile}\").filename)" \ "${testfile}" "print lookup_objfile filename" gdb_test "python print (gdb.lookup_objfile (\"junk\"))" \ diff --git a/gdb/testsuite/gdb.python/py-progspace.exp b/gdb/testsuite/gdb.python/py-progspace.exp index 5c1db1c645d..396d0f2957c 100644 --- a/gdb/testsuite/gdb.python/py-progspace.exp +++ b/gdb/testsuite/gdb.python/py-progspace.exp @@ -37,6 +37,8 @@ gdb_test "python print (gdb.current_progspace().filename)" "None" \ "current progspace filename (None)" gdb_test "python print (gdb.progspaces())" "\\\[\\\]" +gdb_test_no_output "python dir(gdb.current_progspace())" + gdb_load ${binfile} gdb_py_test_silent_cmd "python progspace = gdb.current_progspace()" \