--- realpath8.c 2020-11-22 17:52:17.586481571 -0500 +++ realpath9.c 2020-11-23 13:55:06.808458893 -0500 @@ -19,7 +19,7 @@ char *output = resolved ? resolved : buf; size_t p, q, l, cnt=0; - l = strnlen(filename, sizeof stack + 1); + l = strnlen(filename, sizeof stack); if (!l) { errno = ENOENT; return 0; @@ -80,11 +80,16 @@ return 0; } if (k==p) goto toolong; + if (!k) { + errno = ENOENT; + return 0; + } if (++cnt == SYMLOOP_MAX) { errno = ELOOP; return 0; } p -= k; + if (stack[k-1]=='/') p++; memmove(stack+p, stack, k); } @@ -95,7 +100,8 @@ l = strlen(stack); /* Cancel any initial .. components. */ p = 0; - while (q-p>=2 && at_dotdot(output+p+2, p+2)) { + while (output[p]=='.' && output[p+1]=='.' + && (!output[p+2] || output[p+2]=='/')) { while(l>1 && stack[l-1]!='/') l--; if (l>1) l--; p += 2;