From: René Scharfe Date: Sun, 16 Apr 2017 16:55:46 +0000 (+0200) Subject: files_for_each_reflog_ent_reverse(): close stream and free strbuf on error X-Git-Tag: v2.13.0-rc1~20^2~1 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=be686f03e0f4c4f14f1d4ae9b1b35836168a0a4b;p=thirdparty%2Fgit.git files_for_each_reflog_ent_reverse(): close stream and free strbuf on error Exit the loop orderly through the cleanup code, instead of dashing out with logfp still open and sb leaking. Found with Cppcheck. Signed-off-by: Rene Scharfe Reviewed-by: Jeff King Reviewed-by: Michael Haggerty Signed-off-by: Junio C Hamano --- diff --git a/refs/files-backend.c b/refs/files-backend.c index c041d4ba21..10ba254941 100644 --- a/refs/files-backend.c +++ b/refs/files-backend.c @@ -3169,8 +3169,8 @@ static int files_for_each_reflog_ent_reverse(struct ref_store *ref_store, /* Jump to the end */ if (fseek(logfp, 0, SEEK_END) < 0) - return error("cannot seek back reflog for %s: %s", - refname, strerror(errno)); + ret = error("cannot seek back reflog for %s: %s", + refname, strerror(errno)); pos = ftell(logfp); while (!ret && 0 < pos) { int cnt; @@ -3180,13 +3180,17 @@ static int files_for_each_reflog_ent_reverse(struct ref_store *ref_store, /* Fill next block from the end */ cnt = (sizeof(buf) < pos) ? sizeof(buf) : pos; - if (fseek(logfp, pos - cnt, SEEK_SET)) - return error("cannot seek back reflog for %s: %s", - refname, strerror(errno)); + if (fseek(logfp, pos - cnt, SEEK_SET)) { + ret = error("cannot seek back reflog for %s: %s", + refname, strerror(errno)); + break; + } nread = fread(buf, cnt, 1, logfp); - if (nread != 1) - return error("cannot read %d bytes from reflog for %s: %s", - cnt, refname, strerror(errno)); + if (nread != 1) { + ret = error("cannot read %d bytes from reflog for %s: %s", + cnt, refname, strerror(errno)); + break; + } pos -= cnt; scanp = endp = buf + cnt;