From c64eea6eac7fd4c48fcf8e64636765a1f4e4e03b Mon Sep 17 00:00:00 2001 From: David Oberhollenzer Date: Sun, 10 Nov 2019 15:01:32 +0100 Subject: mtd_debug: cleanup error handling in flash_to_file 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 --- misc-utils/mtd_debug.c | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) (limited to 'misc-utils') diff --git a/misc-utils/mtd_debug.c b/misc-utils/mtd_debug.c index d65ad36..c0b7109 100644 --- a/misc-utils/mtd_debug.c +++ b/misc-utils/mtd_debug.c @@ -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; } -- cgit v1.2.3