Alexander Bluhm(alexander.bl...@gmx.net) on 2019.08.05 19:52:01 +0200: > On Mon, Aug 05, 2019 at 04:22:00PM +0200, Christian Weisgerber wrote: > > 2537 realpath CALL __realpath(0x7f7ffffbfd6b,0x7f7ffffbf750) > > 2537 realpath NAMI "//" > > 2537 realpath RET __realpath -1 errno 21 Is a directory > > It looks like the special case for the root directory is not taken. > unveil(2) has the same bug. > > ok?
reads ok and fixes the gmake regression tests: 594 Tests in 120 Categories Complete ... No Failures :-) /Benno > bluhm > > Index: kern/vfs_syscalls.c > =================================================================== > RCS file: /data/mirror/openbsd/cvs/src/sys/kern/vfs_syscalls.c,v > retrieving revision 1.331 > diff -u -p -r1.331 vfs_syscalls.c > --- kern/vfs_syscalls.c 5 Aug 2019 15:13:43 -0000 1.331 > +++ kern/vfs_syscalls.c 5 Aug 2019 17:48:30 -0000 > @@ -869,7 +869,7 @@ sys___realpath(struct proc *p, void *v, > syscallarg(const char *) pathname; > syscallarg(char *) resolved; > } */ *uap = v; > - char *pathname; > + char *pathname, *c; > char *rpbuf; > struct nameidata nd; > size_t pathlen; > @@ -923,7 +923,13 @@ sys___realpath(struct proc *p, void *v, > free(cwdbuf, M_TEMP, cwdlen); > } > > - if (pathlen == 2 && pathname[0] == '/') > + /* find root "/" or "//" */ > + for (c = pathname; *c != '\0'; c++) { > + if (*c != '/') > + break; > + } > + if (*c == '\0') > + /* root directory */ > NDINIT(&nd, LOOKUP, FOLLOW | LOCKLEAF | SAVENAME | REALPATH, > UIO_SYSSPACE, pathname, p); > else > @@ -969,7 +975,7 @@ sys_unveil(struct proc *p, void *v, regi > syscallarg(const char *) path; > syscallarg(const char *) permissions; > } */ *uap = v; > - char pathname[MAXPATHLEN]; > + char pathname[MAXPATHLEN], *c; > struct nameidata nd; > size_t pathlen; > char permissions[5]; > @@ -998,7 +1004,13 @@ sys_unveil(struct proc *p, void *v, regi > if (pathlen < 2) > return EINVAL; > > - if (pathlen == 2 && pathname[0] == '/') > + /* find root "/" or "//" */ > + for (c = pathname; *c != '\0'; c++) { > + if (*c != '/') > + break; > + } > + if (*c == '\0') > + /* root directory */ > NDINIT(&nd, LOOKUP, FOLLOW | LOCKLEAF | SAVENAME, > UIO_SYSSPACE, pathname, p); > else >