Ensure Linux minidump writer flushes minidump header early.
If the Linux minidump writer crashes while writing a dump, the dump might contain some useful information, but the header will be empty because TypedMDRVA's destructor flushes the data, and the header var doesn't go out of scope until the end of the `Dump` method. This fixes that problem by putting the header in a shorter block scope. We've seen this problem in some Android dumps in the wild, like: https://crash-stats.mozilla.com/report/index/cef5b777-02d1-43c2-bf40-133ab2160209 R=thestig@chromium.org BUG=https://bugzilla.mozilla.org/show_bug.cgi?id=1247978 Review URL: https://codereview.chromium.org/1696573003 .
This commit is contained in:
parent
d7c0bd0624
commit
e132514d80
1 changed files with 18 additions and 11 deletions
|
@ -168,19 +168,26 @@ class MinidumpWriter {
|
|||
// of stream which we write.
|
||||
unsigned kNumWriters = 13;
|
||||
|
||||
TypedMDRVA<MDRawHeader> header(&minidump_writer_);
|
||||
TypedMDRVA<MDRawDirectory> dir(&minidump_writer_);
|
||||
if (!header.Allocate())
|
||||
return false;
|
||||
if (!dir.AllocateArray(kNumWriters))
|
||||
return false;
|
||||
my_memset(header.get(), 0, sizeof(MDRawHeader));
|
||||
{
|
||||
// Ensure the header gets flushed, as that happens in the destructor.
|
||||
// If a crash occurs somewhere below, at least the header will be
|
||||
// intact.
|
||||
TypedMDRVA<MDRawHeader> header(&minidump_writer_);
|
||||
if (!header.Allocate())
|
||||
return false;
|
||||
|
||||
header.get()->signature = MD_HEADER_SIGNATURE;
|
||||
header.get()->version = MD_HEADER_VERSION;
|
||||
header.get()->time_date_stamp = time(NULL);
|
||||
header.get()->stream_count = kNumWriters;
|
||||
header.get()->stream_directory_rva = dir.position();
|
||||
if (!dir.AllocateArray(kNumWriters))
|
||||
return false;
|
||||
|
||||
my_memset(header.get(), 0, sizeof(MDRawHeader));
|
||||
|
||||
header.get()->signature = MD_HEADER_SIGNATURE;
|
||||
header.get()->version = MD_HEADER_VERSION;
|
||||
header.get()->time_date_stamp = time(NULL);
|
||||
header.get()->stream_count = kNumWriters;
|
||||
header.get()->stream_directory_rva = dir.position();
|
||||
}
|
||||
|
||||
unsigned dir_index = 0;
|
||||
MDRawDirectory dirent;
|
||||
|
|
Loading…
Reference in a new issue