commit e45311301ff386e9a2f9ff3e613d520f57ad119b from: Stefan Sperling date: Wed Oct 09 07:35:37 2019 UTC do not leak open file in diff3.c's readin() error paths commit - 971405a7e47997a87d869bc30b3fca98083395dc commit + e45311301ff386e9a2f9ff3e613d520f57ad119b blob - 55321254697fa7c93407f495fdae6fe53a5efc06 blob + cf1c35d91591e39601a05ab6ad4cc83fc50c3a1f --- lib/diff3.c +++ lib/diff3.c @@ -587,12 +587,12 @@ readin(size_t *n, char *name, struct diff **dd, struct return got_error_from_errno2("fopen", name); err = getchange(&p, f, d3s); if (err) - return err; + goto done; for (i = 0; p; i++) { if (i >= d3s->szchanges - 1) { err = increase(d3s); if (err) - return err; + goto done; } a = b = number(&p); if (*p == ',') { @@ -618,18 +618,18 @@ readin(size_t *n, char *name, struct diff **dd, struct err = getchange(&p, f, d3s); if (err) - return err; + goto done; } if (i) { (*dd)[i].old.from = (*dd)[i - 1].old.to; (*dd)[i].new.from = (*dd)[i - 1].new.to; } - - if (fclose(f) != 0) +done: + if (fclose(f) != 0 && err == NULL) err = got_error_from_errno("fclose"); - - *n = i; + if (err == NULL) + *n = i; return err; }