@@ -32,8 +32,7 @@ namespace __asan {
32
32
33
33
// -------------------- User-specified callbacks ----------------- {{{1
34
34
static void (*error_report_callback)(const char *);
35
- static char *error_message_buffer = nullptr ;
36
- static uptr error_message_buffer_pos = 0 ;
35
+ static InternalMmapVector<char > *error_message_buffer = nullptr ;
37
36
static Mutex error_message_buf_mutex;
38
37
static const unsigned kAsanBuggyPcPoolSize = 25 ;
39
38
static __sanitizer::atomic_uintptr_t AsanBuggyPcPool[kAsanBuggyPcPoolSize ];
@@ -42,17 +41,15 @@ void AppendToErrorMessageBuffer(const char *buffer) {
42
41
Lock l (&error_message_buf_mutex);
43
42
if (!error_message_buffer) {
44
43
error_message_buffer =
45
- (char *)MmapOrDieQuietly (kErrorMessageBufferSize , __func__);
46
- error_message_buffer_pos = 0 ;
44
+ new (GetGlobalLowLevelAllocator ()) InternalMmapVector<char >();
45
+ error_message_buffer->reserve (kErrorMessageBufferSize );
46
+ error_message_buffer->push_back (' \0 ' );
47
47
}
48
- 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);
48
+ uptr error_message_buffer_len = error_message_buffer->size () - 1 ;
49
+ uptr buffer_len = internal_strlen (buffer);
50
+ error_message_buffer->resize (error_message_buffer_len + buffer_len + 1 );
51
+ internal_memcpy (error_message_buffer->data () + error_message_buffer_len,
52
+ buffer, buffer_len + 1 );
56
53
}
57
54
58
55
// ---------------------- Helper functions ----------------------- {{{1
@@ -158,14 +155,14 @@ class ScopedInErrorReport {
158
155
159
156
// Copy the message buffer so that we could start logging without holding a
160
157
// lock that gets acquired during printing.
161
- InternalMmapVector< char > buffer_copy ( kErrorMessageBufferSize ) ;
158
+ InternalScopedString buffer_copy;
162
159
{
163
160
Lock l (&error_message_buf_mutex);
164
- internal_memcpy (buffer_copy.data (),
165
- error_message_buffer, kErrorMessageBufferSize );
161
+ buffer_copy.Append (error_message_buffer->data ());
166
162
// Clear error_message_buffer so that if we find other errors
167
163
// we don't re-log this error.
168
- error_message_buffer_pos = 0 ;
164
+ error_message_buffer->clear ();
165
+ error_message_buffer->push_back (' \0 ' );
169
166
}
170
167
171
168
LogFullErrorReport (buffer_copy.data ());
0 commit comments