git: 2170bf801d13 - stable/14 - sysctl KERN_PROC_KQUEUE: treat omitted kqfd as request to dump all kqueues
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Mon, 07 Apr 2025 01:29:10 UTC
The branch stable/14 has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=2170bf801d13549babf914cffde84b01f44ce604 commit 2170bf801d13549babf914cffde84b01f44ce604 Author: Konstantin Belousov <kib@FreeBSD.org> AuthorDate: 2025-03-15 01:50:46 +0000 Commit: Konstantin Belousov <kib@FreeBSD.org> CommitDate: 2025-04-07 01:28:22 +0000 sysctl KERN_PROC_KQUEUE: treat omitted kqfd as request to dump all kqueues (cherry picked from commit ab9b296498fe5809bbb905c320d46e700c267164) --- sys/kern/kern_event.c | 64 +++++++++++++++++++++++++++++++-------------------- 1 file changed, 39 insertions(+), 25 deletions(-) diff --git a/sys/kern/kern_event.c b/sys/kern/kern_event.c index 8188323bdbc9..e891cb7c094a 100644 --- a/sys/kern/kern_event.c +++ b/sys/kern/kern_event.c @@ -2964,8 +2964,6 @@ kern_proc_kqueues_out1(struct thread *td, struct proc *p, struct sbuf *s, { struct kern_proc_kqueues_out1_cb_args a; - MPASS(p == curproc); - a.s = s; a.compat32 = compat32; return (fget_remote_foreach(td, p, kern_proc_kqueues_out1_cb, &a)); @@ -2987,19 +2985,39 @@ kern_proc_kqueues_out(struct proc *p, struct sbuf *sb, size_t maxlen, return (error); } +static int +sysctl_kern_proc_kqueue_one(struct thread *td, struct sbuf *s, struct proc *p, + int kq_fd, bool compat32) +{ + struct file *fp; + struct kqueue *kq; + int error; + + error = fget_remote(td, p, kq_fd, &fp); + if (error == 0) { + if (fp->f_type != DTYPE_KQUEUE) { + error = EINVAL; + } else { + kq = fp->f_data; + error = kern_proc_kqueue_report(s, p, kq_fd, kq, + compat32); + } + fdrop(fp, td); + } + return (error); +} + static int sysctl_kern_proc_kqueue(SYSCTL_HANDLER_ARGS) { struct thread *td; struct proc *p; - struct file *fp; - struct kqueue *kq; struct sbuf *s, sm; - int error, error1, kq_fd, *name; + int error, error1, *name; bool compat32; name = (int *)arg1; - if ((u_int)arg2 != 2) + if ((u_int)arg2 > 2 || (u_int)arg2 == 0) return (EINVAL); error = pget((pid_t)name[0], PGET_HOLD | PGET_CANDEBUG, &p); @@ -3007,36 +3025,32 @@ sysctl_kern_proc_kqueue(SYSCTL_HANDLER_ARGS) return (error); td = curthread; - kq_fd = name[1]; - error = fget_remote(td, p, kq_fd, &fp); - if (error != 0) - goto out1; - if (fp->f_type != DTYPE_KQUEUE) { - error = EINVAL; - goto out2; - } +#ifdef FREEBSD_COMPAT32 + compat32 = SV_CURPROC_FLAG(SV_ILP32); +#else + compat32 = false; +#endif s = sbuf_new_for_sysctl(&sm, NULL, 0, req); if (s == NULL) { error = ENOMEM; - goto out2; + goto out; } sbuf_clear_flags(s, SBUF_INCLUDENUL); -#ifdef FREEBSD_COMPAT32 - compat32 = SV_CURPROC_FLAG(SV_ILP32); -#else - compat32 = false; -#endif - kq = fp->f_data; - error = kern_proc_kqueue_report(s, p, kq_fd, kq, compat32); + if ((u_int)arg2 == 1) { + error = kern_proc_kqueues_out1(td, p, s, compat32); + } else { + error = sysctl_kern_proc_kqueue_one(td, s, p, + name[1] /* kq_fd */, compat32); + } + error1 = sbuf_finish(s); if (error == 0) error = error1; sbuf_delete(s); -out2: - fdrop(fp, td); -out1: + +out: PRELE(p); return (error); }