Check for negative argument in Type.template_argument
authorTom Tromey <tom@tromey.com>
Sat, 15 Sep 2018 06:29:20 +0000 (00:29 -0600)
committerTom Tromey <tom@tromey.com>
Mon, 24 Sep 2018 05:15:12 +0000 (23:15 -0600)
typy_template_argument did not check if the template argument was
non-negative.  A negative value could cause a gdb crash.

2018-09-23  Tom Tromey  <tom@tromey.com>

PR python/17284:
* python/py-type.c (typy_template_argument): Check for negative
argument number.

gdb/testsuite/ChangeLog
2018-09-23  Tom Tromey  <tom@tromey.com>

PR python/17284:
* gdb.python/py-template.exp (test_template_arg): Add test for
negative template argument number.

gdb/ChangeLog
gdb/python/py-type.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.python/py-template.exp

index 15ae55a..f887159 100644 (file)
@@ -1,5 +1,11 @@
 2018-09-23  Tom Tromey  <tom@tromey.com>
 
+       PR python/17284:
+       * python/py-type.c (typy_template_argument): Check for negative
+       argument number.
+
+2018-09-23  Tom Tromey  <tom@tromey.com>
+
        PR python/14062:
        * python/python.c (gdbpy_run_events): Do not ignore exceptions.
 
index c7cad2e..897ad93 100644 (file)
@@ -930,6 +930,13 @@ typy_template_argument (PyObject *self, PyObject *args)
   if (! PyArg_ParseTuple (args, "i|O", &argno, &block_obj))
     return NULL;
 
+  if (argno < 0)
+    {
+      PyErr_SetString (PyExc_RuntimeError,
+                      _("Template argument number must be non-negative"));
+      return NULL;
+    }
+
   if (block_obj)
     {
       block = block_object_to_block (block_obj);
index 131940b..4a624dd 100644 (file)
@@ -1,5 +1,11 @@
 2018-09-23  Tom Tromey  <tom@tromey.com>
 
+       PR python/17284:
+       * gdb.python/py-template.exp (test_template_arg): Add test for
+       negative template argument number.
+
+2018-09-23  Tom Tromey  <tom@tromey.com>
+
        PR python/14062:
        * gdb.python/python.exp: Add test for post_event error.
 
index 793e68d..96383a7 100644 (file)
@@ -54,6 +54,10 @@ proc test_template_arg {exefile type} {
     # Replace '*' with '\*' in regex.
     regsub -all {\*} $type {\*} t
     gdb_test "python print (foo.type.template_argument(0))" $t $type
+
+    gdb_test "python print(foo.type.template_argument(-1))" \
+       "Template argument number must be non-negative\r\nError while executing Python code." \
+       "negative template argument number"
 }
 
 test_template_arg "${binfile}-ci" "const int"