[LLVM][Support] check for error return from dladdr. (#138369) In case of an error, the DL_info struct may have been left uninitialized, so it is not safe to use its members. In one error case, initialize dli_sname to nullptr explicitly, so that the later check against nullptr is guaranteed to be safe.
diff --git a/llvm/lib/Support/Unix/Signals.inc b/llvm/lib/Support/Unix/Signals.inc index 691e101..6668a29 100644 --- a/llvm/lib/Support/Unix/Signals.inc +++ b/llvm/lib/Support/Unix/Signals.inc
@@ -826,14 +826,17 @@ int width = 0; for (int i = 0; i < depth; ++i) { Dl_info dlinfo; - dladdr(StackTrace[i], &dlinfo); - const char *name = strrchr(dlinfo.dli_fname, '/'); - int nwidth; - if (!name) - nwidth = strlen(dlinfo.dli_fname); - else - nwidth = strlen(name) - 1; + if (dladdr(StackTrace[i], &dlinfo) == 0) { + nwidth = 7; // "(error)" + } else { + const char *name = strrchr(dlinfo.dli_fname, '/'); + + if (!name) + nwidth = strlen(dlinfo.dli_fname); + else + nwidth = strlen(name) - 1; + } if (nwidth > width) width = nwidth; @@ -841,15 +844,20 @@ for (int i = 0; i < depth; ++i) { Dl_info dlinfo; - dladdr(StackTrace[i], &dlinfo); OS << format("%-2d", i); - const char *name = strrchr(dlinfo.dli_fname, '/'); - if (!name) - OS << format(" %-*s", width, static_cast<const char *>(dlinfo.dli_fname)); - else - OS << format(" %-*s", width, name + 1); + if (dladdr(StackTrace[i], &dlinfo) == 0) { + OS << format(" %-*s", width, static_cast<const char *>("(error)")); + dlinfo.dli_sname = nullptr; + } else { + const char *name = strrchr(dlinfo.dli_fname, '/'); + if (!name) + OS << format(" %-*s", width, + static_cast<const char *>(dlinfo.dli_fname)); + else + OS << format(" %-*s", width, name + 1); + } OS << format(" %#0*lx", (int)(sizeof(void *) * 2) + 2, (unsigned long)StackTrace[i]);