[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