Skip to content

Commit

Permalink
config.c: fix mmap leak when writing config
Browse files Browse the repository at this point in the history
We mmap the existing config file, but fail to unmap it if we
hit an error. The function already has a shared exit path,
so we can fix this by moving the mmap pointer to the
function scope and clearing it in the shared exit.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Jeff King authored and Junio C Hamano committed May 28, 2015
1 parent a1293ef commit 3a1b312
Showing 1 changed file with 5 additions and 4 deletions.
9 changes: 5 additions & 4 deletions config.c
Original file line number Diff line number Diff line change
Expand Up @@ -1934,6 +1934,8 @@ int git_config_set_multivar_in_file(const char *config_filename,
int ret;
struct lock_file *lock = NULL;
char *filename_buf = NULL;
char *contents = NULL;
size_t contents_sz;

/* parse-key returns negative; flip the sign to feed exit(3) */
ret = 0 - git_config_parse_key(key, &store.key, &store.baselen);
Expand Down Expand Up @@ -1983,8 +1985,7 @@ int git_config_set_multivar_in_file(const char *config_filename,
goto write_err_out;
} else {
struct stat st;
char *contents;
size_t contents_sz, copy_begin, copy_end;
size_t copy_begin, copy_end;
int i, new_line = 0;

if (value_regex == NULL)
Expand Down Expand Up @@ -2103,8 +2104,6 @@ int git_config_set_multivar_in_file(const char *config_filename,
contents_sz - copy_begin) <
contents_sz - copy_begin)
goto write_err_out;

munmap(contents, contents_sz);
}

if (commit_lock_file(lock) < 0) {
Expand All @@ -2130,6 +2129,8 @@ int git_config_set_multivar_in_file(const char *config_filename,
if (lock)
rollback_lock_file(lock);
free(filename_buf);
if (contents)
munmap(contents, contents_sz);
return ret;

write_err_out:
Expand Down

0 comments on commit 3a1b312

Please sign in to comment.