diff options
author | Jeff King <peff@peff.net> | 2016-08-03 18:56:57 -0400 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2016-08-04 13:33:27 -0700 |
commit | c81539b5f6f608ec48358ca6a35f7323e96432e1 (patch) | |
tree | 6ef4b02d1f0c984d7f84796826dca4eb856ebf8b /trace.c | |
parent | 80460f513ebd7851953f5402dd9744236128b240 (diff) | |
download | git-c81539b5f6f608ec48358ca6a35f7323e96432e1.tar.gz |
trace: handle NULL argument in trace_disable()
All of the trace functions treat a NULL key as a synonym for
the default GIT_TRACE key. Except for trace_disable(), which
will segfault.
Fortunately, this can't cause any bugs, as the function has
no callers. But rather than drop it, let's fix the bug, as I
plan to add a caller.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'trace.c')
-rw-r--r-- | trace.c | 20 |
1 files changed, 16 insertions, 4 deletions
@@ -25,15 +25,25 @@ #include "cache.h" #include "quote.h" +/* + * "Normalize" a key argument by converting NULL to our trace_default, + * and otherwise passing through the value. All caller-facing functions + * should normalize their inputs in this way, though most get it + * for free by calling get_trace_fd() (directly or indirectly). + */ +static void normalize_trace_key(struct trace_key **key) +{ + static struct trace_key trace_default = { "GIT_TRACE" }; + if (!*key) + *key = &trace_default; +} + /* Get a trace file descriptor from "key" env variable. */ static int get_trace_fd(struct trace_key *key) { - static struct trace_key trace_default = { "GIT_TRACE" }; const char *trace; - /* use default "GIT_TRACE" if NULL */ - if (!key) - key = &trace_default; + normalize_trace_key(&key); /* don't open twice */ if (key->initialized) @@ -75,6 +85,8 @@ static int get_trace_fd(struct trace_key *key) void trace_disable(struct trace_key *key) { + normalize_trace_key(&key); + if (key->need_close) close(key->fd); key->fd = 0; |