git-clean: fix off-by-one memory access when given no arguments
authorJeff King <peff@peff.net>
Sat, 12 Jan 2008 09:04:32 +0000 (04:04 -0500)
committerJunio C Hamano <gitster@pobox.com>
Sat, 12 Jan 2008 19:10:09 +0000 (11:10 -0800)
The "seen" variable is used by match_pathspec, and must have
as many elements as there are in the given pathspec. We
create the pathspec either from the command line arguments
_or_ from just the current prefix.

Thus allocating "seen" based upon just argc is wrong, since
if argc == 0, then we still have one pathspec, the prefix,
but we don't allocate any space in "seen".

Signed-off-by: Jeff King <peff@peff.net>
Tested-by: İsmail Dönmez <ismail@pardus.org.tr>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin-clean.c

index 6cad8ea..eb853a3 100644 (file)
@@ -90,7 +90,7 @@ int cmd_clean(int argc, const char **argv, const char *prefix)
        strbuf_init(&directory, 0);
 
        if (pathspec)
        strbuf_init(&directory, 0);
 
        if (pathspec)
-               seen = xmalloc(argc);
+               seen = xmalloc(argc > 0 ? argc : 1);
 
        for (i = 0; i < dir.nr; i++) {
                struct dir_entry *ent = dir.entries[i];
 
        for (i = 0; i < dir.nr; i++) {
                struct dir_entry *ent = dir.entries[i];
@@ -125,7 +125,7 @@ int cmd_clean(int argc, const char **argv, const char *prefix)
                        continue;
 
                if (pathspec) {
                        continue;
 
                if (pathspec) {
-                       memset(seen, 0, argc);
+                       memset(seen, 0, argc > 0 ? argc : 1);
                        matches = match_pathspec(pathspec, ent->name, ent->len,
                                                 baselen, seen);
                } else {
                        matches = match_pathspec(pathspec, ent->name, ent->len,
                                                 baselen, seen);
                } else {