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
This commit is contained in:
parent
4634d88f2e
commit
0dbae0cf3f
2 changed files with 15 additions and 12 deletions
|
@ -901,10 +901,6 @@ class MinidumpLinuxMaps : public MinidumpObject {
|
|||
// This caller owns the pointer.
|
||||
explicit MinidumpLinuxMaps(Minidump *minidump);
|
||||
|
||||
// Read data about a single mapping from /proc/self/maps and load the data
|
||||
// into this object. The input vector is in the same format as a line from
|
||||
// /proc/self/maps.
|
||||
|
||||
// The memory region struct that this class wraps.
|
||||
MappedMemoryRegion region_;
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue