]> granicus.if.org Git - strace/blob - affinity.c
Robustify mpers.awk against invalid input
[strace] / affinity.c
1 #include "defs.h"
2
3 static void
4 print_affinitylist(struct tcb *tcp, const unsigned long addr, const unsigned int len)
5 {
6         unsigned long w;
7         const unsigned int size = len * sizeof(w);
8         const unsigned long end = addr + size;
9         unsigned long cur, abbrev_end;
10
11         if (!verbose(tcp) || (exiting(tcp) && syserror(tcp)) ||
12             !addr || !len || size / sizeof(w) != len || end < addr) {
13                 printaddr(addr);
14                 return;
15         }
16
17         if (abbrev(tcp)) {
18                 abbrev_end = addr + max_strlen *  sizeof(w);
19                 if (abbrev_end < addr)
20                         abbrev_end = end;
21         } else {
22                 abbrev_end = end;
23         }
24
25         tprints("[");
26         for (cur = addr; cur < end; cur += sizeof(w)) {
27                 if (cur > addr)
28                         tprints(", ");
29                 if (cur >= abbrev_end) {
30                         tprints("...");
31                         break;
32                 }
33                 if (umove_or_printaddr(tcp, cur, &w))
34                         break;
35                 tprintf("%lx", w);
36         }
37         tprints("]");
38 }
39
40 SYS_FUNC(sched_setaffinity)
41 {
42         tprintf("%ld, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
43         print_affinitylist(tcp, tcp->u_arg[2], tcp->u_arg[1]);
44
45         return RVAL_DECODED;
46 }
47
48 SYS_FUNC(sched_getaffinity)
49 {
50         if (entering(tcp)) {
51                 tprintf("%ld, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
52         } else {
53                 print_affinitylist(tcp, tcp->u_arg[2], tcp->u_rval);
54         }
55         return 0;
56 }