From d055e3a0eb4e957159b075c0937a960beb75c975 Mon Sep 17 00:00:00 2001 From: Pedro Tammela Date: Fri, 27 Nov 2020 22:29:56 +0000 Subject: [PATCH] [LLDB/Python] Fix segfault on Python scripted entrypoints The code that gets the ScriptInterpreter was not considering the case that it receives a Lua interpreter. Differential Revision: https://reviews.llvm.org/D92249 --- .../Python/ScriptInterpreterPython.cpp | 37 ++++++++++--------- .../Python/scripted_breakpoint_lua.test | 8 ++++ 2 files changed, 27 insertions(+), 18 deletions(-) create mode 100644 lldb/test/Shell/ScriptInterpreter/Python/scripted_breakpoint_lua.test diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp b/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp index e5802ad041e4..0d13884e8089 100644 --- a/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp +++ b/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp @@ -7,6 +7,7 @@ //===----------------------------------------------------------------------===// #include "lldb/Host/Config.h" +#include "lldb/lldb-enumerations.h" #if LLDB_ENABLE_PYTHON @@ -214,6 +215,12 @@ extern "C" void * LLDBSWIGPython_GetDynamicSetting(void *module, const char *setting, const lldb::TargetSP &target_sp); +static ScriptInterpreterPythonImpl *GetPythonInterpreter(Debugger &debugger) { + ScriptInterpreter *script_interpreter = + debugger.GetScriptInterpreter(true, lldb::eScriptLanguagePython); + return static_cast(script_interpreter); +} + static bool g_initialized = false; namespace { @@ -1825,11 +1832,10 @@ StructuredData::ObjectSP ScriptInterpreterPythonImpl::CreateScriptedThreadPlan( return {}; Debugger &debugger = thread_plan_sp->GetTarget().GetDebugger(); - ScriptInterpreter *script_interpreter = debugger.GetScriptInterpreter(); ScriptInterpreterPythonImpl *python_interpreter = - static_cast(script_interpreter); + GetPythonInterpreter(debugger); - if (!script_interpreter) + if (!python_interpreter) return {}; void *ret_val; @@ -1929,11 +1935,10 @@ ScriptInterpreterPythonImpl::CreateScriptedBreakpointResolver( return StructuredData::GenericSP(); Debugger &debugger = bkpt_sp->GetTarget().GetDebugger(); - ScriptInterpreter *script_interpreter = debugger.GetScriptInterpreter(); ScriptInterpreterPythonImpl *python_interpreter = - static_cast(script_interpreter); + GetPythonInterpreter(debugger); - if (!script_interpreter) + if (!python_interpreter) return StructuredData::GenericSP(); void *ret_val; @@ -2003,11 +2008,10 @@ StructuredData::GenericSP ScriptInterpreterPythonImpl::CreateScriptedStopHook( return StructuredData::GenericSP(); } - ScriptInterpreter *script_interpreter = m_debugger.GetScriptInterpreter(); ScriptInterpreterPythonImpl *python_interpreter = - static_cast(script_interpreter); + GetPythonInterpreter(m_debugger); - if (!script_interpreter) { + if (!python_interpreter) { error.SetErrorString("No script interpreter for scripted stop-hook."); return StructuredData::GenericSP(); } @@ -2103,11 +2107,10 @@ ScriptInterpreterPythonImpl::CreateSyntheticScriptedProvider( return StructuredData::ObjectSP(); Debugger &debugger = target->GetDebugger(); - ScriptInterpreter *script_interpreter = debugger.GetScriptInterpreter(); ScriptInterpreterPythonImpl *python_interpreter = - (ScriptInterpreterPythonImpl *)script_interpreter; + GetPythonInterpreter(debugger); - if (!script_interpreter) + if (!python_interpreter) return StructuredData::ObjectSP(); void *ret_val = nullptr; @@ -2274,11 +2277,10 @@ bool ScriptInterpreterPythonImpl::BreakpointCallbackFunction( return true; Debugger &debugger = target->GetDebugger(); - ScriptInterpreter *script_interpreter = debugger.GetScriptInterpreter(); ScriptInterpreterPythonImpl *python_interpreter = - (ScriptInterpreterPythonImpl *)script_interpreter; + GetPythonInterpreter(debugger); - if (!script_interpreter) + if (!python_interpreter) return true; if (python_function_name && python_function_name[0]) { @@ -2340,11 +2342,10 @@ bool ScriptInterpreterPythonImpl::WatchpointCallbackFunction( return true; Debugger &debugger = target->GetDebugger(); - ScriptInterpreter *script_interpreter = debugger.GetScriptInterpreter(); ScriptInterpreterPythonImpl *python_interpreter = - (ScriptInterpreterPythonImpl *)script_interpreter; + GetPythonInterpreter(debugger); - if (!script_interpreter) + if (!python_interpreter) return true; if (python_function_name && python_function_name[0]) { diff --git a/lldb/test/Shell/ScriptInterpreter/Python/scripted_breakpoint_lua.test b/lldb/test/Shell/ScriptInterpreter/Python/scripted_breakpoint_lua.test new file mode 100644 index 000000000000..c86ae9057c50 --- /dev/null +++ b/lldb/test/Shell/ScriptInterpreter/Python/scripted_breakpoint_lua.test @@ -0,0 +1,8 @@ +# REQUIRES: python +# UNSUPPORTED: lldb-repro +# +# RUN: cat %s | %lldb --script-language lua 2>&1 | FileCheck %s +b main +breakpoint command add -s python -o 'print(frame); return False' +run +# CHECK: frame #0