[Lldb-commits] [PATCH] D91012: [llvm] [Support] Fix segv if argv0 is null in getMainExecutable()

Michał Górny via Phabricator via lldb-commits lldb-commits at lists.llvm.org
Mon Nov 9 00:48:00 PST 2020

mgorny added a comment.

In D91012#2381884 <https://reviews.llvm.org/D91012#2381884>, @labath wrote:

> Are you sure that's the right level at which to fix this? Can you explain how that particular test manages to pass a nullptr to this function?

I'm not. However, it's a smaller change that checking it before every one of the three `getprogpath()` calls.

`getMainExecutable()` is passed `argv0=nullptr`. Other platforms probably don't hit this because their primary code succeeds, while the code for FreeBSD < 13 apparently doesn't here. Hence, `getprogname()` is called with `nullptr` argument.

  (lldb) bt
  * thread #1, name = 'python3.7', stop reason = signal SIGSEGV: invalid address (fault address: 0x0)
    * frame #0: 0x00000008086c48ff libLLVMSupport.so.12git`llvm::sys::fs::getMainExecutable(char const*, void*) + 80
      frame #1: 0x00000008086c96e8 libLLVMSupport.so.12git`printSymbolizedStackTrace(llvm::StringRef, void**, int, llvm::raw_ostream&) + 485
      frame #2: 0x00000008086ca91e libLLVMSupport.so.12git`llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) + 96
      frame #3: 0x0000000802b24b34 _lldb.so`lldb_private::Log::WriteHeader(llvm::raw_ostream&, llvm::StringRef, llvm::StringRef) + 718
      frame #4: 0x0000000802b2472b _lldb.so`lldb_private::Log::VAPrintf(char const*, __va_list_tag*) + 165
      frame #5: 0x0000000802b245a9 _lldb.so`lldb_private::Log::Printf(char const*, ...) + 107
      frame #6: 0x0000000802a41f55 _lldb.so`lldb_private::CommandInterpreter::HandleCommand(char const*, lldb_private::LazyBool, lldb_private::CommandReturnObject&, lldb_private::ExecutionContext*, bool, bool) + 127
      frame #7: 0x000000080270575d _lldb.so`lldb::SBCommandInterpreter::HandleCommand(char const*, lldb::SBExecutionContext&, lldb::SBCommandReturnObject&, bool) + 389
      frame #8: 0x00000008027053e6 _lldb.so`lldb::SBCommandInterpreter::HandleCommand(char const*, lldb::SBCommandReturnObject&, bool) + 216
      frame #9: 0x00000008029172ca _lldb.so`_wrap_SBCommandInterpreter_HandleCommand(_object*, _object*) + 2069
      frame #10: 0x000000080036a3d7 libpython3.7m.so.1.0`PyCFunction_Call + 327

(the rest of the backtrace is Python)

`llvm::sys::PrintStackTrace()` calls `printSymbolizedStackTrace(Argv0, ...)`, and the global static variable `Argv0` is only set by `llvm::sys::PrintStackTraceOnErrorSignal()` which is not being called here.



More information about the lldb-commits mailing list