[PATCH v2 1/4] help.c::uniq: plug a leak
- From
Tay Ray Chuan <rctay89@gmail.com>
- Date
- Jul 25, 2012, 16:16 UTC
- Message-ID
- <1343232982-10540-2-git-send-email-rctay89@gmail.com>
- In-Reply-To
- <1343232982-10540-1-git-send-email-rctay89@gmail.com>
From: Jeff King <peff@peff.net>
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>
---
Changed in v2: used Jeff's code from [1]. Patch text was also based on it.
[1] <20120506081213.GA27878@sigill.intra.peff.net> --- help.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/help.c b/help.c index 662349d..6991492 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; }
-- 1.7.11.1.116.g8228a23