commit:     4c6b85b04291c96c45cdccf7cb9147f9307e3218
Author:     Mike Frysinger <vapier <AT> gentoo <DOT> org>
AuthorDate: Mon Jun 20 02:58:10 2016 +0000
Commit:     Mike Frysinger <vapier <AT> gentoo <DOT> org>
CommitDate: Mon Jun 20 02:58:10 2016 +0000
URL:        https://gitweb.gentoo.org/proj/pax-utils.git/commit/?id=4c6b85b0

paxmacho: fix mem leak when reading macho files

 paxmacho.c | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/paxmacho.c b/paxmacho.c
index 84aeb86..090fc18 100644
--- a/paxmacho.c
+++ b/paxmacho.c
@@ -247,7 +247,7 @@ fatobj *readmacho_buffer(const char *filename, char 
*buffer, size_t buffer_len)
 
        /* make sure we have enough bytes to scan */
        if (ret->len <= sizeof(struct fat_header))
-               return NULL;
+               goto fail;
 
        fhdr = ret->data;
        /* Check what kind of file this is.  Unfortunately we don't have
@@ -276,14 +276,14 @@ fatobj *readmacho_buffer(const char *filename, char 
*buffer, size_t buffer_len)
                 * beware of corrupt files and Java bytecode which shares
                 * the same magic with us :( */
                if (sizeof(struct fat_arch) * narchs > bufleft)
-                       return NULL;
+                       goto fail;
 
                for (i = 1; i <= narchs; i++) {
                        farch = (struct fat_arch *)dptr;
                        offset = MGET(swapped, farch->offset);
                        if (offset + sizeof(struct mach_header) >= bufleft ||
                                        read_mach_header(fobj, ret->data + 
offset) == 0)
-                               return NULL;
+                               goto fail;
                        if (i < narchs) {
                                fobj = fobj->next = xzalloc(sizeof(*fobj));
                                /* filename and size are necessary for printing 
*/
@@ -300,11 +300,15 @@ fatobj *readmacho_buffer(const char *filename, char 
*buffer, size_t buffer_len)
                /* simple Mach-O file, treat as single arch FAT file */
                if (ret->len < sizeof(struct mach_header) ||
                                read_mach_header(ret, ret->data) == 0)
-                       return NULL;
+                       goto fail;
                ret->next = NULL;
        }
 
        return ret;
+
+ fail:
+       free(ret);
+       return NULL;
 }
 
 /* undo the readmacho() stuff */

Reply via email to