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