From d34e70d6b89b33c398403e872c0dd751d44c7844 Mon Sep 17 00:00:00 2001
From: Karsten Blees <karsten.blees@dcon.de>
Date: Tue, 6 Mar 2012 10:18:41 +0100
Subject: [PATCH] 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>
---
 builtin/prune-packed.c | 4 ++--
 builtin/prune.c        | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/builtin/prune-packed.c b/builtin/prune-packed.c
index f9463deec2..b58a2e1eb2 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);
 }
diff --git a/builtin/prune.c b/builtin/prune.c
index 58d7cb8324..b99b635e44 100644
--- a/builtin/prune.c
+++ b/builtin/prune.c
@@ -85,9 +85,9 @@ static int prune_dir(int i, char *path)
 		}
 		fprintf(stderr, "bad sha1 file: %s/%s\n", path, de->d_name);
 	}
+	closedir(dir);
 	if (!show_only)
 		rmdir(path);
-	closedir(dir);
 	return 0;
 }
 
-- 
GitLab