On Sun, Dec 25, 2022 at 08:07:11PM +0000, Miod Vallat wrote:
> 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);
Looks good to me.