From c6487446d7e99537551d2e51a2f6c6569fcb89fc Mon Sep 17 00:00:00 2001 From: Dmitry Chagin Date: Mon, 11 Apr 2022 23:30:16 +0300 Subject: [PATCH] getdirentries: return ENOENT for unlinked but still open directory. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit To be more compatible to IEEE Std 1003.1-2008 (“POSIX.1”). Reviewed by: mjg, Pau Amma (doc) Differential revision: https://reviews.freebsd.org/D34680 MFC after: 2 weeks --- lib/libc/sys/getdirentries.2 | 2 ++ sys/kern/vfs_subr.c | 1 + sys/kern/vfs_syscalls.c | 4 ++++ sys/sys/vnode.h | 2 +- 4 files changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/libc/sys/getdirentries.2 b/lib/libc/sys/getdirentries.2 index 4185fb84f0f9..76fe18bf6edb 100644 --- a/lib/libc/sys/getdirentries.2 +++ b/lib/libc/sys/getdirentries.2 @@ -193,6 +193,8 @@ An error occurred while reading from or writing to the file system. .It Bq Er EINTEGRITY Corrupted data was detected while reading from the file system. +.It Bq Er ENOENT +Directory unlinked but still open. .El .Sh SEE ALSO .Xr lseek 2 , diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c index bbb429085a24..a6344e139502 100644 --- a/sys/kern/vfs_subr.c +++ b/sys/kern/vfs_subr.c @@ -5980,6 +5980,7 @@ vop_rmdir_post(void *ap, int rc) vn_seqc_write_end(dvp); vn_seqc_write_end(vp); if (!rc) { + vp->v_vflag |= VV_UNLINKED; VFS_KNOTE_LOCKED(dvp, NOTE_WRITE | NOTE_LINK); VFS_KNOTE_LOCKED(vp, NOTE_DELETE); } diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c index 87bf0a9d866b..77a9b9c25290 100644 --- a/sys/kern/vfs_syscalls.c +++ b/sys/kern/vfs_syscalls.c @@ -4195,6 +4195,10 @@ kern_getdirentries(struct thread *td, int fd, char *buf, size_t count, error = EINVAL; goto fail; } + if (__predict_false((vp->v_vflag & VV_UNLINKED) != 0)) { + error = ENOENT; + goto fail; + } aiov.iov_base = buf; aiov.iov_len = count; auio.uio_iov = &aiov; diff --git a/sys/sys/vnode.h b/sys/sys/vnode.h index 0ff7501837c7..ed292835c12f 100644 --- a/sys/sys/vnode.h +++ b/sys/sys/vnode.h @@ -270,7 +270,7 @@ struct xvnode { #define VV_COPYONWRITE 0x0040 /* vnode is doing copy-on-write */ #define VV_SYSTEM 0x0080 /* vnode being used by kernel */ #define VV_PROCDEP 0x0100 /* vnode is process dependent */ -/* UNUSED 0x0200 */ +#define VV_UNLINKED 0x0200 /* unlinked but stil open directory */ #define VV_DELETED 0x0400 /* should be removed */ #define VV_MD 0x0800 /* vnode backs the md device */ #define VV_FORCEINSMQ 0x1000 /* force the insmntque to succeed */