[PATCH 1/1] bugfix for git-checkout-cache --prefix=/symlink/export_dir/ -a

DORMANTno replies

3 messages, 2 authors, 2016-06-15 · open the first message on its own page

[PATCH 1/1] bugfix for git-checkout-cache --prefix=/symlink/export_dir/ -a

From: David Greaves <hidden>
Date: 2016-06-15 22:41:58

If there's a prefix then allow symlinks to directories in it.
This fixes a bug where
  git-checkout-cache --prefix=/symlink/export_dir/ -a
otherwise fails.

Signed-off-by: David Greaves <redacted>

---
commit 18006ac69ae9db97b7d96fd0bfb1bdb6893e318d
tree 37580a3d32262d2cee7d28b20474c0f2ceb6faaa
parent 2aef5bbae99aeba3551408eae13faea02bf55b67
author David Greaves [off-list ref] Mon, 23 May 2005 09:42:04 +0100
committer David Greaves [off-list ref] Mon, 23 May 2005 09:42:04 +0100

 checkout-cache.c |    8 ++++++--
 1 files changed, 6 insertions(+), 2 deletions(-)

Index: checkout-cache.c
===================================================================
--- 99282828d5af15b0af0d0eac13a5b1194e88342c/checkout-cache.c  (mode:100644)
+++ 37580a3d32262d2cee7d28b20474c0f2ceb6faaa/checkout-cache.c  (mode:100644)
@@ -37,20 +37,25 @@
 #include "cache.h"
 
 static int force = 0, quiet = 0, not_new = 0, refresh_cache = 0;
+const char *base_dir = "";
 
 static void create_directories(const char *path)
 {
 	int len = strlen(path);
 	char *buf = xmalloc(len + 1);
 	const char *slash = path;
+	int baselen = strlen(base_dir);
 
 	while ((slash = strchr(slash+1, '/')) != NULL) {
+		struct stat st;
 		len = slash - path;
 		memcpy(buf, path, len);
 		buf[len] = 0;
+		if (slash - path <= baselen &&
+		    !stat(buf, &st) && S_ISDIR(st.st_mode))
+			continue; /* allow symlinks only in --prefix */
 		if (mkdir(buf, 0755)) {
 			if (errno == EEXIST) {
-				struct stat st;
 				if (!lstat(buf, &st) && S_ISDIR(st.st_mode))
 					continue; /* ok */
 				if (force && !unlink(buf) && !mkdir(buf, 0755))
@@ -229,7 +234,6 @@
 int main(int argc, char **argv)
 {
 	int i, force_filename = 0;
-	const char *base_dir = "";
 	struct cache_file cache_file;
 	int newfd = -1;
 

Re: [PATCH 1/1] bugfix for git-checkout-cache --prefix=/symlink/export_dir/ -a

From: Linus Torvalds <torvalds@osdl.org>
Date: 2016-06-15 22:41:58


On Mon, 23 May 2005, David Greaves wrote:
If there's a prefix then allow symlinks to directories in it.
This fixes a bug where
  git-checkout-cache --prefix=/symlink/export_dir/ -a
otherwise fails.
Hmm.. Does this alternative work for you instead?

[ Totally untested, please check for sanity first!! ]

		Linus

---
diff --git a/checkout-cache.c b/checkout-cache.c
--- a/checkout-cache.c
+++ b/checkout-cache.c
@@ -37,6 +37,8 @@
 #include "cache.h"
 
 static int force = 0, quiet = 0, not_new = 0, refresh_cache = 0;
+static const char *base_dir = "";
+static int base_dir_len = 0;
 
 static void create_directories(const char *path)
 {
@@ -51,10 +53,10 @@ static void create_directories(const cha
 		if (mkdir(buf, 0755)) {
 			if (errno == EEXIST) {
 				struct stat st;
-				if (!lstat(buf, &st) && S_ISDIR(st.st_mode))
-					continue; /* ok */
-				if (force && !unlink(buf) && !mkdir(buf, 0755))
+				if (len > base_dir_len && force && !unlink(buf) && !mkdir(buf, 0755))
 					continue;
+				if (!stat(buf, &st) && S_ISDIR(st.st_mode))
+					continue; /* ok */
 			}
 			die("cannot create directory at %s", buf);
 		}
@@ -163,11 +165,11 @@ static int write_entry(struct cache_entr
 	return 0;
 }
 
-static int checkout_entry(struct cache_entry *ce, const char *base_dir)
+static int checkout_entry(struct cache_entry *ce)
 {
 	struct stat st;
 	static char path[MAXPATHLEN+1];
-	int len = strlen(base_dir);
+	int len = base_dir_len;
 
 	memcpy(path, base_dir, len);
 	strcpy(path + len, ce->name);
@@ -194,7 +196,7 @@ static int checkout_entry(struct cache_e
 	return write_entry(ce, path);
 }
 
-static int checkout_file(const char *name, const char *base_dir)
+static int checkout_file(const char *name)
 {
 	int pos = cache_name_pos(name, strlen(name));
 	if (pos < 0) {
@@ -209,10 +211,10 @@ static int checkout_file(const char *nam
 		}
 		return -1;
 	}
-	return checkout_entry(active_cache[pos], base_dir);
+	return checkout_entry(active_cache[pos]);
 }
 
-static int checkout_all(const char *base_dir)
+static int checkout_all(void)
 {
 	int i;
 
@@ -220,7 +222,7 @@ static int checkout_all(const char *base
 		struct cache_entry *ce = active_cache[i];
 		if (ce_stage(ce))
 			continue;
-		if (checkout_entry(ce, base_dir) < 0)
+		if (checkout_entry(ce) < 0)
 			return -1;
 	}
 	return 0;
@@ -229,7 +231,6 @@ static int checkout_all(const char *base
 int main(int argc, char **argv)
 {
 	int i, force_filename = 0;
-	const char *base_dir = "";
 	struct cache_file cache_file;
 	int newfd = -1;
 
@@ -241,7 +242,7 @@ int main(int argc, char **argv)
 		const char *arg = argv[i];
 		if (!force_filename) {
 			if (!strcmp(arg, "-a")) {
-				checkout_all(base_dir);
+				checkout_all();
 				continue;
 			}
 			if (!strcmp(arg, "--")) {
@@ -272,10 +273,11 @@ int main(int argc, char **argv)
 			}
 			if (!memcmp(arg, "--prefix=", 9)) {
 				base_dir = arg+9;
+				base_dir_len = strlen(base_dir);
 				continue;
 			}
 		}
-		if (base_dir[0]) {
+		if (base_dir_len) {
 			/* when --prefix is specified we do not
 			 * want to update cache.
 			 */
@@ -285,7 +287,7 @@ int main(int argc, char **argv)
 			}
 			refresh_cache = 0;
 		}
-		checkout_file(arg, base_dir);
+		checkout_file(arg);
 	}
 
 	if (0 <= newfd &&

Re: [PATCH 1/1] bugfix for git-checkout-cache --prefix=/symlink/export_dir/ -a

From: Linus Torvalds <torvalds@osdl.org>
Date: 2016-06-15 22:41:58


On Mon, 23 May 2005, Linus Torvalds wrote:
quoted
otherwise fails.
Hmm.. Does this alternative work for you instead?

[ Totally untested, please check for sanity first!! ]
Btw, I'm not going to apply this, and expect that David or somebody else 
can validate it and send it back to me as "tested".

		Linus
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help