File: | src/signal/sigaction.c |
Location: | line 47, column 19 |
Description: | Assigned value is garbage or undefined |
1 | #include <signal.h> | |||
2 | #include <errno(*__errno_location()).h> | |||
3 | #include <string.h> | |||
4 | #include "syscall.h" | |||
5 | #include "pthread_impl.h" | |||
6 | #include "libc.h" | |||
7 | #include "ksigaction.h" | |||
8 | ||||
9 | static int unmask_done; | |||
10 | static unsigned long handler_set[_NSIG65/(8*sizeof(long))]; | |||
11 | ||||
12 | void __get_handler_set(sigset_t *set) | |||
13 | { | |||
14 | memcpy(set, handler_set, sizeof handler_set); | |||
15 | } | |||
16 | ||||
17 | int __libc_sigaction(int sig, const struct sigaction *restrict sa, struct sigaction *restrict old) | |||
18 | { | |||
19 | struct k_sigaction ksa, ksa_old; | |||
20 | if (sa) { | |||
| ||||
21 | if ((uintptr_t)sa->sa_handler__sa_handler.sa_handler > 1UL) { | |||
22 | a_or_la_or_l(handler_set+(sig-1)/(8*sizeof(long)), | |||
23 | 1UL<<(sig-1)%(8*sizeof(long))); | |||
24 | ||||
25 | /* If pthread_create has not yet been called, | |||
26 | * implementation-internal signals might not | |||
27 | * yet have been unblocked. They must be | |||
28 | * unblocked before any signal handler is | |||
29 | * installed, so that an application cannot | |||
30 | * receive an illegal sigset_t (with them | |||
31 | * blocked) as part of the ucontext_t passed | |||
32 | * to the signal handler. */ | |||
33 | if (!libc__libc.threaded && !unmask_done) { | |||
34 | __syscall(SYS_rt_sigprocmask, SIG_UNBLOCK,__syscall4(14,((long) (1)),((long) (((sigset_t *)(const unsigned long [65/8/sizeof(long)]){ [sizeof(long)==4] = 3UL<<(32 *(sizeof(long)>4)) }))),((long) (0)),((long) (65/8))) | |||
35 | SIGPT_SET, 0, _NSIG/8)__syscall4(14,((long) (1)),((long) (((sigset_t *)(const unsigned long [65/8/sizeof(long)]){ [sizeof(long)==4] = 3UL<<(32 *(sizeof(long)>4)) }))),((long) (0)),((long) (65/8))); | |||
36 | unmask_done = 1; | |||
37 | } | |||
38 | } | |||
39 | ksa.handler = sa->sa_handler__sa_handler.sa_handler; | |||
40 | ksa.flags = sa->sa_flags | SA_RESTORER0x04000000; | |||
41 | ksa.restorer = (sa->sa_flags & SA_SIGINFO4) ? __restore_rt : __restore; | |||
42 | memcpy(&ksa.mask, &sa->sa_mask, sizeof ksa.mask); | |||
43 | } | |||
44 | if (syscall(SYS_rt_sigaction, sig, sa?&ksa:0, old?&ksa_old:0, sizeof ksa.mask)__syscall_ret(__syscall4(13,((long) (sig)),((long) (sa?&ksa :0)),((long) (old?&ksa_old:0)),((long) (sizeof ksa.mask)) ))) | |||
45 | return -1; | |||
46 | if (old) { | |||
47 | old->sa_handler__sa_handler.sa_handler = ksa_old.handler; | |||
| ||||
48 | old->sa_flags = ksa_old.flags; | |||
49 | memcpy(&old->sa_mask, &ksa_old.mask, sizeof ksa_old.mask); | |||
50 | } | |||
51 | return 0; | |||
52 | } | |||
53 | ||||
54 | int __sigaction(int sig, const struct sigaction *restrict sa, struct sigaction *restrict old) | |||
55 | { | |||
56 | if (sig-32U < 3 || sig-1U >= _NSIG65-1) { | |||
57 | errno(*__errno_location()) = EINVAL22; | |||
58 | return -1; | |||
59 | } | |||
60 | return __libc_sigaction(sig, sa, old); | |||
61 | } | |||
62 | ||||
63 | weak_alias(__sigaction, sigaction)extern __typeof(__sigaction) sigaction __attribute__((weak, alias ("__sigaction"))); |