[PATCH] D60774: llvm-undname: Tweak arena allocator

Nico Weber via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Apr 16 06:47:08 PDT 2019


thakis created this revision.
thakis added a reviewer: hans.
Herald added a project: LLVM.

- Make `allocUnalignedBuffer` look more like `allocArray` and `alloc`. No behavior change.
- Change `Head->Used < Head->Capacity` to `Head->Used <= Head->Capacity` in `allocArray` and `alloc`. No intended behavior change, might be a minuscule memory usage improvement. Noticed this since it was the logic used in `allocUnalignedBuffer`.
- Don't let `allocArray` alloc too small buffers for names that have more than 512 levels of nesting (in 64-bit builds). Fixes a heap buffer overflow found by oss-fuzz.


https://reviews.llvm.org/D60774

Files:
  llvm/include/llvm/Demangle/MicrosoftDemangle.h
  llvm/test/Demangle/ms-nested-scopes.test


Index: llvm/test/Demangle/ms-nested-scopes.test
===================================================================
--- llvm/test/Demangle/ms-nested-scopes.test
+++ llvm/test/Demangle/ms-nested-scopes.test
@@ -144,3 +144,6 @@
 
 ?A@?1??B@?$C at H@C at 1310@QEAAHXZ at 4HA
 ; CHECK: int `public: int __cdecl A::B::C::B::C::C<int>::B(void)'::`2'::A
+
+?a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a@@3HA
+; CHECK: int a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a
Index: llvm/include/llvm/Demangle/MicrosoftDemangle.h
===================================================================
--- llvm/include/llvm/Demangle/MicrosoftDemangle.h
+++ llvm/include/llvm/Demangle/MicrosoftDemangle.h
@@ -55,24 +55,21 @@
     }
   }
 
-  char *allocUnalignedBuffer(size_t Length) {
-    uint8_t *Buf = Head->Buf + Head->Used;
-
-    Head->Used += Length;
-    if (Head->Used > Head->Capacity) {
-      // It's possible we need a buffer which is larger than our default unit
-      // size, so we need to be careful to add a node with capacity that is at
-      // least as large as what we need.
-      addNode(std::max(AllocUnit, Length));
-      Head->Used = Length;
-      Buf = Head->Buf;
-    }
+  char *allocUnalignedBuffer(size_t Size) {
+    assert(Head && Head->Buf);
+
+    uint8_t *P = Head->Buf + Head->Used;
+
+    Head->Used += Size;
+    if (Head->Used <= Head->Capacity)
+      return reinterpret_cast<char *>(P);
 
-    return reinterpret_cast<char *>(Buf);
+    addNode(std::max(AllocUnit, Size));
+    Head->Used = Size;
+    return reinterpret_cast<char *>(Head->Buf);
   }
 
   template <typename T, typename... Args> T *allocArray(size_t Count) {
-
     size_t Size = Count * sizeof(T);
     assert(Head && Head->Buf);
 
@@ -83,17 +80,16 @@
     size_t Adjustment = AlignedP - P;
 
     Head->Used += Size + Adjustment;
-    if (Head->Used < Head->Capacity)
+    if (Head->Used <= Head->Capacity)
       return new (PP) T[Count]();
 
-    addNode(AllocUnit);
+    addNode(std::max(AllocUnit, Size));
     Head->Used = Size;
     return new (Head->Buf) T[Count]();
   }
 
   template <typename T, typename... Args> T *alloc(Args &&... ConstructorArgs) {
-
-    size_t Size = sizeof(T);
+    constexpr size_t Size = sizeof(T);
     assert(Head && Head->Buf);
 
     size_t P = (size_t)Head->Buf + Head->Used;
@@ -103,9 +99,10 @@
     size_t Adjustment = AlignedP - P;
 
     Head->Used += Size + Adjustment;
-    if (Head->Used < Head->Capacity)
+    if (Head->Used <= Head->Capacity)
       return new (PP) T(std::forward<Args>(ConstructorArgs)...);
 
+    static_assert(Size < AllocUnit, "");
     addNode(AllocUnit);
     Head->Used = Size;
     return new (Head->Buf) T(std::forward<Args>(ConstructorArgs)...);


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D60774.195368.patch
Type: text/x-patch
Size: 5183 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190416/3cc04697/attachment-0001.bin>


More information about the llvm-commits mailing list