1 /*
2 * Check decoding of get_robust_list and set_robust_list syscalls.
3 *
4 * Copyright (c) 2015-2016 Dmitry V. Levin <ldv@strace.io>
5 * Copyright (c) 2015-2021 The strace developers.
6 * All rights reserved.
7 *
8 * SPDX-License-Identifier: GPL-2.0-or-later
9 */
10
11 #include "tests.h"
12 #include "scno.h"
13 #include "pidns.h"
14
15 #include <stdio.h>
16 #include <unistd.h>
17
18 static const char *
19 sprintaddr(void *addr)
20 {
21 static char buf[sizeof(addr) * 2 + sizeof("0x")];
22
23 if (!addr)
24 return "NULL";
25 else
26 snprintf(buf, sizeof(buf), "%p", addr);
27
28 return buf;
29 }
30
31 int
32 main(void)
33 {
34 PIDNS_TEST_INIT;
35
36 const pid_t pid = getpid();
37 const char *pid_str = pidns_pid2str(PT_TGID);
38 const long long_pid = (unsigned long) (0xdeadbeef00000000LL | pid);
39 TAIL_ALLOC_OBJECT_CONST_PTR(void *, p_head);
40 TAIL_ALLOC_OBJECT_CONST_PTR(size_t, p_len);
41
42 /* It has dual-use as a marker of the beginning of the test output */
43 long rc = syscall(__NR_get_robust_list, 0, 0, 0);
44 pidns_print_leader();
45 printf("get_robust_list(0, NULL, NULL) = %s\n", sprintrc(rc));
46
47 if (syscall(__NR_get_robust_list, long_pid, p_head, p_len))
48 perror_msg_and_skip("get_robust_list");
49 pidns_print_leader();
50 printf("get_robust_list(%d%s, [%s], [%lu]) = 0\n",
51 pid, pid_str, sprintaddr(*p_head),
52 (unsigned long) *p_len);
53
54 void *head = tail_alloc(*p_len);
55 if (syscall(__NR_set_robust_list, head, *p_len))
56 perror_msg_and_skip("set_robust_list");
57 pidns_print_leader();
58 printf("set_robust_list(%p, %lu) = 0\n",
59 head, (unsigned long) *p_len);
60
61 if (syscall(__NR_get_robust_list, long_pid, p_head, p_len))
62 perror_msg_and_skip("get_robust_list");
63 pidns_print_leader();
64 printf("get_robust_list(%d%s, [%s], [%lu]) = 0\n",
65 pid, pid_str, sprintaddr(*p_head),
66 (unsigned long) *p_len);
67
68 pidns_print_leader();
69 puts("+++ exited with 0 +++");
70 return 0;
71 }