Skip to content

Commit aa18ae8

Browse files
committedApr 16, 2019
llvm-undname: Tweak arena allocator
- 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. Differential Revision: https://reviews.llvm.org/D60774 llvm-svn: 358489
1 parent 5961b02 commit aa18ae8

File tree

2 files changed

+19
-19
lines changed

2 files changed

+19
-19
lines changed
 

‎llvm/include/llvm/Demangle/MicrosoftDemangle.h

+16-19
Original file line numberDiff line numberDiff line change
@@ -55,24 +55,21 @@ class ArenaAllocator {
5555
}
5656
}
5757

58-
char *allocUnalignedBuffer(size_t Length) {
59-
uint8_t *Buf = Head->Buf + Head->Used;
60-
61-
Head->Used += Length;
62-
if (Head->Used > Head->Capacity) {
63-
// It's possible we need a buffer which is larger than our default unit
64-
// size, so we need to be careful to add a node with capacity that is at
65-
// least as large as what we need.
66-
addNode(std::max(AllocUnit, Length));
67-
Head->Used = Length;
68-
Buf = Head->Buf;
69-
}
58+
char *allocUnalignedBuffer(size_t Size) {
59+
assert(Head && Head->Buf);
60+
61+
uint8_t *P = Head->Buf + Head->Used;
62+
63+
Head->Used += Size;
64+
if (Head->Used <= Head->Capacity)
65+
return reinterpret_cast<char *>(P);
7066

71-
return reinterpret_cast<char *>(Buf);
67+
addNode(std::max(AllocUnit, Size));
68+
Head->Used = Size;
69+
return reinterpret_cast<char *>(Head->Buf);
7270
}
7371

7472
template <typename T, typename... Args> T *allocArray(size_t Count) {
75-
7673
size_t Size = Count * sizeof(T);
7774
assert(Head && Head->Buf);
7875

@@ -83,17 +80,16 @@ class ArenaAllocator {
8380
size_t Adjustment = AlignedP - P;
8481

8582
Head->Used += Size + Adjustment;
86-
if (Head->Used < Head->Capacity)
83+
if (Head->Used <= Head->Capacity)
8784
return new (PP) T[Count]();
8885

89-
addNode(AllocUnit);
86+
addNode(std::max(AllocUnit, Size));
9087
Head->Used = Size;
9188
return new (Head->Buf) T[Count]();
9289
}
9390

9491
template <typename T, typename... Args> T *alloc(Args &&... ConstructorArgs) {
95-
96-
size_t Size = sizeof(T);
92+
constexpr size_t Size = sizeof(T);
9793
assert(Head && Head->Buf);
9894

9995
size_t P = (size_t)Head->Buf + Head->Used;
@@ -103,9 +99,10 @@ class ArenaAllocator {
10399
size_t Adjustment = AlignedP - P;
104100

105101
Head->Used += Size + Adjustment;
106-
if (Head->Used < Head->Capacity)
102+
if (Head->Used <= Head->Capacity)
107103
return new (PP) T(std::forward<Args>(ConstructorArgs)...);
108104

105+
static_assert(Size < AllocUnit, "");
109106
addNode(AllocUnit);
110107
Head->Used = Size;
111108
return new (Head->Buf) T(std::forward<Args>(ConstructorArgs)...);

‎llvm/test/Demangle/ms-nested-scopes.test

+3
Original file line numberDiff line numberDiff line change
@@ -144,3 +144,6 @@
144144

145145
?A@?1??B@?$C@H@C@1310@QEAAHXZ@4HA
146146
; CHECK: int `public: int __cdecl A::B::C::B::C::C<int>::B(void)'::`2'::A
147+
148+
?a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@@3HA
149+
; 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

0 commit comments

Comments
 (0)
Please sign in to comment.