summaryrefslogtreecommitdiff
path: root/builtin/prune-packed.c
diff options
context:
space:
mode:
authorKarsten Blees <karsten.blees@dcon.de>2012-03-06 09:18:41 (GMT)
committerJunio C Hamano <gitster@pobox.com>2012-03-07 18:24:33 (GMT)
commitd34e70d6b89b33c398403e872c0dd751d44c7844 (patch)
treeb674f854d00d2145951d93076eb5f5c426d8de24 /builtin/prune-packed.c
parent0dbe6592ccbd1a394a69a52074e3729d546fe952 (diff)
downloadgit-d34e70d6b89b33c398403e872c0dd751d44c7844.zip
git-d34e70d6b89b33c398403e872c0dd751d44c7844.tar.gz
git-d34e70d6b89b33c398403e872c0dd751d44c7844.tar.bz2
fix deletion of .git/objects sub-directories in git-prune/repack
Both git-prune and git-repack (and thus, git-gc) try to rmdir while holding a DIR* handle on the directory. This can leave dangling empty directories in the .git/objects on platforms where directory cannot be removed while they are open. First call closedir() and then rmdir(); that is more logical ordering. Reported-by: John Chen <john0312@gmail.com> Reported-by: Stefan Naewe <stefan.naewe@gmail.com> Signed-off-by: Karsten Blees <blees@dcon.de> Improved-and-Acked-by: Johannes Sixt <j6t@kdbg.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'builtin/prune-packed.c')
-rw-r--r--builtin/prune-packed.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/builtin/prune-packed.c b/builtin/prune-packed.c
index f9463de..b58a2e1 100644
--- a/builtin/prune-packed.c
+++ b/builtin/prune-packed.c
@@ -35,8 +35,6 @@ static void prune_dir(int i, DIR *dir, char *pathname, int len, int opts)
unlink_or_warn(pathname);
display_progress(progress, i + 1);
}
- pathname[len] = 0;
- rmdir(pathname);
}
void prune_packed_objects(int opts)
@@ -65,6 +63,8 @@ void prune_packed_objects(int opts)
continue;
prune_dir(i, d, pathname, len + 3, opts);
closedir(d);
+ pathname[len + 2] = '\0';
+ rmdir(pathname);
}
stop_progress(&progress);
}