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