summaryrefslogtreecommitdiff
path: root/pr/src/md/windows/ntio.c
diff options
context:
space:
mode:
Diffstat (limited to 'pr/src/md/windows/ntio.c')
-rw-r--r--pr/src/md/windows/ntio.c24
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 {