summaryrefslogtreecommitdiff
path: root/help.c
diff options
context:
space:
mode:
authorJeff King <peff@peff.net>2012-07-26 00:16:19 +0800
committerJunio C Hamano <gitster@pobox.com>2012-07-25 10:23:54 -0700
commit4a15758f2ef97970694012cfd6da7c8449bc68c2 (patch)
tree6b013d6ee1975c514297e22427ef23dbe1ac5e0c /help.c
parent476109fa4c261c57cf20858b1879d5fede32e32c (diff)
downloadgit-4a15758f2ef97970694012cfd6da7c8449bc68c2.tar.gz
help.c::uniq: plug a leak
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>
Diffstat (limited to 'help.c')
-rw-r--r--help.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/help.c b/help.c
index 662349dd56..699149201e 100644
--- 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;
}