Re: [PATCH] fix crash in path.c on Windows
- From
Johannes Sixt <j.sixt@viscovery.net>
- Date
- Feb 5, 2009, 07:57 UTC
- Message-ID
- <498A9C01.6020602@viscovery.net>
- In-Reply-To
- <498A1E1E.8010901@lsrfire.ath.cx>
René Scharfe schrieb:
Show 16 quoted lines
> 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:\Bash translates leading single-letter path components to drive prefix notation if it invokes a non-MSYS program; and it also translates ':' to ';' if the value looks like a path list. Sometimes there is an ambiguity and bash guesses wrong.
Show 9 quoted lines
> @@ -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;Junio has pointed out your thinko here. Furthermore, *all* uses of '/' in this loop must be replaced by is_dir_sep().
But I would really appreciate if you could unify normalize_absolute_path() with setup.c's sanitary_path_copy() because they do almost the same thing (and the latter already works on Windows).
Show 17 quoted lines
> @@ -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 = '/';
> + }IMNSHO this is a kind of normalization and, therefore, must be done by normalize_absolute_path() (sanitary_path_copy() already does this).
Show 5 quoted lines
> + } > + > len = normalize_absolute_path(buf, buf); > /* Strip "trailing slashes" from "/". */ > if (len == 1)
-- Hannes