Skip to content

Commit

Permalink
Fix export_marks() error handling.
Browse files Browse the repository at this point in the history
- 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.

- Record error if fprintf() fails for reasons not required to set the
  stream error indicator, such as ENOMEM.

- Add a trailing full-stop to error message when fopen() fails.

Signed-off-by: Matthias Andree <matthias.andree@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Matthias Andree authored and Junio C Hamano committed Jul 24, 2009
1 parent 7e9ff00 commit 96d69b5
Showing 1 changed file with 10 additions and 4 deletions.
14 changes: 10 additions & 4 deletions builtin-fast-export.c
Original file line number Diff line number Diff line change
Expand Up @@ -428,21 +428,27 @@ static void export_marks(char *file)
uint32_t mark;
struct object_decoration *deco = idnums.hash;
FILE *f;
int e = 0;

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,
sha1_to_hex(deco->base->sha1));
if (fprintf(f, ":%"PRIu32" %s\n", mark,
sha1_to_hex(deco->base->sha1)) < 0) {
e = 1;
break;
}
}
deco++;
}

if (ferror(f) || fclose(f))
e |= ferror(f);
e |= fclose(f);
if (e)
error("Unable to write marks file %s.", file);
}

Expand Down

0 comments on commit 96d69b5

Please sign in to comment.