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>
This commit is contained in:
parent
a1293ef7c3
commit
3a1b3126ed
9
config.c
9
config.c
@ -1934,6 +1934,8 @@ int git_config_set_multivar_in_file(const char *config_filename,
|
|||||||
int ret;
|
int ret;
|
||||||
struct lock_file *lock = NULL;
|
struct lock_file *lock = NULL;
|
||||||
char *filename_buf = NULL;
|
char *filename_buf = NULL;
|
||||||
|
char *contents = NULL;
|
||||||
|
size_t contents_sz;
|
||||||
|
|
||||||
/* parse-key returns negative; flip the sign to feed exit(3) */
|
/* parse-key returns negative; flip the sign to feed exit(3) */
|
||||||
ret = 0 - git_config_parse_key(key, &store.key, &store.baselen);
|
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;
|
goto write_err_out;
|
||||||
} else {
|
} else {
|
||||||
struct stat st;
|
struct stat st;
|
||||||
char *contents;
|
size_t copy_begin, copy_end;
|
||||||
size_t contents_sz, copy_begin, copy_end;
|
|
||||||
int i, new_line = 0;
|
int i, new_line = 0;
|
||||||
|
|
||||||
if (value_regex == NULL)
|
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) <
|
||||||
contents_sz - copy_begin)
|
contents_sz - copy_begin)
|
||||||
goto write_err_out;
|
goto write_err_out;
|
||||||
|
|
||||||
munmap(contents, contents_sz);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (commit_lock_file(lock) < 0) {
|
if (commit_lock_file(lock) < 0) {
|
||||||
@ -2130,6 +2129,8 @@ out_free:
|
|||||||
if (lock)
|
if (lock)
|
||||||
rollback_lock_file(lock);
|
rollback_lock_file(lock);
|
||||||
free(filename_buf);
|
free(filename_buf);
|
||||||
|
if (contents)
|
||||||
|
munmap(contents, contents_sz);
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
write_err_out:
|
write_err_out:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user