From 1d9cb8a1844baa3ca3a8912a667364726cf3931e Mon Sep 17 00:00:00 2001 From: Johnny Chen Date: Wed, 14 Dec 2011 20:40:27 +0000 Subject: [PATCH] http://llvm.org/bugs/show_bug.cgi?id=11569 LLDBSwigPythonCallCommand crashes when a command script returns an object Add more robustness to LLDBSwigPythonCallCommand. It should check whether the returned Python object is a string, and only assign it as the error msg when the check holds. Also add a regression test. llvm-svn: 146584 --- lldb/scripts/Python/python-wrapper.swig | 6 ++++-- .../functionalities/command_script/TestCommandScript.py | 7 +++++++ lldb/test/functionalities/command_script/bug11569.py | 7 +++++++ lldb/test/functionalities/command_script/py_import | 1 + 4 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 lldb/test/functionalities/command_script/bug11569.py diff --git a/lldb/scripts/Python/python-wrapper.swig b/lldb/scripts/Python/python-wrapper.swig index d68c1b9260cd..787074e7fcb8 100644 --- a/lldb/scripts/Python/python-wrapper.swig +++ b/lldb/scripts/Python/python-wrapper.swig @@ -645,9 +645,11 @@ LLDBSwigPythonCallCommand err_msg.clear(); retval = true; } - else // return value is an error string + else { - err_msg.assign(PyString_AsString(pvalue)); + // return value is an error string + if (PyString_CheckExact(pvalue)) + err_msg.assign(PyString_AsString(pvalue)); retval = false; } Py_DECREF (pvalue); diff --git a/lldb/test/functionalities/command_script/TestCommandScript.py b/lldb/test/functionalities/command_script/TestCommandScript.py index c381e4985a9e..bc20285b8722 100644 --- a/lldb/test/functionalities/command_script/TestCommandScript.py +++ b/lldb/test/functionalities/command_script/TestCommandScript.py @@ -37,6 +37,7 @@ class CmdPythonTestCase(TestBase): self.runCmd('command script delete tell_sync', check=False) self.runCmd('command script delete tell_async', check=False) self.runCmd('command script delete tell_curr', check=False) + self.runCmd('command script delete bug11569', check=False) # Execute the cleanup function during test case tear down. self.addTearDownHook(cleanup) @@ -115,6 +116,12 @@ class CmdPythonTestCase(TestBase): self.expect('command script add -f foobar frame', error=True, substrs = ['cannot add command']) + # http://llvm.org/bugs/show_bug.cgi?id=11569 + # LLDBSwigPythonCallCommand crashes when a command script returns an object + self.runCmd('command script add -f bug11569 bug11569') + # This should not crash. + self.runCmd('bug11569', check=False) + if __name__ == '__main__': import atexit lldb.SBDebugger.Initialize() diff --git a/lldb/test/functionalities/command_script/bug11569.py b/lldb/test/functionalities/command_script/bug11569.py new file mode 100644 index 000000000000..93897d88098f --- /dev/null +++ b/lldb/test/functionalities/command_script/bug11569.py @@ -0,0 +1,7 @@ +def bug11569(debugger, args, result, dict): + """ + http://llvm.org/bugs/show_bug.cgi?id=11569 + LLDBSwigPythonCallCommand crashes when a command script returns an object. + """ + return ["return", "a", "non-string", "should", "not", "crash", "LLDB"]; + diff --git a/lldb/test/functionalities/command_script/py_import b/lldb/test/functionalities/command_script/py_import index 0ce2d79ba4ec..8cb112d884d9 100644 --- a/lldb/test/functionalities/command_script/py_import +++ b/lldb/test/functionalities/command_script/py_import @@ -1,6 +1,7 @@ script import sys, os script sys.path.append(os.path.join(os.getcwd(), os.pardir)) script import welcome +script import bug11569 command script add welcome --function welcome.welcome_impl command script add targetname --function welcome.target_name_impl command script add longwait --function welcome.print_wait_impl