protect access to the gnu warning map with a mutex to avoid random crashes
authorrobert <robert@openbsd.org>
Mon, 4 Dec 2023 14:24:29 +0000 (14:24 +0000)
committerrobert <robert@openbsd.org>
Mon, 4 Dec 2023 14:24:29 +0000 (14:24 +0000)
discussed with, tested by and ok tb@

gnu/llvm/lld/ELF/InputFiles.cpp
gnu/llvm/lld/ELF/Relocations.cpp

index 05fc619..e7c94b8 100644 (file)
@@ -67,7 +67,9 @@ std::string lld::toString(const InputFile *f) {
 
 // .gnu.warning.SYMBOL are treated as warning symbols for the given symbol
 void lld::parseGNUWarning(StringRef name, ArrayRef<char> data, size_t size) {
+  static std::mutex mu;
   if (!name.empty() && name.startswith(".gnu.warning.")) {
+    std::lock_guard<std::mutex> lock(mu);
     StringRef wsym = name.substr(13);
     StringRef s(data.begin());
     StringRef wng(s.substr(0, size));
index 3c9e7e4..9bdbad2 100644 (file)
@@ -792,6 +792,7 @@ void elf::reportUndefinedSymbols() {
 
 static void reportGNUWarning(Symbol &sym, InputSectionBase &sec,
                                  uint64_t offset) {
+  std::lock_guard<std::mutex> lock(relocMutex);
   if (sym.gwarn) {
     StringRef gnuWarning = gnuWarnings.lookup(sym.getName());
     // report first occurance only