summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2019-11-10 15:01:32 +0100
committerDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2019-11-10 15:30:04 +0100
commitc64eea6eac7fd4c48fcf8e64636765a1f4e4e03b (patch)
tree20080a9ad2a0342b6f7a4355db8f62849c917f14
parentc890094638880072cfa95a06cb1353f0214a11a0 (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.c20
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;
}