From: Jeff King Date: Wed, 25 Jul 2012 16:16:19 +0000 (+0800) Subject: help.c::uniq: plug a leak X-Git-Tag: v1.7.12-rc1~12^2~1 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=4a15758f2ef97970694012cfd6da7c8449bc68c2;p=git.git 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 Signed-off-by: Tay Ray Chuan Signed-off-by: Junio C Hamano --- diff --git a/help.c b/help.c index 662349dd5..699149201 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; }