| OLD | NEW |
| 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 3981 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3992 // MinidumpLinuxMapsList | 3992 // MinidumpLinuxMapsList |
| 3993 // | 3993 // |
| 3994 | 3994 |
| 3995 MinidumpLinuxMapsList::MinidumpLinuxMapsList(Minidump *minidump) | 3995 MinidumpLinuxMapsList::MinidumpLinuxMapsList(Minidump *minidump) |
| 3996 : MinidumpStream(minidump), | 3996 : MinidumpStream(minidump), |
| 3997 maps_(NULL), | 3997 maps_(NULL), |
| 3998 maps_count_(0) { | 3998 maps_count_(0) { |
| 3999 } | 3999 } |
| 4000 | 4000 |
| 4001 MinidumpLinuxMapsList::~MinidumpLinuxMapsList() { | 4001 MinidumpLinuxMapsList::~MinidumpLinuxMapsList() { |
| 4002 for (unsigned int i = 0; i < maps_->size(); i++) { | 4002 if (maps_) { |
| 4003 delete (*maps_)[i]; | 4003 for (unsigned int i = 0; i < maps_->size(); i++) { |
| 4004 delete (*maps_)[i]; |
| 4005 } |
| 4006 delete maps_; |
| 4004 } | 4007 } |
| 4005 delete maps_; | |
| 4006 } | 4008 } |
| 4007 | 4009 |
| 4008 const MinidumpLinuxMaps *MinidumpLinuxMapsList::GetLinuxMapsForAddress( | 4010 const MinidumpLinuxMaps *MinidumpLinuxMapsList::GetLinuxMapsForAddress( |
| 4009 uint64_t address) const { | 4011 uint64_t address) const { |
| 4010 if (!valid_) { | 4012 if (!valid_ || (maps_ == NULL)) { |
| 4011 BPLOG(ERROR) << "Invalid MinidumpLinuxMapsList for GetLinuxMapsForAddress"; | 4013 BPLOG(ERROR) << "Invalid MinidumpLinuxMapsList for GetLinuxMapsForAddress"; |
| 4012 return NULL; | 4014 return NULL; |
| 4013 } | 4015 } |
| 4014 | 4016 |
| 4015 // Search every memory mapping. | 4017 // Search every memory mapping. |
| 4016 for (unsigned int index = 0; index < maps_count_; index++) { | 4018 for (unsigned int index = 0; index < maps_count_; index++) { |
| 4017 // Check if address is within bounds of the current memory region. | 4019 // Check if address is within bounds of the current memory region. |
| 4018 if ((*maps_)[index]->GetBase() <= address && | 4020 if ((*maps_)[index]->GetBase() <= address && |
| 4019 (*maps_)[index]->GetBase() + (*maps_)[index]->GetSize() > address) { | 4021 (*maps_)[index]->GetBase() + (*maps_)[index]->GetSize() > address) { |
| 4020 return (*maps_)[index]; | 4022 return (*maps_)[index]; |
| 4021 } | 4023 } |
| 4022 } | 4024 } |
| 4023 | 4025 |
| 4024 // No mapping encloses the memory address. | 4026 // No mapping encloses the memory address. |
| 4025 BPLOG(ERROR) << "MinidumpLinuxMapsList has no mapping at " | 4027 BPLOG(ERROR) << "MinidumpLinuxMapsList has no mapping at " |
| 4026 << HexString(address); | 4028 << HexString(address); |
| 4027 return NULL; | 4029 return NULL; |
| 4028 } | 4030 } |
| 4029 | 4031 |
| 4030 const MinidumpLinuxMaps *MinidumpLinuxMapsList::GetLinuxMapsAtIndex( | 4032 const MinidumpLinuxMaps *MinidumpLinuxMapsList::GetLinuxMapsAtIndex( |
| 4031 unsigned int index) const { | 4033 unsigned int index) const { |
| 4032 if (!valid_) { | 4034 if (!valid_ || (maps_ == NULL)) { |
| 4033 BPLOG(ERROR) << "Invalid MinidumpLinuxMapsList for GetLinuxMapsAtIndex"; | 4035 BPLOG(ERROR) << "Invalid MinidumpLinuxMapsList for GetLinuxMapsAtIndex"; |
| 4034 return NULL; | 4036 return NULL; |
| 4035 } | 4037 } |
| 4036 | 4038 |
| 4037 // Index out of bounds. | 4039 // Index out of bounds. |
| 4038 if (index >= maps_count_) { | 4040 if (index >= maps_count_ || (maps_ == NULL)) { |
| 4039 BPLOG(ERROR) << "MinidumpLinuxMapsList index of out range: " | 4041 BPLOG(ERROR) << "MinidumpLinuxMapsList index of out range: " |
| 4040 << index | 4042 << index |
| 4041 << "/" | 4043 << "/" |
| 4042 << maps_count_; | 4044 << maps_count_; |
| 4043 return NULL; | 4045 return NULL; |
| 4044 } | 4046 } |
| 4045 return (*maps_)[index]; | 4047 return (*maps_)[index]; |
| 4046 } | 4048 } |
| 4047 | 4049 |
| 4048 bool MinidumpLinuxMapsList::Read(uint32_t expected_size) { | 4050 bool MinidumpLinuxMapsList::Read(uint32_t expected_size) { |
| 4049 // Invalidate cached data. | 4051 // Invalidate cached data. |
| 4050 delete maps_; | 4052 if (maps_) { |
| 4053 for (unsigned int i = 0; i < maps_->size(); i++) { |
| 4054 delete (*maps_)[i]; |
| 4055 } |
| 4056 delete maps_; |
| 4057 } |
| 4051 maps_ = NULL; | 4058 maps_ = NULL; |
| 4052 maps_count_ = 0; | 4059 maps_count_ = 0; |
| 4053 | 4060 |
| 4054 valid_ = false; | 4061 valid_ = false; |
| 4055 | 4062 |
| 4056 // Load and check expected stream length. | 4063 // Load and check expected stream length. |
| 4057 uint32_t length = 0; | 4064 uint32_t length = 0; |
| 4058 if (!minidump_->SeekToStreamType(MD_LINUX_MAPS, &length)) { | 4065 if (!minidump_->SeekToStreamType(MD_LINUX_MAPS, &length)) { |
| 4059 BPLOG(ERROR) << "MinidumpLinuxMapsList stream type not found"; | 4066 BPLOG(ERROR) << "MinidumpLinuxMapsList stream type not found"; |
| 4060 return false; | 4067 return false; |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4093 } | 4100 } |
| 4094 | 4101 |
| 4095 // Set instance variables. | 4102 // Set instance variables. |
| 4096 maps_ = maps.release(); | 4103 maps_ = maps.release(); |
| 4097 maps_count_ = maps_->size(); | 4104 maps_count_ = maps_->size(); |
| 4098 valid_ = true; | 4105 valid_ = true; |
| 4099 return true; | 4106 return true; |
| 4100 } | 4107 } |
| 4101 | 4108 |
| 4102 void MinidumpLinuxMapsList::Print() { | 4109 void MinidumpLinuxMapsList::Print() { |
| 4103 if (!valid_) { | 4110 if (!valid_ || (maps_ == NULL)) { |
| 4104 BPLOG(ERROR) << "MinidumpLinuxMapsList cannot print valid data"; | 4111 BPLOG(ERROR) << "MinidumpLinuxMapsList cannot print valid data"; |
| 4105 return; | 4112 return; |
| 4106 } | 4113 } |
| 4107 for (size_t i = 0; i < maps_->size(); i++) { | 4114 for (size_t i = 0; i < maps_->size(); i++) { |
| 4108 (*maps_)[i]->Print(); | 4115 (*maps_)[i]->Print(); |
| 4109 } | 4116 } |
| 4110 } | 4117 } |
| 4111 | 4118 |
| 4112 // | 4119 // |
| 4113 // Minidump | 4120 // Minidump |
| (...skipping 649 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4763 return NULL; | 4770 return NULL; |
| 4764 } | 4771 } |
| 4765 | 4772 |
| 4766 *stream = new_stream.release(); | 4773 *stream = new_stream.release(); |
| 4767 info->stream = *stream; | 4774 info->stream = *stream; |
| 4768 return *stream; | 4775 return *stream; |
| 4769 } | 4776 } |
| 4770 | 4777 |
| 4771 | 4778 |
| 4772 } // namespace google_breakpad | 4779 } // namespace google_breakpad |
| OLD | NEW |