]> www.infradead.org Git - mtd-utils.git/commitdiff
mtd_debug: cleanup error handling in flash_to_file
authorDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>
Sun, 10 Nov 2019 14:01:32 +0000 (15:01 +0100)
committerDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>
Sun, 10 Nov 2019 14:30:04 +0000 (15:30 +0100)
The existing code had multiple error handling labels and did things
like checking if a buffer is not NULL before freeing it.

This patch collapses all of this into a single label. We can do this,
because the standard guarantees us that it is safe to call free() with
a NULL pointer.

This also has the side effect of removing the possibility of using the
wrong error label and accidentally leaking something.

Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
misc-utils/mtd_debug.c

index d65ad36614410def33b2494cbdc44f90b2aafb07..c0b710945c9e62fbb6d67a6e89561807956c6c73 100644 (file)
@@ -112,12 +112,12 @@ static int flash_to_file(int fd, off_t offset, size_t len, const char *filename)
 
        if (offset != lseek(fd, offset, SEEK_SET)) {
                perror("lseek()");
-               goto err0;
+               return 1;
        }
        outfd = creat(filename, 0666);
        if (outfd < 0) {
                perror("creat()");
-               goto err1;
+               return 1;
        }
 
 retry:
@@ -130,7 +130,7 @@ retry:
                        goto retry;
                }
                perror("malloc()");
-               goto err0;
+               goto fail;
        }
        do {
                if (n <= size)
@@ -139,7 +139,7 @@ retry:
                if (err < 0) {
                        fprintf(stderr, "%s: read, size %#x, n %#x\n", __func__, size, n);
                        perror("read()");
-                       goto err2;
+                       goto fail;
                }
                if (err < size) {
                        fprintf(stderr, "%s: short read, requested %#x, read %#x\n", __func__, size, err);
@@ -148,11 +148,11 @@ retry:
                if (err < 0) {
                        fprintf(stderr, "%s: write, size %#x, n %#x\n", __func__, size, n);
                        perror("write()");
-                       goto err2;
+                       goto fail;
                }
                if (err != size) {
                        fprintf(stderr, "Couldn't copy entire buffer to %s. (%d/%d bytes copied)\n", filename, err, size);
-                       goto err2;
+                       goto fail;
                }
                n -= size;
        } while (n > 0);
@@ -162,13 +162,9 @@ retry:
        close(outfd);
        printf("Copied %zu bytes from address 0x%.8llx in flash to %s\n", len, (unsigned long long)offset, filename);
        return 0;
-
-err2:
+fail:
        close(outfd);
-err1:
-       if (buf != NULL)
-               free(buf);
-err0:
+       free(buf);
        return 1;
 }