]> granicus.if.org Git - file/commitdiff
fix memory allocation botches.
authorChristos Zoulas <christos@zoulas.com>
Fri, 28 Nov 2008 17:08:28 +0000 (17:08 +0000)
committerChristos Zoulas <christos@zoulas.com>
Fri, 28 Nov 2008 17:08:28 +0000 (17:08 +0000)
src/cdf.c

index d264f16b51cb6b8e932b46322a1140ef3a387d6a..94014be73f301d0fb4a4d218549591f90ef17af2 100644 (file)
--- a/src/cdf.c
+++ b/src/cdf.c
@@ -32,7 +32,7 @@
 #include "file.h"
 
 #ifndef lint
-FILE_RCSID("@(#)$File: cdf.c,v 1.12 2008/11/04 16:38:28 christos Exp $")
+FILE_RCSID("@(#)$File: cdf.c,v 1.13 2008/11/28 17:08:28 christos Exp $")
 #endif
 
 #include <assert.h>
@@ -297,35 +297,35 @@ cdf_read_sat(int fd, cdf_header_t *h, cdf_sat_t *sat)
                if (cdf_read_sector(fd, sat->sat_tab, ss * i, ss, h,
                    h->h_master_sat[i]) != (ssize_t)ss) {
                        DPRINTF(("Reading sector %d", h->h_master_sat[i]));
-                       free(sat->sat_tab);
-                       return -1;
+                       goto out1;
                }
        }
 
        if ((msa = calloc(1, ss)) == NULL)
-               return -1;
+               goto out1;
 
        mid = h->h_secid_first_sector_in_master_sat;
        for (j = 0; j < h->h_num_sectors_in_master_sat; j++) {
                if (cdf_read_sector(fd, msa, 0, ss, h, mid) != (ssize_t)ss) {
                        DPRINTF(("Reading master sector %d", mid));
-                       free(sat->sat_tab);
-                       free(msa);
-                       return -1;
+                       goto out2;
                }
                for (k = 0; k < (ss / sizeof(mid)) - 1; k++, i++)
                        if (cdf_read_sector(fd, sat->sat_tab, ss * i, ss, h,
                            CDF_TOLE4(msa[k])) != (ssize_t)ss) {
                                DPRINTF(("Reading sector %d",
                                    CDF_TOLE4(msa[k])));
-                               free(sat->sat_tab);
-                               free(msa);
-                               return -1;
+                               goto out2;
                        }
                mid = CDF_TOLE4(msa[(ss / sizeof(mid)) - 1]);
        }
        free(msa);
        return 0;
+out2:
+       free(msa);
+out1:
+       free(sat->sat_tab);
+       return -1;
 }
 
 size_t
@@ -461,6 +461,7 @@ cdf_read_dir(int fd, const cdf_header_t *h, const cdf_sat_t *sat,
        if (NEED_SWAP)
                for (i = 0; i < dir->dir_len; i++)
                        cdf_swap_dir(&dir->dir_tab[i]);
+       free(buf);
        return 0;
 }
 
@@ -474,18 +475,18 @@ cdf_read_ssat(int fd, const cdf_header_t *h, const cdf_sat_t *sat,
        cdf_secid_t sid = h->h_secid_first_sector_in_short_sat;
 
        ssat->sat_len = cdf_count_chain(h, sat, sid);
-       if (sat->sat_len == (size_t)-1)
+       if (ssat->sat_len == (size_t)-1)
                return -1;
 
        ssat->sat_tab = calloc(ssat->sat_len, ss);
-       if (sat->sat_tab == NULL)
+       if (ssat->sat_tab == NULL)
                return -1;
 
        for (i = 0; sid >= 0; i++) {
                if (cdf_read_sector(fd, ssat->sat_tab, i * ss, ss, h, sid) !=
                    (ssize_t)ss) {
                        DPRINTF(("Reading short sat sector %d", sid));
-                       free(sat->sat_tab);
+                       free(ssat->sat_tab);
                        return -1;
                }
                sid = CDF_TOLE4(sat->sat_tab[sid]);