> > In other words, > > copystr(src, dst, dstsiz, len) > > is equivalent to: > > if (strlcpy(dst, src, dstsiz) >= dstsiz) > > return ENAMETOOLONG; > > if (len != NULL) > > *len = strlen(dst); > > This should be *len = strlen(dst)+1 as copystr includes the terminating 0x00 > in the length count. > > It doesn't matter for the current diff, but it will matter if you replace the > last remaining use of copystr which does use the returned length value.
Indeed! So the third copystr() call could be replaced with this: Index: sys/kern/vfs_lookup.c =================================================================== RCS file: /OpenBSD/src/sys/kern/vfs_lookup.c,v retrieving revision 1.87 diff -u -p -r1.87 vfs_lookup.c --- sys/kern/vfs_lookup.c 14 Aug 2022 01:58:28 -0000 1.87 +++ sys/kern/vfs_lookup.c 25 Dec 2022 20:06:27 -0000 @@ -143,10 +143,16 @@ namei(struct nameidata *ndp) */ if ((cnp->cn_flags & HASBUF) == 0) cnp->cn_pnbuf = pool_get(&namei_pool, PR_WAITOK); - if (ndp->ni_segflg == UIO_SYSSPACE) - error = copystr(ndp->ni_dirp, cnp->cn_pnbuf, - MAXPATHLEN, &ndp->ni_pathlen); - else + if (ndp->ni_segflg == UIO_SYSSPACE) { + ndp->ni_pathlen = strlcpy(cnp->cn_pnbuf, ndp->ni_dirp, + MAXPATHLEN); + if (ndp->ni_pathlen >= MAXPATHLEN) { + error = ENAMETOOLONG; + } else { + error = 0; + ndp->ni_pathlen++; /* ni_pathlen includes NUL */ + } + } else error = copyinstr(ndp->ni_dirp, cnp->cn_pnbuf, MAXPATHLEN, &ndp->ni_pathlen);