diff options
author | Jeff King <peff@peff.net> | 2015-05-28 03:54:43 -0400 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2015-05-28 11:32:04 -0700 |
commit | 3a1b3126ed5a0b51d5b1fdba827c92bf2acf5fc6 (patch) | |
tree | 1818bbab5184b0774adb19b3fc6606e07f0d3256 | |
parent | read-cache.c: drop PROT_WRITE from mmap of index (diff) | |
download | tgif-3a1b3126ed5a0b51d5b1fdba827c92bf2acf5fc6.tar.xz |
config.c: fix mmap leak when writing config
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>
-rw-r--r-- | config.c | 9 |
1 files changed, 5 insertions, 4 deletions
@@ -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); @@ -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) @@ -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) { @@ -2130,6 +2129,8 @@ out_free: if (lock) rollback_lock_file(lock); free(filename_buf); + if (contents) + munmap(contents, contents_sz); return ret; write_err_out: |