Skip to content

Commit 3cf10f3

Browse files
committed
[asan] reallocate error_message_buffer when size is not enough
1 parent 487b92f commit 3cf10f3

File tree

3 files changed

+23
-13
lines changed

3 files changed

+23
-13
lines changed

compiler-rt/lib/asan/asan_report.cpp

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ namespace __asan {
3434
static void (*error_report_callback)(const char*);
3535
static char *error_message_buffer = nullptr;
3636
static uptr error_message_buffer_pos = 0;
37+
static uptr error_message_buffer_size = kErrorMessageBufferSize;
3738
static Mutex error_message_buf_mutex;
3839
static const unsigned kAsanBuggyPcPoolSize = 25;
3940
static __sanitizer::atomic_uintptr_t AsanBuggyPcPool[kAsanBuggyPcPoolSize];
@@ -42,17 +43,23 @@ void AppendToErrorMessageBuffer(const char *buffer) {
4243
Lock l(&error_message_buf_mutex);
4344
if (!error_message_buffer) {
4445
error_message_buffer =
45-
(char*)MmapOrDieQuietly(kErrorMessageBufferSize, __func__);
46+
(char *)MmapOrDieQuietly(error_message_buffer_size, __func__);
4647
error_message_buffer_pos = 0;
4748
}
4849
uptr length = internal_strlen(buffer);
49-
RAW_CHECK(kErrorMessageBufferSize >= error_message_buffer_pos);
50-
uptr remaining = kErrorMessageBufferSize - error_message_buffer_pos;
51-
internal_strncpy(error_message_buffer + error_message_buffer_pos,
52-
buffer, remaining);
53-
error_message_buffer[kErrorMessageBufferSize - 1] = '\0';
54-
// FIXME: reallocate the buffer instead of truncating the message.
55-
error_message_buffer_pos += Min(remaining, length);
50+
if (error_message_buffer_pos + length + 1 > error_message_buffer_size) {
51+
uptr new_size = RoundUpToPowerOfTwo(error_message_buffer_size + length + 1);
52+
RAW_CHECK(new_size > error_message_buffer_size);
53+
char *new_buffer = (char *)MmapOrDieQuietly(new_size, __func__);
54+
internal_memcpy(new_buffer, error_message_buffer,
55+
error_message_buffer_size);
56+
UnmapOrDieQuietly(error_message_buffer, error_message_buffer_size);
57+
error_message_buffer = new_buffer;
58+
error_message_buffer_size = new_size;
59+
}
60+
internal_strncpy(error_message_buffer + error_message_buffer_pos, buffer,
61+
length + 1);
62+
error_message_buffer_pos += length;
5663
}
5764

5865
// ---------------------- Helper functions ----------------------- {{{1

compiler-rt/lib/sanitizer_common/sanitizer_common.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,10 @@ void *MmapOrDie(uptr size, const char *mem_type, bool raw_report = false);
9494
inline void *MmapOrDieQuietly(uptr size, const char *mem_type) {
9595
return MmapOrDie(size, mem_type, /*raw_report*/ true);
9696
}
97-
void UnmapOrDie(void *addr, uptr size);
97+
void UnmapOrDie(void *addr, uptr size, bool raw_report = false);
98+
inline void UnmapOrDieQuietly(void *addr, uptr size) {
99+
UnmapOrDie(addr, size, /*raw_report*/ true);
100+
}
98101
// Behaves just like MmapOrDie, but tolerates out of memory condition, in that
99102
// case returns nullptr.
100103
void *MmapOrDieOnFatalError(uptr size, const char *mem_type);

compiler-rt/lib/sanitizer_common/sanitizer_posix.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,12 @@ void *MmapOrDie(uptr size, const char *mem_type, bool raw_report) {
5454
return (void *)res;
5555
}
5656

57-
void UnmapOrDie(void *addr, uptr size) {
57+
void UnmapOrDie(void *addr, uptr size, bool raw_report) {
5858
if (!addr || !size) return;
5959
uptr res = internal_munmap(addr, size);
6060
int reserrno;
6161
if (UNLIKELY(internal_iserror(res, &reserrno)))
62-
ReportMunmapFailureAndDie(addr, size, reserrno);
62+
ReportMunmapFailureAndDie(addr, size, reserrno, raw_report);
6363
DecreaseTotalMmap(size);
6464
}
6565

@@ -85,8 +85,8 @@ void *MmapAlignedOrDieOnFatalError(uptr size, uptr alignment,
8585
CHECK(IsPowerOfTwo(size));
8686
CHECK(IsPowerOfTwo(alignment));
8787
uptr map_size = size + alignment;
88-
// mmap maps entire pages and rounds up map_size needs to be a an integral
89-
// number of pages.
88+
// mmap maps entire pages and rounds up map_size needs to be a an integral
89+
// number of pages.
9090
// We need to be aware of this size for calculating end and for unmapping
9191
// fragments before and after the alignment region.
9292
map_size = RoundUpTo(map_size, GetPageSizeCached());

0 commit comments

Comments
 (0)