diff options
author | David Oberhollenzer <david.oberhollenzer@sigma-star.at> | 2019-11-10 15:01:32 +0100 |
---|---|---|
committer | David Oberhollenzer <david.oberhollenzer@sigma-star.at> | 2019-11-10 15:30:04 +0100 |
commit | c64eea6eac7fd4c48fcf8e64636765a1f4e4e03b (patch) | |
tree | 20080a9ad2a0342b6f7a4355db8f62849c917f14 | |
parent | c890094638880072cfa95a06cb1353f0214a11a0 (diff) |
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 <david.oberhollenzer@sigma-star.at>
-rw-r--r-- | misc-utils/mtd_debug.c | 20 |
1 files changed, 8 insertions, 12 deletions
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; } |