From: Michael Haggerty Date: Tue, 24 Apr 2012 22:45:13 +0000 (+0200) Subject: do_for_each_reflog(): return early on error X-Git-Tag: v1.7.11-rc0~49^2~11 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=93c603fcb7bfbe3d4bfb108463166b850de638f3;p=git.git do_for_each_reflog(): return early on error Signed-off-by: Michael Haggerty Signed-off-by: Junio C Hamano --- diff --git a/refs.c b/refs.c index afd0cf75b..8c39bd76e 100644 --- a/refs.c +++ b/refs.c @@ -2246,47 +2246,47 @@ static int do_for_each_reflog(const char *base, each_ref_fn fn, void *cb_data) { DIR *d = opendir(git_path("logs/%s", base)); int retval = 0; + struct dirent *de; + int baselen; + char *log; - if (d) { - struct dirent *de; - int baselen = strlen(base); - char *log = xmalloc(baselen + 257); + if (!d) + return *base ? errno : 0; - memcpy(log, base, baselen); - if (baselen && base[baselen-1] != '/') - log[baselen++] = '/'; + baselen = strlen(base); + log = xmalloc(baselen + 257); + memcpy(log, base, baselen); + if (baselen && base[baselen-1] != '/') + log[baselen++] = '/'; - while ((de = readdir(d)) != NULL) { - struct stat st; - int namelen; + while ((de = readdir(d)) != NULL) { + struct stat st; + int namelen; - if (de->d_name[0] == '.') - continue; - namelen = strlen(de->d_name); - if (namelen > 255) - continue; - if (has_extension(de->d_name, ".lock")) - continue; - memcpy(log + baselen, de->d_name, namelen+1); - if (stat(git_path("logs/%s", log), &st) < 0) - continue; - if (S_ISDIR(st.st_mode)) { - retval = do_for_each_reflog(log, fn, cb_data); - } else { - unsigned char sha1[20]; - if (read_ref_full(log, sha1, 0, NULL)) - retval = error("bad ref for %s", log); - else - retval = fn(log, sha1, 0, cb_data); - } - if (retval) - break; + if (de->d_name[0] == '.') + continue; + namelen = strlen(de->d_name); + if (namelen > 255) + continue; + if (has_extension(de->d_name, ".lock")) + continue; + memcpy(log + baselen, de->d_name, namelen+1); + if (stat(git_path("logs/%s", log), &st) < 0) + continue; + if (S_ISDIR(st.st_mode)) { + retval = do_for_each_reflog(log, fn, cb_data); + } else { + unsigned char sha1[20]; + if (read_ref_full(log, sha1, 0, NULL)) + retval = error("bad ref for %s", log); + else + retval = fn(log, sha1, 0, cb_data); } - free(log); - closedir(d); + if (retval) + break; } - else if (*base) - return errno; + free(log); + closedir(d); return retval; }