^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * fs/signalfd.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright (C) 2003 Linus Torvalds
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * Mon Mar 5, 2007: Davide Libenzi <davidel@xmailserver.org>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) * Changed ->read() to return a siginfo strcture instead of signal number.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) * Fixed locking in ->poll().
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) * Added sighand-detach notification.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) * Added fd re-use in sys_signalfd() syscall.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) * Now using anonymous inode source.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) * Thanks to Oleg Nesterov for useful code review and suggestions.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) * More comments and suggestions from Arnd Bergmann.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) * Sat May 19, 2007: Davi E. M. Arnaut <davi@haxent.com.br>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) * Retrieve multiple signals with one read() call
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) * Sun Jul 15, 2007: Davide Libenzi <davidel@xmailserver.org>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) * Attach to the sighand only during read() and poll().
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #include <linux/file.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #include <linux/poll.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #include <linux/init.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #include <linux/fs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #include <linux/sched.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #include <linux/signal.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #include <linux/list.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #include <linux/anon_inodes.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #include <linux/signalfd.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #include <linux/syscalls.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #include <linux/proc_fs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #include <linux/compat.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) void signalfd_cleanup(struct sighand_struct *sighand)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) wake_up_pollfree(&sighand->signalfd_wqh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) struct signalfd_ctx {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) sigset_t sigmask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) static int signalfd_release(struct inode *inode, struct file *file)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) kfree(file->private_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) static __poll_t signalfd_poll(struct file *file, poll_table *wait)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) struct signalfd_ctx *ctx = file->private_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) __poll_t events = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) poll_wait(file, ¤t->sighand->signalfd_wqh, wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) spin_lock_irq(¤t->sighand->siglock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) if (next_signal(¤t->pending, &ctx->sigmask) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) next_signal(¤t->signal->shared_pending,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) &ctx->sigmask))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) events |= EPOLLIN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) spin_unlock_irq(¤t->sighand->siglock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) return events;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) * Copied from copy_siginfo_to_user() in kernel/signal.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) static int signalfd_copyinfo(struct signalfd_siginfo __user *uinfo,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) kernel_siginfo_t const *kinfo)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) struct signalfd_siginfo new;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) BUILD_BUG_ON(sizeof(struct signalfd_siginfo) != 128);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) * Unused members should be zero ...
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) memset(&new, 0, sizeof(new));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) * If you change siginfo_t structure, please be sure
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) * this code is fixed accordingly.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) new.ssi_signo = kinfo->si_signo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) new.ssi_errno = kinfo->si_errno;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) new.ssi_code = kinfo->si_code;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) switch (siginfo_layout(kinfo->si_signo, kinfo->si_code)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) case SIL_KILL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) new.ssi_pid = kinfo->si_pid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) new.ssi_uid = kinfo->si_uid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) case SIL_TIMER:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) new.ssi_tid = kinfo->si_tid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) new.ssi_overrun = kinfo->si_overrun;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) new.ssi_ptr = (long) kinfo->si_ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) new.ssi_int = kinfo->si_int;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) case SIL_POLL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) new.ssi_band = kinfo->si_band;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) new.ssi_fd = kinfo->si_fd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) case SIL_FAULT_BNDERR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) case SIL_FAULT_PKUERR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) * Fall through to the SIL_FAULT case. Both SIL_FAULT_BNDERR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) * and SIL_FAULT_PKUERR are only generated by faults that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) * deliver them synchronously to userspace. In case someone
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) * injects one of these signals and signalfd catches it treat
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) * it as SIL_FAULT.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) case SIL_FAULT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) new.ssi_addr = (long) kinfo->si_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) #ifdef __ARCH_SI_TRAPNO
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) new.ssi_trapno = kinfo->si_trapno;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) case SIL_FAULT_MCEERR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) new.ssi_addr = (long) kinfo->si_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) #ifdef __ARCH_SI_TRAPNO
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) new.ssi_trapno = kinfo->si_trapno;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) new.ssi_addr_lsb = (short) kinfo->si_addr_lsb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) case SIL_CHLD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) new.ssi_pid = kinfo->si_pid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) new.ssi_uid = kinfo->si_uid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) new.ssi_status = kinfo->si_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) new.ssi_utime = kinfo->si_utime;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) new.ssi_stime = kinfo->si_stime;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) case SIL_RT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) * This case catches also the signals queued by sigqueue().
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) new.ssi_pid = kinfo->si_pid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) new.ssi_uid = kinfo->si_uid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) new.ssi_ptr = (long) kinfo->si_ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) new.ssi_int = kinfo->si_int;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) case SIL_SYS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) new.ssi_call_addr = (long) kinfo->si_call_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) new.ssi_syscall = kinfo->si_syscall;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) new.ssi_arch = kinfo->si_arch;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) if (copy_to_user(uinfo, &new, sizeof(struct signalfd_siginfo)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) return -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) return sizeof(*uinfo);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) static ssize_t signalfd_dequeue(struct signalfd_ctx *ctx, kernel_siginfo_t *info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) int nonblock)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) ssize_t ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) DECLARE_WAITQUEUE(wait, current);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) spin_lock_irq(¤t->sighand->siglock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) ret = dequeue_signal(current, &ctx->sigmask, info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) switch (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) if (!nonblock)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) ret = -EAGAIN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) spin_unlock_irq(¤t->sighand->siglock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) add_wait_queue(¤t->sighand->signalfd_wqh, &wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) for (;;) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) set_current_state(TASK_INTERRUPTIBLE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) ret = dequeue_signal(current, &ctx->sigmask, info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) if (ret != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) if (signal_pending(current)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) ret = -ERESTARTSYS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) spin_unlock_irq(¤t->sighand->siglock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) schedule();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) spin_lock_irq(¤t->sighand->siglock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) spin_unlock_irq(¤t->sighand->siglock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) remove_wait_queue(¤t->sighand->signalfd_wqh, &wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) __set_current_state(TASK_RUNNING);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) * Returns a multiple of the size of a "struct signalfd_siginfo", or a negative
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) * error code. The "count" parameter must be at least the size of a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) * "struct signalfd_siginfo".
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) static ssize_t signalfd_read(struct file *file, char __user *buf, size_t count,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) loff_t *ppos)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) struct signalfd_ctx *ctx = file->private_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) struct signalfd_siginfo __user *siginfo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) int nonblock = file->f_flags & O_NONBLOCK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) ssize_t ret, total = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) kernel_siginfo_t info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) count /= sizeof(struct signalfd_siginfo);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) if (!count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) siginfo = (struct signalfd_siginfo __user *) buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) ret = signalfd_dequeue(ctx, &info, nonblock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) if (unlikely(ret <= 0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) ret = signalfd_copyinfo(siginfo, &info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) siginfo++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) total += ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) nonblock = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) } while (--count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) return total ? total: ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) #ifdef CONFIG_PROC_FS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) static void signalfd_show_fdinfo(struct seq_file *m, struct file *f)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) struct signalfd_ctx *ctx = f->private_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) sigset_t sigmask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) sigmask = ctx->sigmask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) signotset(&sigmask);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) render_sigset_t(m, "sigmask:\t", &sigmask);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) static const struct file_operations signalfd_fops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) #ifdef CONFIG_PROC_FS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) .show_fdinfo = signalfd_show_fdinfo,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) .release = signalfd_release,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) .poll = signalfd_poll,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) .read = signalfd_read,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) .llseek = noop_llseek,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) static int do_signalfd4(int ufd, sigset_t *mask, int flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) struct signalfd_ctx *ctx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) /* Check the SFD_* constants for consistency. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) BUILD_BUG_ON(SFD_CLOEXEC != O_CLOEXEC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) BUILD_BUG_ON(SFD_NONBLOCK != O_NONBLOCK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) if (flags & ~(SFD_CLOEXEC | SFD_NONBLOCK))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) sigdelsetmask(mask, sigmask(SIGKILL) | sigmask(SIGSTOP));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) signotset(mask);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) if (ufd == -1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) ctx = kmalloc(sizeof(*ctx), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) if (!ctx)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) ctx->sigmask = *mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) * When we call this, the initialization must be complete, since
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) * anon_inode_getfd() will install the fd.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) ufd = anon_inode_getfd("[signalfd]", &signalfd_fops, ctx,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) O_RDWR | (flags & (O_CLOEXEC | O_NONBLOCK)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) if (ufd < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) kfree(ctx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) struct fd f = fdget(ufd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) if (!f.file)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) return -EBADF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) ctx = f.file->private_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) if (f.file->f_op != &signalfd_fops) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) fdput(f);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) spin_lock_irq(¤t->sighand->siglock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) ctx->sigmask = *mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) spin_unlock_irq(¤t->sighand->siglock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) wake_up(¤t->sighand->signalfd_wqh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) fdput(f);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) return ufd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) SYSCALL_DEFINE4(signalfd4, int, ufd, sigset_t __user *, user_mask,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) size_t, sizemask, int, flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) sigset_t mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) if (sizemask != sizeof(sigset_t))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) if (copy_from_user(&mask, user_mask, sizeof(mask)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) return -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) return do_signalfd4(ufd, &mask, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) SYSCALL_DEFINE3(signalfd, int, ufd, sigset_t __user *, user_mask,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) size_t, sizemask)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) sigset_t mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) if (sizemask != sizeof(sigset_t))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) if (copy_from_user(&mask, user_mask, sizeof(mask)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) return -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) return do_signalfd4(ufd, &mask, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) #ifdef CONFIG_COMPAT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) static long do_compat_signalfd4(int ufd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) const compat_sigset_t __user *user_mask,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) compat_size_t sigsetsize, int flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) sigset_t mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) if (sigsetsize != sizeof(compat_sigset_t))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) if (get_compat_sigset(&mask, user_mask))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) return -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) return do_signalfd4(ufd, &mask, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) COMPAT_SYSCALL_DEFINE4(signalfd4, int, ufd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) const compat_sigset_t __user *, user_mask,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) compat_size_t, sigsetsize,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) int, flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) return do_compat_signalfd4(ufd, user_mask, sigsetsize, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) COMPAT_SYSCALL_DEFINE3(signalfd, int, ufd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) const compat_sigset_t __user *, user_mask,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) compat_size_t, sigsetsize)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) return do_compat_signalfd4(ufd, user_mask, sigsetsize, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) #endif