diff options
Diffstat (limited to 'pr/src/md/windows/ntio.c')
-rw-r--r-- | pr/src/md/windows/ntio.c | 24 |
1 files changed, 19 insertions, 5 deletions
diff --git a/pr/src/md/windows/ntio.c b/pr/src/md/windows/ntio.c index defaae4d..6c7ae3b0 100644 --- a/pr/src/md/windows/ntio.c +++ b/pr/src/md/windows/ntio.c @@ -20,6 +20,7 @@ * the Initial Developer. All Rights Reserved. * * Contributor(s): + * Masayuki Nakano <masayuki@d-toybox.com> * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or @@ -108,6 +109,8 @@ static const PRTime _pr_filetime_offset = 116444736000000000LL; static const PRTime _pr_filetime_offset = 116444736000000000i64; #endif +static PRBool IsPrevCharSlash(const char *str, const char *current); + #define _NEED_351_FILE_LOCKING_HACK #ifdef _NEED_351_FILE_LOCKING_HACK #define _PR_LOCAL_FILE 1 @@ -2769,7 +2772,7 @@ _PR_MD_OPEN_DIR(_MDDir *d, const char *name) * If 'name' ends in a slash or backslash, do not append * another backslash. */ - if (filename[len - 1] == '/' || filename[len - 1] == '\\') { + if (IsPrevCharSlash(filename, filename + len)) { len--; } strcpy(&filename[len], "\\*.*"); @@ -2907,7 +2910,7 @@ _PR_MD_STAT(const char *fn, struct stat *info) int len = strlen(fn); if (len > 0 && len <= _MAX_PATH - && (fn[len - 1] == '\\' || fn[len - 1] == '/')) { + && IsPrevCharSlash(fn, fn + len)) { char newfn[_MAX_PATH + 1]; strcpy(newfn, fn); @@ -2924,6 +2927,17 @@ _PR_MD_STAT(const char *fn, struct stat *info) #define _PR_IS_SLASH(ch) ((ch) == '/' || (ch) == '\\') +static PRBool +IsPrevCharSlash(const char *str, const char *current) +{ + const char *prev; + + if (str >= current) + return PR_FALSE; + prev = _mbsdec(str, current); + return (prev == current - 1) && _PR_IS_SLASH(*prev); +} + /* * IsRootDirectory -- * @@ -2970,7 +2984,7 @@ IsRootDirectory(char *fn, size_t buflen) /* look for the next slash */ do { - p++; + p = _mbsinc(p); } while (*p != '\0' && !_PR_IS_SLASH(*p)); if (*p == '\0') { return PR_FALSE; @@ -2984,7 +2998,7 @@ IsRootDirectory(char *fn, size_t buflen) /* look for the final slash */ do { - p++; + p = _mbsinc(p); } while (*p != '\0' && !_PR_IS_SLASH(*p)); if (_PR_IS_SLASH(*p) && p[1] != '\0') { return PR_FALSE; @@ -3074,7 +3088,7 @@ _PR_MD_GETFILEINFO64(const char *fn, PRFileInfo64 *info) info->creationTime = 0; return 0; } - if (!_PR_IS_SLASH(pathbuf[len - 1])) { + if (!IsPrevCharSlash(pathbuf, pathbuf + len)) { _PR_MD_MAP_OPENDIR_ERROR(GetLastError()); return -1; } else { |