Fix memory leaks during cleanup of malformed PE (#146)

Replace copied cleanup deletes with `DestructParsedPE` function
This commit is contained in:
Eric Kilmer 2021-03-12 15:37:36 -05:00 committed by GitHub
parent e5ba0165ab
commit 6af9a82335
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -2381,8 +2381,8 @@ parsed_pe *ParsePEFromBuffer(bounded_buffer *buffer) {
// get header information // get header information
bounded_buffer *remaining = nullptr; bounded_buffer *remaining = nullptr;
if (!getHeader(p->fileBuffer, p->peHeader, remaining)) { if (!getHeader(p->fileBuffer, p->peHeader, remaining)) {
deleteBuffer(p->fileBuffer); deleteBuffer(remaining);
delete p; DestructParsedPE(p);
// err is set by getHeader // err is set by getHeader
return nullptr; return nullptr;
} }
@ -2390,16 +2390,14 @@ parsed_pe *ParsePEFromBuffer(bounded_buffer *buffer) {
bounded_buffer *file = p->fileBuffer; bounded_buffer *file = p->fileBuffer;
if (!getSections(remaining, file, p->peHeader.nt, p->internal->secs)) { if (!getSections(remaining, file, p->peHeader.nt, p->internal->secs)) {
deleteBuffer(remaining); deleteBuffer(remaining);
deleteBuffer(p->fileBuffer); DestructParsedPE(p);
delete p;
PE_ERR(PEERR_SECT); PE_ERR(PEERR_SECT);
return nullptr; return nullptr;
} }
if (!getResources(remaining, file, p->internal->secs, p->internal->rsrcs)) { if (!getResources(remaining, file, p->internal->secs, p->internal->rsrcs)) {
deleteBuffer(remaining); deleteBuffer(remaining);
deleteBuffer(p->fileBuffer); DestructParsedPE(p);
delete p;
PE_ERR(PEERR_RESC); PE_ERR(PEERR_RESC);
return nullptr; return nullptr;
} }
@ -2407,8 +2405,7 @@ parsed_pe *ParsePEFromBuffer(bounded_buffer *buffer) {
// Get exports // Get exports
if (!getExports(p)) { if (!getExports(p)) {
deleteBuffer(remaining); deleteBuffer(remaining);
deleteBuffer(p->fileBuffer); DestructParsedPE(p);
delete p;
PE_ERR(PEERR_MAGIC); PE_ERR(PEERR_MAGIC);
return nullptr; return nullptr;
} }
@ -2416,8 +2413,7 @@ parsed_pe *ParsePEFromBuffer(bounded_buffer *buffer) {
// Get relocations, if exist // Get relocations, if exist
if (!getRelocations(p)) { if (!getRelocations(p)) {
deleteBuffer(remaining); deleteBuffer(remaining);
deleteBuffer(p->fileBuffer); DestructParsedPE(p);
delete p;
PE_ERR(PEERR_MAGIC); PE_ERR(PEERR_MAGIC);
return nullptr; return nullptr;
} }
@ -2425,16 +2421,14 @@ parsed_pe *ParsePEFromBuffer(bounded_buffer *buffer) {
// Get imports // Get imports
if (!getImports(p)) { if (!getImports(p)) {
deleteBuffer(remaining); deleteBuffer(remaining);
deleteBuffer(p->fileBuffer); DestructParsedPE(p);
delete p;
return nullptr; return nullptr;
} }
// Get symbol table // Get symbol table
if (!getSymbolTable(p)) { if (!getSymbolTable(p)) {
deleteBuffer(remaining); deleteBuffer(remaining);
deleteBuffer(p->fileBuffer); DestructParsedPE(p);
delete p;
return nullptr; return nullptr;
} }