]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
hexdump: catch memory leaks
authorOndrej Oprala <ooprala@redhat.com>
Mon, 23 Sep 2013 13:39:38 +0000 (15:39 +0200)
committerKarel Zak <kzak@redhat.com>
Fri, 8 Nov 2013 13:16:29 +0000 (14:16 +0100)
Signed-off-by: Ondrej Oprala <ooprala@redhat.com>
text-utils/display.c
text-utils/hexdump.c
text-utils/parse.c

index 0782c9c1201a824b67c74e58dc0f50330b6e7eb9..b6b1f140ddb7b047d5bc8d1fb3e1baa34b89dc6c 100644 (file)
@@ -279,12 +279,12 @@ get(void)
                 */
                if (!length || (ateof && !next(NULL))) {
                        if (need == blocksize)
-                               return(NULL);
+                               goto retnul;
                        if (!need && vflag != ALL &&
                            !memcmp(curp, savp, nread)) {
                                if (vflag != DUP)
                                        printf("*\n");
-                               return(NULL);
+                               goto retnul;
                        }
                        if (need > 0)
                                memset((char *)curp + nread, 0, need);
@@ -293,7 +293,7 @@ get(void)
                }
                if (fileno(stdin) == -1) {
                        warnx(_("all input file arguments failed"));
-                       return(NULL);
+                       goto retnul;
                }
                n = fread((char *)curp + nread, sizeof(unsigned char),
                    length == -1 ? need : min(length, need), stdin);
@@ -323,6 +323,10 @@ get(void)
                else
                        nread += n;
        }
+retnul:
+       free (curp);
+       free (savp);
+       return NULL;
 }
 
 int next(char **argv)
index 47853a882de29dc5d50499334d395c95ec29ad48..8c9b119b92395ebe0da1d4d6f6e085964135d9d9 100644 (file)
@@ -50,6 +50,7 @@ struct list_head fshead;                              /* head of format strings */
 ssize_t blocksize;                     /* data block size */
 int exitval;                           /* final exit value */
 ssize_t length = -1;                   /* max bytes to read */
+void hex_free(void);
 
 int main(int argc, char **argv)
 {
@@ -83,5 +84,28 @@ int main(int argc, char **argv)
 
        next(argv);
        display();
+       hex_free();
        return exitval;
 }
+
+void hex_free(void)
+{
+       struct list_head *p, *pn, *q, *qn, *r, *rn;
+       FS *fs;
+       FU *fu;
+       PR *pr;
+       list_for_each_safe(p, pn, &fshead) {
+               fs = list_entry(p, FS, fslist);
+               list_for_each_safe(q, qn, &fs->fulist) {
+                       fu = list_entry(q, FU, fulist);
+                       list_for_each_safe(r, rn, &fu->prlist) {
+                               pr = list_entry(r, PR, prlist);
+                               free(pr->fmt);
+                               free(pr);
+                       }
+                       free(fu->fmt);
+                       free(fu);
+               }
+               free(fs);
+       }
+}
index 7454fe15d946e2c63db412b15e52d81bbb7a6f0a..37d2a4c864b1bc0b0beb4e36900c2ca8a46b558a 100644 (file)
@@ -231,7 +231,7 @@ void rewrite(FS *fs)
 
                        /* Only text in the string. */
                        if (!*p1) {
-                               pr->fmt = fmtp;
+                               pr->fmt = xstrdup(fmtp);
                                pr->flags = F_TEXT;
                                break;
                        }