diff --git a/kernel/newstuff.c b/kernel/newstuff.c index 34cf2408..30757ef1 100644 --- a/kernel/newstuff.c +++ b/kernel/newstuff.c @@ -186,7 +186,10 @@ long DosMkTmp(char FAR * pathname, UWORD attr) */ -#define PATH_ERROR goto errRet +#define PATH_ERROR() \ + fstrchr(src, '/') == 0 && fstrchr(src, '\\') == 0 \ + ? DE_FILENOTFND \ + : DE_PATHNOTFND #define PATHLEN 128 @@ -244,7 +247,7 @@ STATIC const char _DirChars[] = "\"[]:|<>+=;,"; #define addChar(c) \ { \ - if (p >= dest + REMOTE_PATH_MAX) PATH_ERROR; /* path too long */ \ + if (p >= dest + REMOTE_PATH_MAX) return PATH_ERROR(); /* path too long */ \ *p++ = c; \ } @@ -479,14 +482,18 @@ COUNT truename(__XFAR(const char) src, char FAR *dest, COUNT mode) if(*src == '.') { + int dots = 1; /* special directory component */ ++src; if (*src == '.') /* skip the second dot */ + { ++src; + dots++; + } if (*src == '/' || *src == '\\' || *src == '\0') { --p; /* backup the backslash */ - if (src[-2] == '.') + if (dots == 2) { /* ".." entry */ /* remove last path component */ @@ -498,12 +505,9 @@ COUNT truename(__XFAR(const char) src, char FAR *dest, COUNT mode) } /* ill-formed .* or ..* entries => return error */ - errRet: /* The error is either PATHNOTFND or FILENOTFND depending on if it is not the last component */ - return fstrchr(src, '/') == 0 && fstrchr(src, '\\') == 0 - ? DE_FILENOTFND - : DE_PATHNOTFND; + return PATH_ERROR(); } /* normal component */ @@ -536,7 +540,7 @@ COUNT truename(__XFAR(const char) src, char FAR *dest, COUNT mode) if (c == '.') { if (state & PNE_DOT) /* multiple dots are ill-formed */ - PATH_ERROR; + return PATH_ERROR(); /* strip trailing dot */ if (*src == '/' || *src == '\\' || *src == '\0') break; @@ -548,7 +552,7 @@ COUNT truename(__XFAR(const char) src, char FAR *dest, COUNT mode) state |= PNE_WILDCARD; if (i) { /* name length in limits */ --i; - if (!DirChar(c)) PATH_ERROR; + if (!DirChar(c)) return PATH_ERROR(); addChar(c); } }