]> git.proxmox.com Git - libgit2.git/commitdiff
win32: propogate filename too long errors
authorEdward Thomson <ethomson@edwardthomson.com>
Wed, 23 Sep 2015 03:10:56 +0000 (23:10 -0400)
committerEdward Thomson <ethomson@edwardthomson.com>
Wed, 23 Sep 2015 03:10:56 +0000 (23:10 -0400)
src/win32/path_w32.c

index 118e8bcc568b529759eba8e88e138871bb7d4ed9..40b95c33ba14b77aeab12ce62ef3ad5080734f0a 100644 (file)
@@ -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)