config: move flockfile() closer to unlocked functions
Commit 260d408e32
(config: use getc_unlocked when reading
from file, 2015-04-16) taught git_config_from_file() to lock
the filehandle so that we could safely use the faster
unlocked functions to access the handle.
However, it split the logic into two places:
1. The master lock/unlock happens in git_config_from_file().
2. The decision to use the unlocked functions happens in
do_config_from_file().
That means that if anybody calls the latter function, they
will accidentally use the unlocked functions without holding
the lock. And indeed, git_config_from_stdin() does so.
In practice, this hasn't been a problem since this code
isn't generally multi-threaded (and even if some Git program
happened to have another thread running, it's unlikely to be
reading from stdin). But it's a good practice to make sure
we're always holding the lock before using the unlocked
functions.
Helped-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
3013dff866
commit
05e293c1ac
8
config.c
8
config.c
@ -1408,6 +1408,7 @@ static int do_config_from_file(config_fn_t fn,
|
||||
void *data)
|
||||
{
|
||||
struct config_source top;
|
||||
int ret;
|
||||
|
||||
top.u.file = f;
|
||||
top.origin_type = origin_type;
|
||||
@ -1418,7 +1419,10 @@ static int do_config_from_file(config_fn_t fn,
|
||||
top.do_ungetc = config_file_ungetc;
|
||||
top.do_ftell = config_file_ftell;
|
||||
|
||||
return do_config_from(&top, fn, data);
|
||||
flockfile(f);
|
||||
ret = do_config_from(&top, fn, data);
|
||||
funlockfile(f);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int git_config_from_stdin(config_fn_t fn, void *data)
|
||||
@ -1433,9 +1437,7 @@ int git_config_from_file(config_fn_t fn, const char *filename, void *data)
|
||||
|
||||
f = fopen_or_warn(filename, "r");
|
||||
if (f) {
|
||||
flockfile(f);
|
||||
ret = do_config_from_file(fn, CONFIG_ORIGIN_FILE, filename, filename, f, data);
|
||||
funlockfile(f);
|
||||
fclose(f);
|
||||
}
|
||||
return ret;
|
||||
|
Loading…
Reference in New Issue
Block a user