From 6af9a823354960bdc6c83d244df554d24de2adcb Mon Sep 17 00:00:00 2001 From: Eric Kilmer <eric.d.kilmer@gmail.com> Date: Fri, 12 Mar 2021 15:37:36 -0500 Subject: [PATCH] Fix memory leaks during cleanup of malformed PE (#146) Replace copied cleanup deletes with `DestructParsedPE` function --- pe-parser-library/src/parse.cpp | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/pe-parser-library/src/parse.cpp b/pe-parser-library/src/parse.cpp index 42fbcb8..36bfaa4 100644 --- a/pe-parser-library/src/parse.cpp +++ b/pe-parser-library/src/parse.cpp @@ -2381,8 +2381,8 @@ parsed_pe *ParsePEFromBuffer(bounded_buffer *buffer) { // get header information bounded_buffer *remaining = nullptr; if (!getHeader(p->fileBuffer, p->peHeader, remaining)) { - deleteBuffer(p->fileBuffer); - delete p; + deleteBuffer(remaining); + DestructParsedPE(p); // err is set by getHeader return nullptr; } @@ -2390,16 +2390,14 @@ parsed_pe *ParsePEFromBuffer(bounded_buffer *buffer) { bounded_buffer *file = p->fileBuffer; if (!getSections(remaining, file, p->peHeader.nt, p->internal->secs)) { deleteBuffer(remaining); - deleteBuffer(p->fileBuffer); - delete p; + DestructParsedPE(p); PE_ERR(PEERR_SECT); return nullptr; } if (!getResources(remaining, file, p->internal->secs, p->internal->rsrcs)) { deleteBuffer(remaining); - deleteBuffer(p->fileBuffer); - delete p; + DestructParsedPE(p); PE_ERR(PEERR_RESC); return nullptr; } @@ -2407,8 +2405,7 @@ parsed_pe *ParsePEFromBuffer(bounded_buffer *buffer) { // Get exports if (!getExports(p)) { deleteBuffer(remaining); - deleteBuffer(p->fileBuffer); - delete p; + DestructParsedPE(p); PE_ERR(PEERR_MAGIC); return nullptr; } @@ -2416,8 +2413,7 @@ parsed_pe *ParsePEFromBuffer(bounded_buffer *buffer) { // Get relocations, if exist if (!getRelocations(p)) { deleteBuffer(remaining); - deleteBuffer(p->fileBuffer); - delete p; + DestructParsedPE(p); PE_ERR(PEERR_MAGIC); return nullptr; } @@ -2425,16 +2421,14 @@ parsed_pe *ParsePEFromBuffer(bounded_buffer *buffer) { // Get imports if (!getImports(p)) { deleteBuffer(remaining); - deleteBuffer(p->fileBuffer); - delete p; + DestructParsedPE(p); return nullptr; } // Get symbol table if (!getSymbolTable(p)) { deleteBuffer(remaining); - deleteBuffer(p->fileBuffer); - delete p; + DestructParsedPE(p); return nullptr; }