mailsplit: fix FILE* leak in split_maildir

If we encounter an error while splitting a maildir, we exit
the function early, leaking the open filehandle. This isn't
a big deal, since we exit the program soon after, but it's
easy enough to be careful.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Jeff King
2015-09-24 17:03:05 -04:00
committed by Junio C Hamano
parent 7cd17e8057
commit d270d7b7a2

View File

@ -150,6 +150,7 @@ static int split_maildir(const char *maildir, const char *dir,
{ {
char file[PATH_MAX]; char file[PATH_MAX];
char name[PATH_MAX]; char name[PATH_MAX];
FILE *f = NULL;
int ret = -1; int ret = -1;
int i; int i;
struct string_list list = STRING_LIST_INIT_DUP; struct string_list list = STRING_LIST_INIT_DUP;
@ -160,7 +161,6 @@ static int split_maildir(const char *maildir, const char *dir,
goto out; goto out;
for (i = 0; i < list.nr; i++) { for (i = 0; i < list.nr; i++) {
FILE *f;
snprintf(file, sizeof(file), "%s/%s", maildir, list.items[i].string); snprintf(file, sizeof(file), "%s/%s", maildir, list.items[i].string);
f = fopen(file, "r"); f = fopen(file, "r");
if (!f) { if (!f) {
@ -177,10 +177,13 @@ static int split_maildir(const char *maildir, const char *dir,
split_one(f, name, 1); split_one(f, name, 1);
fclose(f); fclose(f);
f = NULL;
} }
ret = skip; ret = skip;
out: out:
if (f)
fclose(f);
string_list_clear(&list, 1); string_list_clear(&list, 1);
return ret; return ret;
} }