[PATCH] fix crash in path.c on Windows

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Use PATH_SEP and is_absolute_path() instead of using Unix conventions
to enhance portability.  On Windows, the assert() fails almost always
without this change.

Also convert all backslashes in DOS-style paths to slashes, as that's
what git uses internally.

Signed-off-by: Rene Scharfe <rene.scharfe@xxxxxxxxxxxxxx>
---
The patch doesn't fix t1504 on Windows, but it allows one to at least
run this test without git crashing multiple times due to the failed
assertion.  The test case "first_of_two" still fails, due to the
weird translation applied to environment variables like
$GIT_CEILING_DIRECTORIES.  Is there a method to it?  Here some
experiments:

	set a=	getenv("a")
	======= ===========
	c	c
	/c	c:/
	c/	c/
	/c/	c:/
	c:c	c:c
	/c:c	c:c
	c:/c	c:/c
	/c:/c	c:/c
	c/:/c	c\;c:\
	/c:c/	c:c/
	/c/:c	/c/:c
	/c/:/c	c:\;c:\
	/c:/c/	c:/c/
	/c/:/c/	c:\;c:\

The test case can be convinced to pass by replacing "bar" with
"/bar", but I'm not sure that's the right fix.  Shouldn't we warn on
invalid paths in $GIT_CEILING_DIRECTORIES?

 path.c |   13 +++++++++++--
 1 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/path.c b/path.c
index a074aea..4cae7f6 100644
--- a/path.c
+++ b/path.c
@@ -387,7 +387,7 @@ int normalize_absolute_path(char *buf, const char *path)
 	assert(path);
 
 	while (*comp_start) {
-		assert(*comp_start == '/');
+		assert(is_absolute_path(comp_start));
 		while (*++comp_end && *comp_end != '/')
 			; /* nothing */
 		comp_len = comp_end - comp_start;
@@ -438,11 +438,20 @@ int longest_ancestor_length(const char *path, const char *prefix_list)
 		return -1;
 
 	for (colon = ceil = prefix_list; *colon; ceil = colon+1) {
-		for (colon = ceil; *colon && *colon != ':'; colon++);
+		for (colon = ceil; *colon && *colon != PATH_SEP; colon++);
 		len = colon - ceil;
 		if (len == 0 || len > PATH_MAX || !is_absolute_path(ceil))
 			continue;
 		strlcpy(buf, ceil, len+1);
+
+		if (has_dos_drive_prefix(buf)) {
+			char *p;
+			for (p = buf; *p; p++) {
+				if (*p == '\\')
+					*p = '/';
+			}
+		}
+
 		len = normalize_absolute_path(buf, buf);
 		/* Strip "trailing slashes" from "/". */
 		if (len == 1)
-- 
1.6.1.2
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux