]> granicus.if.org Git - strace/blob - futex.c
Robustify mpers.awk against invalid input
[strace] / futex.c
1 #include "defs.h"
2
3 #ifdef HAVE_LINUX_FUTEX_H
4 # include <linux/futex.h>
5 #endif
6
7 #ifndef FUTEX_PRIVATE_FLAG
8 # define FUTEX_PRIVATE_FLAG 128
9 #endif
10 #ifndef FUTEX_CLOCK_REALTIME
11 # define FUTEX_CLOCK_REALTIME 256
12 #endif
13
14 #include "xlat/futexops.h"
15 #include "xlat/futexwakeops.h"
16 #include "xlat/futexwakecmps.h"
17
18 SYS_FUNC(futex)
19 {
20         const long uaddr = tcp->u_arg[0];
21         const int op = tcp->u_arg[1];
22         const int cmd = op & 127;
23         const long timeout = tcp->u_arg[3];
24         const long uaddr2 = tcp->u_arg[4];
25         const unsigned int val = tcp->u_arg[2];
26         const unsigned int val2 = tcp->u_arg[3];
27         const unsigned int val3 = tcp->u_arg[5];
28
29         printaddr(uaddr);
30         tprints(", ");
31         printxval(futexops, op, "FUTEX_???");
32         tprintf(", %u", val);
33         switch (cmd) {
34         case FUTEX_WAIT:
35         case FUTEX_LOCK_PI:
36                 tprints(", ");
37                 print_timespec(tcp, timeout);
38                 break;
39         case FUTEX_WAIT_BITSET:
40                 tprints(", ");
41                 print_timespec(tcp, timeout);
42                 tprintf(", %x", val3);
43                 break;
44         case FUTEX_WAKE_BITSET:
45                 tprintf(", %x", val3);
46                 break;
47         case FUTEX_REQUEUE:
48                 tprintf(", %u, ", val2);
49                 printaddr(uaddr2);
50                 break;
51         case FUTEX_CMP_REQUEUE:
52         case FUTEX_CMP_REQUEUE_PI:
53                 tprintf(", %u, ", val2);
54                 printaddr(uaddr2);
55                 tprintf(", %u", val3);
56                 break;
57         case FUTEX_WAKE_OP:
58                 tprintf(", %u, ", val2);
59                 printaddr(uaddr2);
60                 tprints(", {");
61                 if ((val3 >> 28) & 8)
62                         tprints("FUTEX_OP_OPARG_SHIFT|");
63                 printxval(futexwakeops, (val3 >> 28) & 0x7, "FUTEX_OP_???");
64                 tprintf(", %u, ", (val3 >> 12) & 0xfff);
65                 if ((val3 >> 24) & 8)
66                         tprints("FUTEX_OP_OPARG_SHIFT|");
67                 printxval(futexwakecmps, (val3 >> 24) & 0x7, "FUTEX_OP_CMP_???");
68                 tprintf(", %u}", val3 & 0xfff);
69                 break;
70         case FUTEX_WAIT_REQUEUE_PI:
71                 tprints(", ");
72                 print_timespec(tcp, timeout);
73                 tprints(", ");
74                 printaddr(uaddr2);
75                 break;
76         case FUTEX_WAKE:
77         case FUTEX_UNLOCK_PI:
78         case FUTEX_TRYLOCK_PI:
79                 break;
80         default:
81                 tprintf(", %lx, %lx, %x", timeout, uaddr2, val3);
82                 break;
83         }
84
85         return RVAL_DECODED;
86 }