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

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

Issue 2029953003: Adding support for overlapping ranges to RangeMap. (Closed) Base URL: https://chromium.googlesource.com/breakpad/breakpad.git@master
Patch Set: Created 4 years, 6 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
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 2594 matching lines...) Expand 10 before | Expand all | Expand 10 after
2605 2605
2606 uint64_t base_address = module->base_address(); 2606 uint64_t base_address = module->base_address();
2607 uint64_t module_size = module->size(); 2607 uint64_t module_size = module->size();
2608 if (base_address == static_cast<uint64_t>(-1)) { 2608 if (base_address == static_cast<uint64_t>(-1)) {
2609 BPLOG(ERROR) << "MinidumpModuleList found bad base address " 2609 BPLOG(ERROR) << "MinidumpModuleList found bad base address "
2610 "for module " << module_index << "/" << module_count << 2610 "for module " << module_index << "/" << module_count <<
2611 ", " << module->code_file(); 2611 ", " << module->code_file();
2612 return false; 2612 return false;
2613 } 2613 }
2614 2614
2615 if (!range_map_->StoreRange(base_address, module_size, module_index)) { 2615 if (!range_map_->StoreRange(base_address, 0 /* delta */, module_size,
2616 module_index)) {
2616 // Android's shared memory implementation /dev/ashmem can contain 2617 // Android's shared memory implementation /dev/ashmem can contain
2617 // duplicate entries for JITted code, so ignore these. 2618 // duplicate entries for JITted code, so ignore these.
2618 // TODO(wfh): Remove this code when Android is fixed. 2619 // TODO(wfh): Remove this code when Android is fixed.
2619 // See https://crbug.com/439531 2620 // See https://crbug.com/439531
2620 const string kDevAshmem("/dev/ashmem/"); 2621 const string kDevAshmem("/dev/ashmem/");
2621 if (module->code_file().compare( 2622 if (module->code_file().compare(
2622 0, kDevAshmem.length(), kDevAshmem) != 0) { 2623 0, kDevAshmem.length(), kDevAshmem) != 0) {
2623 if (base_address < last_end_address) { 2624 if (base_address < last_end_address) {
2624 // If failed due to apparent range overlap the cause may be 2625 // If failed due to apparent range overlap the cause may be
2625 // the client correction applied for Android packed relocations. 2626 // the client correction applied for Android packed relocations.
2626 // If this is the case, back out the client correction and retry. 2627 // If this is the case, back out the client correction and retry.
2627 module_size -= last_end_address - base_address; 2628 module_size -= last_end_address - base_address;
2628 base_address = last_end_address; 2629 base_address = last_end_address;
2629 if (!range_map_->StoreRange(base_address, 2630 if (!range_map_->StoreRange(base_address, 0 /* delta */,
2630 module_size, module_index)) { 2631 module_size, module_index)) {
2631 BPLOG(ERROR) << "MinidumpModuleList could not store module " << 2632 BPLOG(ERROR) << "MinidumpModuleList could not store module " <<
2632 module_index << "/" << module_count << ", " << 2633 module_index << "/" << module_count << ", " <<
2633 module->code_file() << ", " << 2634 module->code_file() << ", " <<
2634 HexString(base_address) << "+" << 2635 HexString(base_address) << "+" <<
2635 HexString(module_size) << ", after adjusting"; 2636 HexString(module_size) << ", after adjusting";
2636 return false; 2637 return false;
2637 } 2638 }
2638 } else { 2639 } else {
2639 BPLOG(ERROR) << "MinidumpModuleList could not store module " << 2640 BPLOG(ERROR) << "MinidumpModuleList could not store module " <<
(...skipping 25 matching lines...) Expand all
2665 2666
2666 2667
2667 const MinidumpModule* MinidumpModuleList::GetModuleForAddress( 2668 const MinidumpModule* MinidumpModuleList::GetModuleForAddress(
2668 uint64_t address) const { 2669 uint64_t address) const {
2669 if (!valid_) { 2670 if (!valid_) {
2670 BPLOG(ERROR) << "Invalid MinidumpModuleList for GetModuleForAddress"; 2671 BPLOG(ERROR) << "Invalid MinidumpModuleList for GetModuleForAddress";
2671 return NULL; 2672 return NULL;
2672 } 2673 }
2673 2674
2674 unsigned int module_index; 2675 unsigned int module_index;
2675 if (!range_map_->RetrieveRange(address, &module_index, NULL, NULL)) { 2676 if (!range_map_->RetrieveRange(address, &module_index, NULL, NULL, NULL)) {
2676 BPLOG(INFO) << "MinidumpModuleList has no module at " << 2677 BPLOG(INFO) << "MinidumpModuleList has no module at " <<
2677 HexString(address); 2678 HexString(address);
2678 return NULL; 2679 return NULL;
2679 } 2680 }
2680 2681
2681 return GetModuleAtIndex(module_index); 2682 return GetModuleAtIndex(module_index);
2682 } 2683 }
2683 2684
2684 2685
2685 const MinidumpModule* MinidumpModuleList::GetMainModule() const { 2686 const MinidumpModule* MinidumpModuleList::GetMainModule() const {
(...skipping 15 matching lines...) Expand all
2701 return NULL; 2702 return NULL;
2702 } 2703 }
2703 2704
2704 if (sequence >= module_count_) { 2705 if (sequence >= module_count_) {
2705 BPLOG(ERROR) << "MinidumpModuleList sequence out of range: " << 2706 BPLOG(ERROR) << "MinidumpModuleList sequence out of range: " <<
2706 sequence << "/" << module_count_; 2707 sequence << "/" << module_count_;
2707 return NULL; 2708 return NULL;
2708 } 2709 }
2709 2710
2710 unsigned int module_index; 2711 unsigned int module_index;
2711 if (!range_map_->RetrieveRangeAtIndex(sequence, &module_index, NULL, NULL)) { 2712 if (!range_map_->RetrieveRangeAtIndex(sequence, &module_index, NULL, NULL,
2713 NULL)) {
2712 BPLOG(ERROR) << "MinidumpModuleList has no module at sequence " << sequence; 2714 BPLOG(ERROR) << "MinidumpModuleList has no module at sequence " << sequence;
2713 return NULL; 2715 return NULL;
2714 } 2716 }
2715 2717
2716 return GetModuleAtIndex(module_index); 2718 return GetModuleAtIndex(module_index);
2717 } 2719 }
2718 2720
2719 2721
2720 const MinidumpModule* MinidumpModuleList::GetModuleAtIndex( 2722 const MinidumpModule* MinidumpModuleList::GetModuleAtIndex(
2721 unsigned int index) const { 2723 unsigned int index) const {
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after
2869 // Check for base + size overflow or undersize. 2871 // Check for base + size overflow or undersize.
2870 if (region_size == 0 || 2872 if (region_size == 0 ||
2871 region_size > numeric_limits<uint64_t>::max() - base_address) { 2873 region_size > numeric_limits<uint64_t>::max() - base_address) {
2872 BPLOG(ERROR) << "MinidumpMemoryList has a memory region problem, " << 2874 BPLOG(ERROR) << "MinidumpMemoryList has a memory region problem, " <<
2873 " region " << region_index << "/" << region_count << 2875 " region " << region_index << "/" << region_count <<
2874 ", " << HexString(base_address) << "+" << 2876 ", " << HexString(base_address) << "+" <<
2875 HexString(region_size); 2877 HexString(region_size);
2876 return false; 2878 return false;
2877 } 2879 }
2878 2880
2879 if (!range_map_->StoreRange(base_address, region_size, region_index)) { 2881 if (!range_map_->StoreRange(base_address, 0 /* delta */, region_size,
2882 region_index)) {
2880 BPLOG(ERROR) << "MinidumpMemoryList could not store memory region " << 2883 BPLOG(ERROR) << "MinidumpMemoryList could not store memory region " <<
2881 region_index << "/" << region_count << ", " << 2884 region_index << "/" << region_count << ", " <<
2882 HexString(base_address) << "+" << 2885 HexString(base_address) << "+" <<
2883 HexString(region_size); 2886 HexString(region_size);
2884 return false; 2887 return false;
2885 } 2888 }
2886 2889
2887 (*regions)[region_index].SetDescriptor(descriptor); 2890 (*regions)[region_index].SetDescriptor(descriptor);
2888 } 2891 }
2889 2892
(...skipping 26 matching lines...) Expand all
2916 2919
2917 2920
2918 MinidumpMemoryRegion* MinidumpMemoryList::GetMemoryRegionForAddress( 2921 MinidumpMemoryRegion* MinidumpMemoryList::GetMemoryRegionForAddress(
2919 uint64_t address) { 2922 uint64_t address) {
2920 if (!valid_) { 2923 if (!valid_) {
2921 BPLOG(ERROR) << "Invalid MinidumpMemoryList for GetMemoryRegionForAddress"; 2924 BPLOG(ERROR) << "Invalid MinidumpMemoryList for GetMemoryRegionForAddress";
2922 return NULL; 2925 return NULL;
2923 } 2926 }
2924 2927
2925 unsigned int region_index; 2928 unsigned int region_index;
2926 if (!range_map_->RetrieveRange(address, &region_index, NULL, NULL)) { 2929 if (!range_map_->RetrieveRange(address, &region_index, NULL, NULL, NULL)) {
2927 BPLOG(INFO) << "MinidumpMemoryList has no memory region at " << 2930 BPLOG(INFO) << "MinidumpMemoryList has no memory region at " <<
2928 HexString(address); 2931 HexString(address);
2929 return NULL; 2932 return NULL;
2930 } 2933 }
2931 2934
2932 return GetMemoryRegionAtIndex(region_index); 2935 return GetMemoryRegionAtIndex(region_index);
2933 } 2936 }
2934 2937
2935 2938
2936 void MinidumpMemoryList::Print() { 2939 void MinidumpMemoryList::Print() {
(...skipping 1037 matching lines...) Expand 10 before | Expand all | Expand 10 after
3974 // Assume that the file offset is correct after the last read. 3977 // Assume that the file offset is correct after the last read.
3975 if (!info->Read()) { 3978 if (!info->Read()) {
3976 BPLOG(ERROR) << "MinidumpMemoryInfoList cannot read info " << 3979 BPLOG(ERROR) << "MinidumpMemoryInfoList cannot read info " <<
3977 index << "/" << header.number_of_entries; 3980 index << "/" << header.number_of_entries;
3978 return false; 3981 return false;
3979 } 3982 }
3980 3983
3981 uint64_t base_address = info->GetBase(); 3984 uint64_t base_address = info->GetBase();
3982 uint64_t region_size = info->GetSize(); 3985 uint64_t region_size = info->GetSize();
3983 3986
3984 if (!range_map_->StoreRange(base_address, region_size, index)) { 3987 if (!range_map_->StoreRange(base_address, 0 /* delta */, region_size,
3988 index)) {
3985 BPLOG(ERROR) << "MinidumpMemoryInfoList could not store" 3989 BPLOG(ERROR) << "MinidumpMemoryInfoList could not store"
3986 " memory region " << 3990 " memory region " <<
3987 index << "/" << header.number_of_entries << ", " << 3991 index << "/" << header.number_of_entries << ", " <<
3988 HexString(base_address) << "+" << 3992 HexString(base_address) << "+" <<
3989 HexString(region_size); 3993 HexString(region_size);
3990 return false; 3994 return false;
3991 } 3995 }
3992 } 3996 }
3993 3997
3994 infos_ = infos.release(); 3998 infos_ = infos.release();
(...skipping 25 matching lines...) Expand all
4020 4024
4021 const MinidumpMemoryInfo* MinidumpMemoryInfoList::GetMemoryInfoForAddress( 4025 const MinidumpMemoryInfo* MinidumpMemoryInfoList::GetMemoryInfoForAddress(
4022 uint64_t address) const { 4026 uint64_t address) const {
4023 if (!valid_) { 4027 if (!valid_) {
4024 BPLOG(ERROR) << "Invalid MinidumpMemoryInfoList for" 4028 BPLOG(ERROR) << "Invalid MinidumpMemoryInfoList for"
4025 " GetMemoryInfoForAddress"; 4029 " GetMemoryInfoForAddress";
4026 return NULL; 4030 return NULL;
4027 } 4031 }
4028 4032
4029 unsigned int info_index; 4033 unsigned int info_index;
4030 if (!range_map_->RetrieveRange(address, &info_index, NULL, NULL)) { 4034 if (!range_map_->RetrieveRange(address, &info_index, NULL, NULL, NULL)) {
4031 BPLOG(INFO) << "MinidumpMemoryInfoList has no memory info at " << 4035 BPLOG(INFO) << "MinidumpMemoryInfoList has no memory info at " <<
4032 HexString(address); 4036 HexString(address);
4033 return NULL; 4037 return NULL;
4034 } 4038 }
4035 4039
4036 return GetMemoryInfoAtIndex(info_index); 4040 return GetMemoryInfoAtIndex(info_index);
4037 } 4041 }
4038 4042
4039 4043
4040 void MinidumpMemoryInfoList::Print() { 4044 void MinidumpMemoryInfoList::Print() {
(...skipping 824 matching lines...) Expand 10 before | Expand all | Expand 10 after
4865 return NULL; 4869 return NULL;
4866 } 4870 }
4867 4871
4868 *stream = new_stream.release(); 4872 *stream = new_stream.release();
4869 info->stream = *stream; 4873 info->stream = *stream;
4870 return *stream; 4874 return *stream;
4871 } 4875 }
4872 4876
4873 4877
4874 } // namespace google_breakpad 4878 } // namespace google_breakpad
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698