aboutsummaryrefslogtreecommitdiff
path: root/src/processor/minidump.cc
diff options
context:
space:
mode:
authorLiu.andrew.x@gmail.com <Liu.andrew.x@gmail.com>2015-07-31 15:26:39 +0000
committerLiu.andrew.x@gmail.com <Liu.andrew.x@gmail.com>2015-07-31 15:26:39 +0000
commit0dbae0cf3f2d3614bd7cb6ec9b6ad006e6ec1917 (patch)
tree27c4955546e7ec60cd3d51a7a2c1d653655c3f86 /src/processor/minidump.cc
parentRemove unnecessary dependencies. (diff)
downloadbreakpad-0dbae0cf3f2d3614bd7cb6ec9b6ad006e6ec1917.tar.xz
Fix potential null pointer dereference.
If a MinidumpLinuxMapsList was created and destroyed without its Read method, the program would have a segmentation fault because the destructor did not check for a null maps_ field. Additional changes include additional supplementary null checks, a potential memory leak fix, and some comment removal. Review URL: https://codereview.chromium.org/1271543002 git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@1478 4c0a9323-5329-0410-9bdc-e9ce6186880e
Diffstat (limited to 'src/processor/minidump.cc')
-rw-r--r--src/processor/minidump.cc23
1 files changed, 15 insertions, 8 deletions
diff --git a/src/processor/minidump.cc b/src/processor/minidump.cc
index abe4d5dc..f6f642be 100644
--- a/src/processor/minidump.cc
+++ b/src/processor/minidump.cc
@@ -3999,15 +3999,17 @@ MinidumpLinuxMapsList::MinidumpLinuxMapsList(Minidump *minidump)
}
MinidumpLinuxMapsList::~MinidumpLinuxMapsList() {
- for (unsigned int i = 0; i < maps_->size(); i++) {
- delete (*maps_)[i];
+ if (maps_) {
+ for (unsigned int i = 0; i < maps_->size(); i++) {
+ delete (*maps_)[i];
+ }
+ delete maps_;
}
- delete maps_;
}
const MinidumpLinuxMaps *MinidumpLinuxMapsList::GetLinuxMapsForAddress(
uint64_t address) const {
- if (!valid_) {
+ if (!valid_ || (maps_ == NULL)) {
BPLOG(ERROR) << "Invalid MinidumpLinuxMapsList for GetLinuxMapsForAddress";
return NULL;
}
@@ -4029,13 +4031,13 @@ const MinidumpLinuxMaps *MinidumpLinuxMapsList::GetLinuxMapsForAddress(
const MinidumpLinuxMaps *MinidumpLinuxMapsList::GetLinuxMapsAtIndex(
unsigned int index) const {
- if (!valid_) {
+ if (!valid_ || (maps_ == NULL)) {
BPLOG(ERROR) << "Invalid MinidumpLinuxMapsList for GetLinuxMapsAtIndex";
return NULL;
}
// Index out of bounds.
- if (index >= maps_count_) {
+ if (index >= maps_count_ || (maps_ == NULL)) {
BPLOG(ERROR) << "MinidumpLinuxMapsList index of out range: "
<< index
<< "/"
@@ -4047,7 +4049,12 @@ const MinidumpLinuxMaps *MinidumpLinuxMapsList::GetLinuxMapsAtIndex(
bool MinidumpLinuxMapsList::Read(uint32_t expected_size) {
// Invalidate cached data.
- delete maps_;
+ if (maps_) {
+ for (unsigned int i = 0; i < maps_->size(); i++) {
+ delete (*maps_)[i];
+ }
+ delete maps_;
+ }
maps_ = NULL;
maps_count_ = 0;
@@ -4100,7 +4107,7 @@ bool MinidumpLinuxMapsList::Read(uint32_t expected_size) {
}
void MinidumpLinuxMapsList::Print() {
- if (!valid_) {
+ if (!valid_ || (maps_ == NULL)) {
BPLOG(ERROR) << "MinidumpLinuxMapsList cannot print valid data";
return;
}