[PATCH] Fix export_marks() error handling.
- Don't leak one FILE * on error per export_marks() call. Found with
cppcheck and reported by Martin Ettl.
- Abort the potentially long for(;idnums.size;) loop on write errors.
- Add a trailing full-stop to error message when fopen() fails.
Signed-off-by: Matthias Andree <matthias.andree@gmx.de>
---
builtin-fast-export.c | 15 ++++++++++++---
1 files changed, 12 insertions(+), 3 deletions(-)
diff --git a/builtin-fast-export.c b/builtin-fast-export.c
index 9a8a6fc..6c0956d 100644
--- a/builtin-fast-export.c
+++ b/builtin-fast-export.c
@@ -428,21 +428,30 @@ static void export_marks(char *file)
uint32_t mark;
struct object_decoration *deco = idnums.hash;
FILE *f;
+ int e;
f = fopen(file, "w");
if (!f)
- error("Unable to open marks file %s for writing", file);
+ error("Unable to open marks file %s for writing.", file);
for (i = 0; i < idnums.size; i++) {
if (deco->base && deco->base->type == 1) {
mark = ptr_to_mark(deco->decoration);
- fprintf(f, ":%"PRIu32" %s\n", mark,
+ e = fprintf(f, ":%"PRIu32" %s\n", mark,
sha1_to_hex(deco->base->sha1));
+ if (e < 0) break;
}
deco++;
}
- if (ferror(f) || fclose(f))
+ /* do not optimize the next two lines - they must both be executed in
+ * this order. || might short-circuit the fclose(), and combining them
+ * into one statement might reverse the order of execution.
+ * Also, fflush() may not be sufficient - on some file systems, the
+ * error is still delayed until the final [f]close(). */
+ e = ferror(f);
+ e |= fclose(f);
+ if (e)
error("Unable to write marks file %s.", file);
}
--
1.6.3.3.385.g60647