Index: vfs_syscalls.c =================================================================== RCS file: /cvsroot/src/sys/kern/vfs_syscalls.c,v retrieving revision 1.564 diff -p -u -r1.564 vfs_syscalls.c --- vfs_syscalls.c 1 Jul 2024 00:58:04 -0000 1.564 +++ vfs_syscalls.c 4 Jul 2024 05:55:28 -0000 @@ -235,8 +235,11 @@ fd_nameiat(struct lwp *l, int fdat, stru file_t *dfp; int error; const char *path = pathbuf_stringcopy_get(ndp->ni_pathbuf); + bool usefdat; - if (fdat != AT_FDCWD && path[0] != '/') { + usefdat = fdat != AT_FDCWD && path[0] != '/'; + if (usefdat) { + /* fd_getvnode() will use the descriptor for us */ if ((error = fd_getvnode(fdat, &dfp)) != 0) goto out; @@ -245,7 +248,7 @@ fd_nameiat(struct lwp *l, int fdat, stru error = namei(ndp); - if (fdat != AT_FDCWD) + if (usefdat) fd_putfile(fdat); out: pathbuf_stringcopy_put(ndp->ni_pathbuf, path); @@ -261,6 +264,7 @@ fd_nameiat_simple_user(struct lwp *l, in int error; struct pathbuf *pb; const char *p; + bool usefdat; error = pathbuf_copyin(path, &pb); if (error) { @@ -268,7 +272,9 @@ fd_nameiat_simple_user(struct lwp *l, in } p = pathbuf_stringcopy_get(pb); - if (fdat != AT_FDCWD && p[0] != '/') { + usefdat = fdat != AT_FDCWD && path[0] != '/'; + if (usefdat) { + /* fd_getvnode() will use the descriptor for us */ if ((error = fd_getvnode(fdat, &dfp)) != 0) goto out; @@ -279,7 +285,7 @@ fd_nameiat_simple_user(struct lwp *l, in error = nameiat_simple(dvp, pb, sflags, vp_ret); - if (fdat != AT_FDCWD) + if (usefdat) fd_putfile(fdat); out: @@ -4907,6 +4913,7 @@ sys_posix_fallocate(struct lwp *l, const return 0; } + /* fd_getvnode() will use the descriptor for us */ error = fd_getvnode(fd, &fp); if (error) { *retval = error; @@ -4960,6 +4967,7 @@ sys_fdiscard(struct lwp *l, const struct return EINVAL; } + /* fd_getvnode() will use the descriptor for us */ error = fd_getvnode(fd, &fp); if (error) { return error;