This is the mail archive of the gdb-cvs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] Fix PR python/19438, PR python/18393 - initialize dictionaries


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=0f6ed0e0efe2c4dcd35b0e483dc3b5da7fe4edf0

commit 0f6ed0e0efe2c4dcd35b0e483dc3b5da7fe4edf0
Author: Tom Tromey <tom@tromey.com>
Date:   Wed May 18 21:19:17 2016 -0600

    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  <tom@tromey.com>
    
    	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  <tom@tromey.com>
    
    	PR python/19438, PR python/18393:
    	* gdb.python/py-progspace.exp: Add "dir" test.
    	* gdb.python/py-objfile.exp: Add "dir" test.

Diff:
---
 gdb/ChangeLog                             | 6 ++++++
 gdb/python/py-objfile.c                   | 5 ++++-
 gdb/python/py-progspace.c                 | 5 ++++-
 gdb/testsuite/ChangeLog                   | 6 ++++++
 gdb/testsuite/gdb.python/py-objfile.exp   | 2 ++
 gdb/testsuite/gdb.python/py-progspace.exp | 2 ++
 6 files changed, 24 insertions(+), 2 deletions(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 9239665..07bc5d2 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,9 @@
+2016-05-23  Tom Tromey  <tom@tromey.com>
+
+	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  <gbenson@redhat.com>
 
 	* 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 cd26c5b..82df4b2 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 e1258c7..6fc53cb 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 2aadae0..1f0e3f9 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2016-05-23  Tom Tromey  <tom@tromey.com>
+
+	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  <yao.qi@linaro.org>
 
 	* 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 1bbb4cf..62ca309 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 5c1db1c..396d0f2 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.Progspace object at $hex>\\\]"
 
+gdb_test_no_output "python dir(gdb.current_progspace())"
+
 gdb_load ${binfile}
 
 gdb_py_test_silent_cmd "python progspace = gdb.current_progspace()" \


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]