Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1)

Side by Side Diff: src/processor/minidump.cc

Issue 2109063004: Updating MDRawMiscInfo to support version 5 of the MINIDUMP_MISC_INFO_N structure. Base URL: https://chromium.googlesource.com/breakpad/breakpad.git@master
Patch Set: Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/google_breakpad/common/minidump_format.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2010 Google Inc. 1 // Copyright (c) 2010 Google Inc.
2 // All rights reserved. 2 // All rights reserved.
3 // 3 //
4 // Redistribution and use in source and binary forms, with or without 4 // Redistribution and use in source and binary forms, with or without
5 // modification, are permitted provided that the following conditions are 5 // modification, are permitted provided that the following conditions are
6 // met: 6 // met:
7 // 7 //
8 // * Redistributions of source code must retain the above copyright 8 // * Redistributions of source code must retain the above copyright
9 // notice, this list of conditions and the following disclaimer. 9 // notice, this list of conditions and the following disclaimer.
10 // * Redistributions in binary form must reproduce the above 10 // * Redistributions in binary form must reproduce the above
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after
190 Swap(&system_time->year); 190 Swap(&system_time->year);
191 Swap(&system_time->month); 191 Swap(&system_time->month);
192 Swap(&system_time->day_of_week); 192 Swap(&system_time->day_of_week);
193 Swap(&system_time->day); 193 Swap(&system_time->day);
194 Swap(&system_time->hour); 194 Swap(&system_time->hour);
195 Swap(&system_time->minute); 195 Swap(&system_time->minute);
196 Swap(&system_time->second); 196 Swap(&system_time->second);
197 Swap(&system_time->milliseconds); 197 Swap(&system_time->milliseconds);
198 } 198 }
199 199
200 static inline void Swap(MDXStateFeature* xstate_feature) {
201 Swap(&xstate_feature->offset);
202 Swap(&xstate_feature->size);
203 }
204
205 static inline void Swap(MDXStateConfigFeatureMscInfo* xstate_feature_info) {
206 Swap(&xstate_feature_info->size_of_info);
207 Swap(&xstate_feature_info->context_size);
208 Swap(&xstate_feature_info->enabled_features);
209
210 for (size_t i = 0; i < MD_MAXIMUM_XSTATE_FEATURES; i++) {
211 Swap(&xstate_feature_info->features[i]);
212 }
213 }
214
200 static inline void Swap(uint16_t* data, size_t size_in_bytes) { 215 static inline void Swap(uint16_t* data, size_t size_in_bytes) {
201 size_t data_length = size_in_bytes / sizeof(data[0]); 216 size_t data_length = size_in_bytes / sizeof(data[0]);
202 for (size_t i = 0; i < data_length; i++) { 217 for (size_t i = 0; i < data_length; i++) {
203 Swap(&data[i]); 218 Swap(&data[i]);
204 } 219 }
205 } 220 }
206 221
207 // 222 //
208 // Character conversion routines 223 // Character conversion routines
209 // 224 //
(...skipping 3291 matching lines...) Expand 10 before | Expand all | Expand 10 after
3501 3516
3502 MinidumpMiscInfo::MinidumpMiscInfo(Minidump* minidump) 3517 MinidumpMiscInfo::MinidumpMiscInfo(Minidump* minidump)
3503 : MinidumpStream(minidump), 3518 : MinidumpStream(minidump),
3504 misc_info_() { 3519 misc_info_() {
3505 } 3520 }
3506 3521
3507 3522
3508 bool MinidumpMiscInfo::Read(uint32_t expected_size) { 3523 bool MinidumpMiscInfo::Read(uint32_t expected_size) {
3509 valid_ = false; 3524 valid_ = false;
3510 3525
3526 size_t padding = 0;
3511 if (expected_size != MD_MISCINFO_SIZE && 3527 if (expected_size != MD_MISCINFO_SIZE &&
3512 expected_size != MD_MISCINFO2_SIZE && 3528 expected_size != MD_MISCINFO2_SIZE &&
3513 expected_size != MD_MISCINFO3_SIZE && 3529 expected_size != MD_MISCINFO3_SIZE &&
3514 expected_size != MD_MISCINFO4_SIZE) { 3530 expected_size != MD_MISCINFO4_SIZE &&
3515 BPLOG(ERROR) << "MinidumpMiscInfo size mismatch, " << expected_size 3531 expected_size != MD_MISCINFO5_SIZE) {
3516 << " != " << MD_MISCINFO_SIZE << ", " << MD_MISCINFO2_SIZE 3532 if (expected_size > MD_MISCINFO5_SIZE) {
3517 << ", " << MD_MISCINFO3_SIZE << ", " << MD_MISCINFO4_SIZE 3533 // Only read the part of the misc info structure we know how to handle
3518 << ")"; 3534 BPLOG(INFO) << "MinidumpMiscInfo size larger than expected "
3519 return false; 3535 << expected_size << ", skipping over the unknown part";
3536 padding = expected_size - MD_MISCINFO5_SIZE;
3537 expected_size = MD_MISCINFO5_SIZE;
3538 } else {
3539 BPLOG(ERROR) << "MinidumpMiscInfo size mismatch, " << expected_size
3540 << " != " << MD_MISCINFO_SIZE << ", " << MD_MISCINFO2_SIZE
3541 << ", " << MD_MISCINFO3_SIZE << ", " << MD_MISCINFO4_SIZE
3542 << ", " << MD_MISCINFO5_SIZE << ")";
3543 return false;
3544 }
3520 } 3545 }
3521 3546
3522 if (!minidump_->ReadBytes(&misc_info_, expected_size)) { 3547 if (!minidump_->ReadBytes(&misc_info_, expected_size)) {
3523 BPLOG(ERROR) << "MinidumpMiscInfo cannot read miscellaneous info"; 3548 BPLOG(ERROR) << "MinidumpMiscInfo cannot read miscellaneous info";
3524 return false; 3549 return false;
3525 } 3550 }
3526 3551
3552 if (padding != 0) {
3553 off_t saved_position = minidump_->Tell();
3554 if (saved_position == -1) {
3555 BPLOG(ERROR) << "MinidumpMiscInfo could not tell the current position";
3556 return false;
3557 }
3558
3559 if (!minidump_->SeekSet(saved_position + padding)) {
3560 BPLOG(ERROR) << "MinidumpMiscInfo could not seek past the miscellaneous "
3561 << "info structure";
3562 return false;
3563 }
3564 }
3565
3527 if (minidump_->swap()) { 3566 if (minidump_->swap()) {
3528 // Swap version 1 fields 3567 // Swap version 1 fields
3529 Swap(&misc_info_.size_of_info); 3568 Swap(&misc_info_.size_of_info);
3530 Swap(&misc_info_.flags1); 3569 Swap(&misc_info_.flags1);
3531 Swap(&misc_info_.process_id); 3570 Swap(&misc_info_.process_id);
3532 Swap(&misc_info_.process_create_time); 3571 Swap(&misc_info_.process_create_time);
3533 Swap(&misc_info_.process_user_time); 3572 Swap(&misc_info_.process_user_time);
3534 Swap(&misc_info_.process_kernel_time); 3573 Swap(&misc_info_.process_kernel_time);
3535 if (misc_info_.size_of_info > MD_MISCINFO_SIZE) { 3574 if (misc_info_.size_of_info > MD_MISCINFO_SIZE) {
3536 // Swap version 2 fields 3575 // Swap version 2 fields
3537 Swap(&misc_info_.processor_max_mhz); 3576 Swap(&misc_info_.processor_max_mhz);
3538 Swap(&misc_info_.processor_current_mhz); 3577 Swap(&misc_info_.processor_current_mhz);
3539 Swap(&misc_info_.processor_mhz_limit); 3578 Swap(&misc_info_.processor_mhz_limit);
3540 Swap(&misc_info_.processor_max_idle_state); 3579 Swap(&misc_info_.processor_max_idle_state);
3541 Swap(&misc_info_.processor_current_idle_state); 3580 Swap(&misc_info_.processor_current_idle_state);
3542 } 3581 }
3543 if (misc_info_.size_of_info > MD_MISCINFO2_SIZE) { 3582 if (misc_info_.size_of_info > MD_MISCINFO2_SIZE) {
3544 // Swap version 3 fields 3583 // Swap version 3 fields
3545 Swap(&misc_info_.process_integrity_level); 3584 Swap(&misc_info_.process_integrity_level);
3546 Swap(&misc_info_.process_execute_flags); 3585 Swap(&misc_info_.process_execute_flags);
3547 Swap(&misc_info_.protected_process); 3586 Swap(&misc_info_.protected_process);
3548 Swap(&misc_info_.time_zone_id); 3587 Swap(&misc_info_.time_zone_id);
3549 Swap(&misc_info_.time_zone); 3588 Swap(&misc_info_.time_zone);
3550 } 3589 }
3551 if (misc_info_.size_of_info > MD_MISCINFO3_SIZE) { 3590 if (misc_info_.size_of_info > MD_MISCINFO3_SIZE) {
3552 // Swap version 4 fields. 3591 // Swap version 4 fields.
3553 // Do not swap UTF-16 strings. The swap is done as part of the 3592 // Do not swap UTF-16 strings. The swap is done as part of the
3554 // conversion to UTF-8 (code follows below). 3593 // conversion to UTF-8 (code follows below).
3555 } 3594 }
3595 if (misc_info_.size_of_info > MD_MISCINFO4_SIZE) {
3596 // Swap version 5 fields
3597 Swap(&misc_info_.xstate_data);
3598 Swap(&misc_info_.process_cookie);
3599 }
3556 } 3600 }
3557 3601
3558 if (expected_size != misc_info_.size_of_info) { 3602 if (expected_size + padding != misc_info_.size_of_info) {
3559 BPLOG(ERROR) << "MinidumpMiscInfo size mismatch, " << 3603 BPLOG(ERROR) << "MinidumpMiscInfo size mismatch, " <<
3560 expected_size << " != " << misc_info_.size_of_info; 3604 expected_size << " != " << misc_info_.size_of_info;
3561 return false; 3605 return false;
3562 } 3606 }
3563 3607
3564 // Convert UTF-16 strings 3608 // Convert UTF-16 strings
3565 if (misc_info_.size_of_info > MD_MISCINFO2_SIZE) { 3609 if (misc_info_.size_of_info > MD_MISCINFO2_SIZE) {
3566 // Convert UTF-16 strings in version 3 fields 3610 // Convert UTF-16 strings in version 3 fields
3567 ConvertUTF16BufferToUTF8String(misc_info_.time_zone.standard_name, 3611 ConvertUTF16BufferToUTF8String(misc_info_.time_zone.standard_name,
3568 sizeof(misc_info_.time_zone.standard_name), 3612 sizeof(misc_info_.time_zone.standard_name),
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
3698 if (misc_info_.size_of_info > MD_MISCINFO3_SIZE) { 3742 if (misc_info_.size_of_info > MD_MISCINFO3_SIZE) {
3699 // Print version 4 fields 3743 // Print version 4 fields
3700 if (misc_info_.flags1 & MD_MISCINFO_FLAGS1_BUILDSTRING) { 3744 if (misc_info_.flags1 & MD_MISCINFO_FLAGS1_BUILDSTRING) {
3701 printf(" build_string = %s\n", build_string_.c_str()); 3745 printf(" build_string = %s\n", build_string_.c_str());
3702 printf(" dbg_bld_str = %s\n", dbg_bld_str_.c_str()); 3746 printf(" dbg_bld_str = %s\n", dbg_bld_str_.c_str());
3703 } else { 3747 } else {
3704 printf(" build_string = (invalid)\n"); 3748 printf(" build_string = (invalid)\n");
3705 printf(" dbg_bld_str = (invalid)\n"); 3749 printf(" dbg_bld_str = (invalid)\n");
3706 } 3750 }
3707 } 3751 }
3752 if (misc_info_.size_of_info > MD_MISCINFO4_SIZE) {
3753 // Print version 5 fields
3754 if (misc_info_.flags1 & MD_MISCINFO_FLAGS1_PROCESS_COOKIE) {
3755 printf(" xstate_data.size_of_info = %d\n",
3756 misc_info_.xstate_data.size_of_info);
3757 printf(" xstate_data.context_size = %d\n",
3758 misc_info_.xstate_data.context_size);
3759 printf(" xstate_data.enabled_features = 0x%" PRIx64 "\n",
3760 misc_info_.xstate_data.enabled_features);
3761 for (size_t i = 0; i < MD_MAXIMUM_XSTATE_FEATURES; i++) {
3762 if (misc_info_.xstate_data.enabled_features & (1 << i)) {
3763 printf(" xstate_data.features[%02zu] = { %d, %d }\n", i,
3764 misc_info_.xstate_data.features[i].offset,
3765 misc_info_.xstate_data.features[i].size);
3766 }
3767 }
3768 if (misc_info_.xstate_data.enabled_features == 0) {
3769 printf(" xstate_data.features[] = (empty)\n");
3770 }
3771 printf(" process_cookie = %d\n",
3772 misc_info_.process_cookie);
3773 } else {
3774 printf(" xstate_data.size_of_info = (invalid)\n");
3775 printf(" xstate_data.context_size = (invalid)\n");
3776 printf(" xstate_data.enabled_features = (invalid)\n");
3777 printf(" xstate_data.features[] = (invalid)\n");
3778 printf(" process_cookie = (invalid)\n");
3779 }
3780 }
3708 printf("\n"); 3781 printf("\n");
3709 } 3782 }
3710 3783
3711 3784
3712 // 3785 //
3713 // MinidumpBreakpadInfo 3786 // MinidumpBreakpadInfo
3714 // 3787 //
3715 3788
3716 3789
3717 MinidumpBreakpadInfo::MinidumpBreakpadInfo(Minidump* minidump) 3790 MinidumpBreakpadInfo::MinidumpBreakpadInfo(Minidump* minidump)
(...skipping 1189 matching lines...) Expand 10 before | Expand all | Expand 10 after
4907 return NULL; 4980 return NULL;
4908 } 4981 }
4909 4982
4910 *stream = new_stream.release(); 4983 *stream = new_stream.release();
4911 info->stream = *stream; 4984 info->stream = *stream;
4912 return *stream; 4985 return *stream;
4913 } 4986 }
4914 4987
4915 4988
4916 } // namespace google_breakpad 4989 } // namespace google_breakpad
OLDNEW
« no previous file with comments | « src/google_breakpad/common/minidump_format.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698