help.c::uniq: plug a leak
authorJeff King <peff@peff.net>
Wed, 25 Jul 2012 16:16:19 +0000 (00:16 +0800)
committerJunio C Hamano <gitster@pobox.com>
Wed, 25 Jul 2012 17:23:54 +0000 (10:23 -0700)
We observe that the j-1 element can serve the same purpose as the i-1
element that we use in the strcmp(); it is either:

1. Exactly i-1, when the loop begins (and until we see a duplicate).

2. The same pointer that was stored at i-1 (if it was not a duplicate,
and we just copied it into place).

3. A pointer to an equivalent string (i.e., we rejected i-1 _because_
it was identical to j-1).

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Tay Ray Chuan <rctay89@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
help.c
diff --git a/help.c b/help.c
index 662349dd56fd31d2ea2635657887640f43ce947c..699149201ed72070492247a6fb3da213de8e0808 100644 (file)
--- a/help.c
+++ b/help.c
@@ -44,9 +44,12 @@ static void uniq(struct cmdnames *cmds)
        if (!cmds->cnt)
                return;
 
-       for (i = j = 1; i < cmds->cnt; i++)
-               if (strcmp(cmds->names[i]->name, cmds->names[i-1]->name))
+       for (i = j = 1; i < cmds->cnt; i++) {
+               if (!strcmp(cmds->names[i]->name, cmds->names[j-1]->name))
+                       free(cmds->names[i]);
+               else
                        cmds->names[j++] = cmds->names[i];
+       }
 
        cmds->cnt = j;
 }