1 /*
2 * Check decoding of umode_t type syscall arguments.
3 *
4 * Copyright (c) 2016 Dmitry V. Levin <ldv@strace.io>
5 * Copyright (c) 2016-2021 The strace developers.
6 * All rights reserved.
7 *
8 * SPDX-License-Identifier: GPL-2.0-or-later
9 */
10
11 #include <stdio.h>
12 #include <unistd.h>
13 #include <sys/stat.h>
14
15 #ifndef TEST_SYSCALL_PREFIX_ARGS
16 # define TEST_SYSCALL_PREFIX_ARGS
17 #endif
18 #ifndef TEST_SYSCALL_PREFIX_STR
19 # define TEST_SYSCALL_PREFIX_STR ""
20 #endif
21
22 static const char *sample;
23
24 static void
25 test_syscall(unsigned short mode)
26 {
27 unsigned long lmode = (unsigned long) 0xffffffffffff0000ULL | mode;
28 long rc = syscall(TEST_SYSCALL_NR, TEST_SYSCALL_PREFIX_ARGS
29 sample, lmode);
30
31 if (mode <= 07)
32 printf("%s(%s\"%s\", 00%d) = %ld %s (%m)\n",
33 TEST_SYSCALL_STR, TEST_SYSCALL_PREFIX_STR,
34 sample, (int) mode, rc, errno2name());
35 else
36 printf("%s(%s\"%s\", %#03ho) = %ld %s (%m)\n",
37 TEST_SYSCALL_STR, TEST_SYSCALL_PREFIX_STR,
38 sample, mode, rc, errno2name());
39 }
40
41 int
42 main(int ac, char **av)
43 {
44 sample = av[0];
45 test_syscall(0);
46 test_syscall(0xffff);
47 test_syscall(06);
48 test_syscall(060);
49 test_syscall(0600);
50 test_syscall(024);
51 test_syscall(S_IFREG);
52 test_syscall(S_IFDIR | 06);
53 test_syscall(S_IFLNK | 060);
54 test_syscall(S_IFIFO | 0600);
55 test_syscall(S_IFCHR | 024);
56 test_syscall((0xffff & ~S_IFMT) | S_IFBLK);
57
58 puts("+++ exited with 0 +++");
59 return 0;
60 }