[PATCH] D44285: Fix computeSymbolSizes SEGFAULT on invalid file

Teng Qin via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Mar 8 19:32:18 PST 2018


palmtenor created this revision.
palmtenor added reviewers: dberris, kcc, dvyukov, rafael, aprantl.
Herald added a subscriber: llvm-commits.

We use `llvm-symbolizer` in some production systems, and we run it against all possibly related files, including some that are not ELF. We noticed that for some of those invalid files, `llvm-symbolizer` would crash with SEGFAULT. Here is an example of such a file <https://www.dropbox.com/s/i12t4sbvqozrlru/test_bad_file?dl=0>.

It is due to that in `computeSymbolSizes`, a loop uses condition

  for (unsigned I = 0, N = Addresses.size() - 1; I < N; ++I) {

where if `Addresses.size()` is 0, `N` would overflow and causing the loop to access invalid memory.

Instead of patching the loop conditions, the commit makes so that the function returns early if `Addresses` is empty.

Validated by checking that `llvm-symbolizer` no longer crashes.


Repository:
  rL LLVM

https://reviews.llvm.org/D44285

Files:
  lib/Object/SymbolSize.cpp


Index: lib/Object/SymbolSize.cpp
===================================================================
--- lib/Object/SymbolSize.cpp
+++ lib/Object/SymbolSize.cpp
@@ -66,6 +66,10 @@
     Addresses.push_back(
         {O.symbol_end(), Address + Size, 0, getSectionID(O, Sec)});
   }
+
+  if (Addresses.empty())
+    return Ret;
+
   array_pod_sort(Addresses.begin(), Addresses.end(), compareAddress);

   // Compute the size as the gap to the next symbol


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D44285.137688.patch
Type: text/x-patch
Size: 452 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180309/d0bb4305/attachment.bin>


More information about the llvm-commits mailing list