summaryrefslogtreecommitdiff
path: root/trace.c
diff options
context:
space:
mode:
authorJeff King <peff@peff.net>2016-08-03 22:56:57 (GMT)
committerJunio C Hamano <gitster@pobox.com>2016-08-04 20:33:27 (GMT)
commitc81539b5f6f608ec48358ca6a35f7323e96432e1 (patch)
tree6ef4b02d1f0c984d7f84796826dca4eb856ebf8b /trace.c
parent80460f513ebd7851953f5402dd9744236128b240 (diff)
downloadgit-c81539b5f6f608ec48358ca6a35f7323e96432e1.zip
git-c81539b5f6f608ec48358ca6a35f7323e96432e1.tar.gz
git-c81539b5f6f608ec48358ca6a35f7323e96432e1.tar.bz2
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.c20
1 files changed, 16 insertions, 4 deletions
diff --git a/trace.c b/trace.c
index 4aeea60..f204a7d 100644
--- a/trace.c
+++ b/trace.c
@@ -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;