From 1f0fd4c28080a97c83a87e1df5b863cb79cc27e9 Mon Sep 17 00:00:00 2001 From: zeho11 Date: Tue, 31 Jan 2023 19:13:10 +0800 Subject: [PATCH] Update --- tst/passthrough-fuse/passthrough-fuse.c | 2 +- tst/passthrough-fuse/winposix.c | 81 +++++++++++++++---------- tst/passthrough-fuse3/winposix.c | 81 +++++++++++++++---------- 3 files changed, 97 insertions(+), 67 deletions(-) diff --git a/tst/passthrough-fuse/passthrough-fuse.c b/tst/passthrough-fuse/passthrough-fuse.c index 94619b9e..5ea813e5 100644 --- a/tst/passthrough-fuse/passthrough-fuse.c +++ b/tst/passthrough-fuse/passthrough-fuse.c @@ -461,7 +461,7 @@ int main(int argc, char *argv[]) #if defined(_WIN64) || defined(_WIN32) { - char buf[PATH_MAX * 4]; + char buf[PATH_MAX]; if (-1 != getpath(ptfs.rootdir, buf, sizeof buf)) { ptfs.rootlen = strlen(buf); diff --git a/tst/passthrough-fuse/winposix.c b/tst/passthrough-fuse/winposix.c index 99c8c57b..82d6068c 100644 --- a/tst/passthrough-fuse/winposix.c +++ b/tst/passthrough-fuse/winposix.c @@ -121,7 +121,7 @@ char *realpath(const char *path, char *resolved) if (0 == resolved) { - result = malloc(PATH_MAX * 4); /* sets errno */ + result = malloc(PATH_MAX); /* sets errno */ if (0 == result) return 0; } @@ -132,7 +132,9 @@ char *realpath(const char *path, char *resolved) WCHAR PathBuf[PATH_MAX]; WCHAR ResultBuf[PATH_MAX]; PWSTR ResultBufBgn = &ResultBuf[6]; - if (0 < MultiByteToWideChar(CP_UTF8, 0, path, -1, PathBuf, PATH_MAX)) + if (0 == MultiByteToWideChar(CP_UTF8, 0, path, -1, PathBuf, PATH_MAX)) + err = GetLastError(); + else { DWORD len = GetFullPathNameW(PathBuf, PATH_MAX - 6, ResultBufBgn, 0); if (0 == len) @@ -141,30 +143,32 @@ char *realpath(const char *path, char *resolved) err = ERROR_INVALID_PARAMETER; else { - WideCharToMultiByte(CP_UTF8, 0, ResultBufBgn, -1, result, PATH_MAX * 4, 0, 0); - if (L'\\' == ResultBufBgn[0] && L'\\' == ResultBufBgn[1]) - { - ResultBufBgn = ResultBuf; - ResultBufBgn[0] = L'\\'; - ResultBufBgn[1] = L'\\'; - ResultBufBgn[2] = L'?'; - ResultBufBgn[3] = L'\\'; - ResultBufBgn[4] = L'U'; - ResultBufBgn[5] = L'N'; - ResultBufBgn[6] = L'C'; - } + if (0 == WideCharToMultiByte(CP_UTF8, 0, ResultBufBgn, -1, result, PATH_MAX, 0, 0)) + err = GetLastError(); else { - ResultBufBgn = &ResultBuf[2]; - ResultBufBgn[0] = L'\\'; - ResultBufBgn[1] = L'\\'; - ResultBufBgn[2] = L'?'; - ResultBufBgn[3] = L'\\'; + if (L'\\' == ResultBufBgn[0] && L'\\' == ResultBufBgn[1]) + { + ResultBufBgn = ResultBuf; + ResultBufBgn[0] = L'\\'; + ResultBufBgn[1] = L'\\'; + ResultBufBgn[2] = L'?'; + ResultBufBgn[3] = L'\\'; + ResultBufBgn[4] = L'U'; + ResultBufBgn[5] = L'N'; + ResultBufBgn[6] = L'C'; + } + else + { + ResultBufBgn = &ResultBuf[2]; + ResultBufBgn[0] = L'\\'; + ResultBufBgn[1] = L'\\'; + ResultBufBgn[2] = L'?'; + ResultBufBgn[3] = L'\\'; + } } } } - else - err = GetLastError(); if (0 == err) { @@ -189,7 +193,7 @@ char *realpath(const char *path, char *resolved) return result; } -int uncpath(const char *path, WCHAR *buf, int nchar) +static int uncpath(const char *path, WCHAR *buf, int nchar) { PWSTR BufP = 0; if ('\\' == path[0] && '\\' == path[1]) @@ -221,20 +225,31 @@ int uncpath(const char *path, WCHAR *buf, int nchar) } } - if (BufP) + if (0 == BufP) { - while (*BufP) - { - if (L'/' == *BufP) - *BufP = L'\\'; - BufP++; - } - return 1; + if (0 < nchar) + buf[0] = 0; + return 0; } - if (0 < nchar) - buf[0] = 0; - return 0; + PWSTR P = BufP; + while (*BufP) + { + if (L'/' == *BufP || L'\\' == *BufP) + { + while (L'/' == BufP[1] || L'\\' == BufP[1]) + BufP++; + } + if (L'/' == *BufP) + *P = L'\\'; + else if (P != BufP) + *P = *BufP; + BufP++; + P++; + } + if (P != BufP) + *P = 0; + return 1; } int statvfs(const char *path, struct fuse_statvfs *stbuf) diff --git a/tst/passthrough-fuse3/winposix.c b/tst/passthrough-fuse3/winposix.c index f8468500..ab042d29 100644 --- a/tst/passthrough-fuse3/winposix.c +++ b/tst/passthrough-fuse3/winposix.c @@ -121,7 +121,7 @@ char *realpath(const char *path, char *resolved) if (0 == resolved) { - result = malloc(PATH_MAX * 4); /* sets errno */ + result = malloc(PATH_MAX); /* sets errno */ if (0 == result) return 0; } @@ -132,7 +132,9 @@ char *realpath(const char *path, char *resolved) WCHAR PathBuf[PATH_MAX]; WCHAR ResultBuf[PATH_MAX]; PWSTR ResultBufBgn = &ResultBuf[6]; - if (0 < MultiByteToWideChar(CP_UTF8, 0, path, -1, PathBuf, PATH_MAX)) + if (0 == MultiByteToWideChar(CP_UTF8, 0, path, -1, PathBuf, PATH_MAX)) + err = GetLastError(); + else { DWORD len = GetFullPathNameW(PathBuf, PATH_MAX - 6, ResultBufBgn, 0); if (0 == len) @@ -141,30 +143,32 @@ char *realpath(const char *path, char *resolved) err = ERROR_INVALID_PARAMETER; else { - WideCharToMultiByte(CP_UTF8, 0, ResultBufBgn, -1, result, PATH_MAX * 4, 0, 0); - if (L'\\' == ResultBufBgn[0] && L'\\' == ResultBufBgn[1]) - { - ResultBufBgn = ResultBuf; - ResultBufBgn[0] = L'\\'; - ResultBufBgn[1] = L'\\'; - ResultBufBgn[2] = L'?'; - ResultBufBgn[3] = L'\\'; - ResultBufBgn[4] = L'U'; - ResultBufBgn[5] = L'N'; - ResultBufBgn[6] = L'C'; - } + if (0 == WideCharToMultiByte(CP_UTF8, 0, ResultBufBgn, -1, result, PATH_MAX, 0, 0)) + err = GetLastError(); else { - ResultBufBgn = &ResultBuf[2]; - ResultBufBgn[0] = L'\\'; - ResultBufBgn[1] = L'\\'; - ResultBufBgn[2] = L'?'; - ResultBufBgn[3] = L'\\'; + if (L'\\' == ResultBufBgn[0] && L'\\' == ResultBufBgn[1]) + { + ResultBufBgn = ResultBuf; + ResultBufBgn[0] = L'\\'; + ResultBufBgn[1] = L'\\'; + ResultBufBgn[2] = L'?'; + ResultBufBgn[3] = L'\\'; + ResultBufBgn[4] = L'U'; + ResultBufBgn[5] = L'N'; + ResultBufBgn[6] = L'C'; + } + else + { + ResultBufBgn = &ResultBuf[2]; + ResultBufBgn[0] = L'\\'; + ResultBufBgn[1] = L'\\'; + ResultBufBgn[2] = L'?'; + ResultBufBgn[3] = L'\\'; + } } } } - else - err = GetLastError(); if (0 == err) { @@ -189,7 +193,7 @@ char *realpath(const char *path, char *resolved) return result; } -int uncpath(const char *path, WCHAR *buf, int nchar) +static int uncpath(const char *path, WCHAR *buf, int nchar) { PWSTR BufP = 0; if ('\\' == path[0] && '\\' == path[1]) @@ -221,20 +225,31 @@ int uncpath(const char *path, WCHAR *buf, int nchar) } } - if (BufP) + if (0 == BufP) { - while (*BufP) - { - if (L'/' == *BufP) - *BufP = L'\\'; - BufP++; - } - return 1; + if (0 < nchar) + buf[0] = 0; + return 0; } - if (0 < nchar) - buf[0] = 0; - return 0; + PWSTR P = BufP; + while (*BufP) + { + if (L'/' == *BufP || L'\\' == *BufP) + { + while (L'/' == BufP[1] || L'\\' == BufP[1]) + BufP++; + } + if (L'/' == *BufP) + *P = L'\\'; + else if (P != BufP) + *P = *BufP; + BufP++; + P++; + } + if (P != BufP) + *P = 0; + return 1; } int statvfs(const char *path, struct fuse_statvfs *stbuf)