Commit 92a47824d8d4dc62728ebb4ec1962ec03ae92d85

Edward Thomson 2015-09-22T23:10:56

win32: propogate filename too long errors

diff --git a/src/win32/path_w32.c b/src/win32/path_w32.c
index 118e8bc..40b95c3 100644
--- a/src/win32/path_w32.c
+++ b/src/win32/path_w32.c
@@ -198,13 +198,13 @@ int git_win32_path_from_utf8(git_win32_path out, const char *src)
 	/* See if this is an absolute path (beginning with a drive letter) */
 	if (path__is_absolute(src)) {
 		if (git__utf8_to_16(dest, MAX_PATH, src) < 0)
-			return -1;
+			goto on_error;
 	}
 	/* File-prefixed NT-style paths beginning with \\?\ */
 	else if (path__is_nt_namespace(src)) {
 		/* Skip the NT prefix, the destination already contains it */
 		if (git__utf8_to_16(dest, MAX_PATH, src + PATH__NT_NAMESPACE_LEN) < 0)
-			return -1;
+			goto on_error;
 	}
 	/* UNC paths */
 	else if (path__is_unc(src)) {
@@ -213,36 +213,43 @@ int git_win32_path_from_utf8(git_win32_path out, const char *src)
 
 		/* Skip the leading "\\" */
 		if (git__utf8_to_16(dest, MAX_PATH - 2, src + 2) < 0)
-			return -1;
+			goto on_error;
 	}
 	/* Absolute paths omitting the drive letter */
 	else if (src[0] == '\\' || src[0] == '/') {
 		if (path__cwd(dest, MAX_PATH) < 0)
-			return -1;
+			goto on_error;
 
 		if (!path__is_absolute(dest)) {
 			errno = ENOENT;
-			return -1;
+			goto on_error;
 		}
 
 		/* Skip the drive letter specification ("C:") */	
 		if (git__utf8_to_16(dest + 2, MAX_PATH - 2, src) < 0)
-			return -1;
+			goto on_error;
 	}
 	/* Relative paths */
 	else {
 		int cwd_len;
 
 		if ((cwd_len = git_win32_path__cwd(dest, MAX_PATH)) < 0)
-			return -1;
+			goto on_error;
 
 		dest[cwd_len++] = L'\\';
 
 		if (git__utf8_to_16(dest + cwd_len, MAX_PATH - cwd_len, src) < 0)
-			return -1;
+			goto on_error;
 	}
 
 	return git_win32_path_canonicalize(out);
+
+on_error:
+	/* set windows error code so we can use its error message */
+	if (errno == ENAMETOOLONG)
+		SetLastError(ERROR_FILENAME_EXCED_RANGE);
+
+	return -1;
 }
 
 int git_win32_path_to_utf8(git_win32_utf8_path dest, const wchar_t *src)