From e244ae965b17280313d92baef71165efc00ac51b Mon Sep 17 00:00:00 2001 From: "Dmitry V. Levin" Date: Sat, 4 Jul 2020 08:00:00 +0000 Subject: [PATCH 144/149] tests: check decoding of faccessat syscall in -P, -y, and -yy modes * tests/faccessat.c: Rewrite. * tests/faccessat-P.c: New file. * tests/faccessat-y.c: Likewise. * tests/faccessat-yy.c: Likewise. * tests/faccessat.test: New test. * tests/Makefile.am (DECODER_TESTS): Add faccessat.test. * tests/gen_tests.in (faccessat): Remove. (faccessat-P, faccessat-y, faccessat-yy): New entries. * tests/pure_executables.list: Add faccessat-P, faccessat-y, and faccessat-yy. * tests/.gitignore: Likewise. --- tests/.gitignore | 3 ++ tests/Makefile.am | 1 + tests/faccessat-P.c | 4 ++ tests/faccessat-y.c | 4 ++ tests/faccessat-yy.c | 4 ++ tests/faccessat.c | 127 ++++++++++++++++++++++++++++++++++++++++++-- tests/faccessat.test | 19 +++++++ tests/gen_tests.in | 4 +- tests/pure_executables.list | 3 ++ 9 files changed, 163 insertions(+), 6 deletions(-) create mode 100644 tests/faccessat-P.c create mode 100644 tests/faccessat-y.c create mode 100644 tests/faccessat-yy.c create mode 100755 tests/faccessat.test Index: strace-5.7/tests/Makefile.am =================================================================== --- strace-5.7.orig/tests/Makefile.am 2021-08-24 19:42:16.041519983 +0200 +++ strace-5.7/tests/Makefile.am 2021-08-24 19:46:08.275554370 +0200 @@ -346,6 +346,7 @@ execve-v.test \ execve.test \ fadvise64.test \ + faccessat.test \ futex.test \ getuid.test \ int_0x80.test \ Index: strace-5.7/tests/faccessat-P.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ strace-5.7/tests/faccessat-P.c 2021-08-24 19:46:08.275554370 +0200 @@ -0,0 +1,4 @@ +#define PATH_TRACING +#define SKIP_IF_PROC_IS_UNAVAILABLE skip_if_unavailable("/proc/self/fd/") + +#include "faccessat.c" Index: strace-5.7/tests/faccessat-y.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ strace-5.7/tests/faccessat-y.c 2021-08-24 19:46:08.276554362 +0200 @@ -0,0 +1,4 @@ +#define FD_PATH "" +#define SKIP_IF_PROC_IS_UNAVAILABLE skip_if_unavailable("/proc/self/fd/") + +#include "faccessat.c" Index: strace-5.7/tests/faccessat-yy.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ strace-5.7/tests/faccessat-yy.c 2021-08-24 19:46:08.276554362 +0200 @@ -0,0 +1,4 @@ +#define FD_PATH ">" +#define SKIP_IF_PROC_IS_UNAVAILABLE skip_if_unavailable("/proc/self/fd/") + +#include "faccessat.c" Index: strace-5.7/tests/faccessat.c =================================================================== --- strace-5.7.orig/tests/faccessat.c 2021-08-24 17:01:53.365934740 +0200 +++ strace-5.7/tests/faccessat.c 2021-08-24 19:46:08.277554353 +0200 @@ -1,4 +1,6 @@ /* + * Check decoding of faccessat syscall. + * * Copyright (c) 2016-2019 The strace developers. * All rights reserved. * @@ -10,18 +12,133 @@ #ifdef __NR_faccessat +# include # include # include +# ifndef FD_PATH +# define FD_PATH "" +# endif +# ifndef SKIP_IF_PROC_IS_UNAVAILABLE +# define SKIP_IF_PROC_IS_UNAVAILABLE +# endif + +static const char *errstr; + +static long +k_faccessat(const unsigned int dirfd, + const void *const pathname, + const unsigned int mode) +{ + const kernel_ulong_t fill = (kernel_ulong_t) 0xdefaced00000000ULL; + const kernel_ulong_t bad = (kernel_ulong_t) 0xbadc0dedbadc0dedULL; + + const kernel_ulong_t arg1 = fill | dirfd; + const kernel_ulong_t arg2 = (uintptr_t) pathname; + const kernel_ulong_t arg3 = fill | mode; + const long rc = syscall(__NR_faccessat, + arg1, arg2, arg3, bad, bad, bad); + errstr = sprintrc(rc); + return rc; +} + int main(void) { - static const char sample[] = "faccessat.sample"; - const long int fd = (long int) 0xdeadbeefffffffffULL; + SKIP_IF_PROC_IS_UNAVAILABLE; - long rc = syscall(__NR_faccessat, fd, sample, F_OK); - printf("faccessat(%d, \"%s\", F_OK) = %ld %s (%m)\n", - (int) fd, sample, rc, errno2name()); + TAIL_ALLOC_OBJECT_CONST_PTR(const char, unterminated); + char *unterminated_str; + if (asprintf(&unterminated_str, "%p", unterminated) < 0) + perror_msg_and_fail("asprintf"); + const void *const efault = unterminated + 1; + char *efault_str; + if (asprintf(&efault_str, "%p", efault) < 0) + perror_msg_and_fail("asprintf"); + + typedef struct { + char sym; + char null; + } sym_null; + + TAIL_ALLOC_OBJECT_CONST_PTR(sym_null, dot); + dot->sym = '.'; + dot->null = '\0'; + const char *const null = &dot->null; + + TAIL_ALLOC_OBJECT_CONST_PTR(sym_null, slash); + slash->sym = '/'; + slash->null = '\0'; + + static const char path[] = "/dev/full"; + const char *const fd_path = tail_memdup(path, sizeof(path)); + int fd = open(path, O_WRONLY); + if (fd < 0) + perror_msg_and_fail("open: %s", path); + char *fd_str; + if (asprintf(&fd_str, "%d%s", fd, FD_PATH) < 0) + perror_msg_and_fail("asprintf"); + char *path_quoted; + if (asprintf(&path_quoted, "\"%s\"", path) < 0) + perror_msg_and_fail("asprintf"); + + struct { + int val; + const char *str; + } dirfds[] = { + { ARG_STR(-1) }, + { -100, "AT_FDCWD" }, + { fd, fd_str }, + }, modes[] = { + { ARG_STR(F_OK) }, + { ARG_STR(R_OK) }, + { ARG_STR(W_OK) }, + { ARG_STR(X_OK) }, + { ARG_STR(R_OK|W_OK) }, + { ARG_STR(R_OK|X_OK) }, + { ARG_STR(W_OK|X_OK) }, + { ARG_STR(R_OK|W_OK|X_OK) }, + { 8, "0x8 /* ?_OK */" }, + { -1, "R_OK|W_OK|X_OK|0xfffffff8" }, + }; + + struct { + const void *val; + const char *str; + } paths[] = { + { 0, "NULL" }, + { efault, efault_str }, + { unterminated, unterminated_str }, + { null, "\"\"" }, + { &dot->sym, "\".\"" }, + { &slash->sym, "\"/\"" }, + { fd_path, path_quoted }, + }; + + for (unsigned int dirfd_i = 0; + dirfd_i < ARRAY_SIZE(dirfds); + ++dirfd_i) { + for (unsigned int path_i = 0; + path_i < ARRAY_SIZE(paths); + ++path_i) { + for (unsigned int mode_i = 0; + mode_i < ARRAY_SIZE(modes); + ++mode_i) { + k_faccessat(dirfds[dirfd_i].val, + paths[path_i].val, + modes[mode_i].val); +# ifdef PATH_TRACING + if (dirfds[dirfd_i].val == fd || + paths[path_i].val == fd_path) +# endif + printf("faccessat(%s, %s, %s) = %s\n", + dirfds[dirfd_i].str, + paths[path_i].str, + modes[mode_i].str, + errstr); + } + } + } puts("+++ exited with 0 +++"); return 0; Index: strace-5.7/tests/faccessat.test =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ strace-5.7/tests/faccessat.test 2021-08-24 19:46:08.277554353 +0200 @@ -0,0 +1,19 @@ +#!/bin/sh +# +# Check decoding of faccessat syscall. +# +# Copyright (c) 2020 Dmitry V. Levin +# All rights reserved. +# +# SPDX-License-Identifier: GPL-2.0-or-later + +. "${srcdir=.}/init.sh" + +check_prog sed + +run_prog > /dev/null +run_strace -a23 --trace=faccessat "$@" $args > "$EXP" + +# Filter out faccessat() calls made by ld.so and libc. +sed -n '/^faccessat(-1, NULL,/,$p' < "$LOG" > "$OUT" +match_diff "$OUT" "$EXP" Index: strace-5.7/tests/gen_tests.in =================================================================== --- strace-5.7.orig/tests/gen_tests.in 2021-08-24 19:37:43.192829355 +0200 +++ strace-5.7/tests/gen_tests.in 2021-08-24 19:46:08.278554345 +0200 @@ -73,7 +73,9 @@ erestartsys -a34 -e signal=none -e trace=recvfrom execveat execveat-v -v -e trace=execveat -faccessat -P $NAME.sample +faccessat-P -a23 --trace=faccessat -P /dev/full +faccessat-y +faccessat.test -a24 -y +faccessat-yy +faccessat.test -a24 -yy fadvise64_64 +fadvise64.test fallocate -a18 fanotify_init Index: strace-5.7/tests/pure_executables.list =================================================================== --- strace-5.7.orig/tests/pure_executables.list 2021-08-24 19:37:43.192829355 +0200 +++ strace-5.7/tests/pure_executables.list 2021-08-24 19:46:08.279554336 +0200 @@ -61,6 +61,9 @@ execve execveat faccessat +faccessat-P +faccessat-y +faccessat-yy fadvise64 fadvise64_64 fallocate Index: strace-5.7/tests-m32/Makefile.am =================================================================== --- strace-5.7.orig/tests-m32/Makefile.am 2021-08-24 19:42:16.045519949 +0200 +++ strace-5.7/tests-m32/Makefile.am 2021-08-24 19:46:08.279554336 +0200 @@ -346,6 +346,7 @@ execve-v.test \ execve.test \ fadvise64.test \ + faccessat.test \ futex.test \ getuid.test \ int_0x80.test \ Index: strace-5.7/tests-m32/faccessat-P.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ strace-5.7/tests-m32/faccessat-P.c 2021-08-24 19:46:08.279554336 +0200 @@ -0,0 +1,4 @@ +#define PATH_TRACING +#define SKIP_IF_PROC_IS_UNAVAILABLE skip_if_unavailable("/proc/self/fd/") + +#include "faccessat.c" Index: strace-5.7/tests-m32/faccessat-y.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ strace-5.7/tests-m32/faccessat-y.c 2021-08-24 19:46:08.280554328 +0200 @@ -0,0 +1,4 @@ +#define FD_PATH "" +#define SKIP_IF_PROC_IS_UNAVAILABLE skip_if_unavailable("/proc/self/fd/") + +#include "faccessat.c" Index: strace-5.7/tests-m32/faccessat-yy.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ strace-5.7/tests-m32/faccessat-yy.c 2021-08-24 19:46:08.280554328 +0200 @@ -0,0 +1,4 @@ +#define FD_PATH ">" +#define SKIP_IF_PROC_IS_UNAVAILABLE skip_if_unavailable("/proc/self/fd/") + +#include "faccessat.c" Index: strace-5.7/tests-m32/faccessat.c =================================================================== --- strace-5.7.orig/tests-m32/faccessat.c 2019-09-25 03:02:03.000000000 +0200 +++ strace-5.7/tests-m32/faccessat.c 2021-08-24 19:46:08.281554319 +0200 @@ -1,4 +1,6 @@ /* + * Check decoding of faccessat syscall. + * * Copyright (c) 2016-2019 The strace developers. * All rights reserved. * @@ -10,18 +12,133 @@ #ifdef __NR_faccessat +# include # include # include +# ifndef FD_PATH +# define FD_PATH "" +# endif +# ifndef SKIP_IF_PROC_IS_UNAVAILABLE +# define SKIP_IF_PROC_IS_UNAVAILABLE +# endif + +static const char *errstr; + +static long +k_faccessat(const unsigned int dirfd, + const void *const pathname, + const unsigned int mode) +{ + const kernel_ulong_t fill = (kernel_ulong_t) 0xdefaced00000000ULL; + const kernel_ulong_t bad = (kernel_ulong_t) 0xbadc0dedbadc0dedULL; + + const kernel_ulong_t arg1 = fill | dirfd; + const kernel_ulong_t arg2 = (uintptr_t) pathname; + const kernel_ulong_t arg3 = fill | mode; + const long rc = syscall(__NR_faccessat, + arg1, arg2, arg3, bad, bad, bad); + errstr = sprintrc(rc); + return rc; +} + int main(void) { - static const char sample[] = "faccessat.sample"; - const long int fd = (long int) 0xdeadbeefffffffffULL; + SKIP_IF_PROC_IS_UNAVAILABLE; - long rc = syscall(__NR_faccessat, fd, sample, F_OK); - printf("faccessat(%d, \"%s\", F_OK) = %ld %s (%m)\n", - (int) fd, sample, rc, errno2name()); + TAIL_ALLOC_OBJECT_CONST_PTR(const char, unterminated); + char *unterminated_str; + if (asprintf(&unterminated_str, "%p", unterminated) < 0) + perror_msg_and_fail("asprintf"); + const void *const efault = unterminated + 1; + char *efault_str; + if (asprintf(&efault_str, "%p", efault) < 0) + perror_msg_and_fail("asprintf"); + + typedef struct { + char sym; + char null; + } sym_null; + + TAIL_ALLOC_OBJECT_CONST_PTR(sym_null, dot); + dot->sym = '.'; + dot->null = '\0'; + const char *const null = &dot->null; + + TAIL_ALLOC_OBJECT_CONST_PTR(sym_null, slash); + slash->sym = '/'; + slash->null = '\0'; + + static const char path[] = "/dev/full"; + const char *const fd_path = tail_memdup(path, sizeof(path)); + int fd = open(path, O_WRONLY); + if (fd < 0) + perror_msg_and_fail("open: %s", path); + char *fd_str; + if (asprintf(&fd_str, "%d%s", fd, FD_PATH) < 0) + perror_msg_and_fail("asprintf"); + char *path_quoted; + if (asprintf(&path_quoted, "\"%s\"", path) < 0) + perror_msg_and_fail("asprintf"); + + struct { + int val; + const char *str; + } dirfds[] = { + { ARG_STR(-1) }, + { -100, "AT_FDCWD" }, + { fd, fd_str }, + }, modes[] = { + { ARG_STR(F_OK) }, + { ARG_STR(R_OK) }, + { ARG_STR(W_OK) }, + { ARG_STR(X_OK) }, + { ARG_STR(R_OK|W_OK) }, + { ARG_STR(R_OK|X_OK) }, + { ARG_STR(W_OK|X_OK) }, + { ARG_STR(R_OK|W_OK|X_OK) }, + { 8, "0x8 /* ?_OK */" }, + { -1, "R_OK|W_OK|X_OK|0xfffffff8" }, + }; + + struct { + const void *val; + const char *str; + } paths[] = { + { 0, "NULL" }, + { efault, efault_str }, + { unterminated, unterminated_str }, + { null, "\"\"" }, + { &dot->sym, "\".\"" }, + { &slash->sym, "\"/\"" }, + { fd_path, path_quoted }, + }; + + for (unsigned int dirfd_i = 0; + dirfd_i < ARRAY_SIZE(dirfds); + ++dirfd_i) { + for (unsigned int path_i = 0; + path_i < ARRAY_SIZE(paths); + ++path_i) { + for (unsigned int mode_i = 0; + mode_i < ARRAY_SIZE(modes); + ++mode_i) { + k_faccessat(dirfds[dirfd_i].val, + paths[path_i].val, + modes[mode_i].val); +# ifdef PATH_TRACING + if (dirfds[dirfd_i].val == fd || + paths[path_i].val == fd_path) +# endif + printf("faccessat(%s, %s, %s) = %s\n", + dirfds[dirfd_i].str, + paths[path_i].str, + modes[mode_i].str, + errstr); + } + } + } puts("+++ exited with 0 +++"); return 0; Index: strace-5.7/tests-m32/faccessat.test =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ strace-5.7/tests-m32/faccessat.test 2021-08-24 19:46:08.281554319 +0200 @@ -0,0 +1,19 @@ +#!/bin/sh +# +# Check decoding of faccessat syscall. +# +# Copyright (c) 2020 Dmitry V. Levin +# All rights reserved. +# +# SPDX-License-Identifier: GPL-2.0-or-later + +. "${srcdir=.}/init.sh" + +check_prog sed + +run_prog > /dev/null +run_strace -a23 --trace=faccessat "$@" $args > "$EXP" + +# Filter out faccessat() calls made by ld.so and libc. +sed -n '/^faccessat(-1, NULL,/,$p' < "$LOG" > "$OUT" +match_diff "$OUT" "$EXP" Index: strace-5.7/tests-m32/gen_tests.in =================================================================== --- strace-5.7.orig/tests-m32/gen_tests.in 2021-08-24 19:37:43.193829347 +0200 +++ strace-5.7/tests-m32/gen_tests.in 2021-08-24 19:46:08.282554311 +0200 @@ -73,7 +73,9 @@ erestartsys -a34 -e signal=none -e trace=recvfrom execveat execveat-v -v -e trace=execveat -faccessat -P $NAME.sample +faccessat-P -a23 --trace=faccessat -P /dev/full +faccessat-y +faccessat.test -a24 -y +faccessat-yy +faccessat.test -a24 -yy fadvise64_64 +fadvise64.test fallocate -a18 fanotify_init Index: strace-5.7/tests-m32/pure_executables.list =================================================================== --- strace-5.7.orig/tests-m32/pure_executables.list 2021-08-24 19:37:43.193829347 +0200 +++ strace-5.7/tests-m32/pure_executables.list 2021-08-24 19:46:08.283554302 +0200 @@ -61,6 +61,9 @@ execve execveat faccessat +faccessat-P +faccessat-y +faccessat-yy fadvise64 fadvise64_64 fallocate Index: strace-5.7/tests-mx32/Makefile.am =================================================================== --- strace-5.7.orig/tests-mx32/Makefile.am 2021-08-24 19:42:16.048519924 +0200 +++ strace-5.7/tests-mx32/Makefile.am 2021-08-24 19:46:08.283554302 +0200 @@ -346,6 +346,7 @@ execve-v.test \ execve.test \ fadvise64.test \ + faccessat.test \ futex.test \ getuid.test \ int_0x80.test \ Index: strace-5.7/tests-mx32/faccessat-P.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ strace-5.7/tests-mx32/faccessat-P.c 2021-08-24 19:46:08.283554302 +0200 @@ -0,0 +1,4 @@ +#define PATH_TRACING +#define SKIP_IF_PROC_IS_UNAVAILABLE skip_if_unavailable("/proc/self/fd/") + +#include "faccessat.c" Index: strace-5.7/tests-mx32/faccessat-y.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ strace-5.7/tests-mx32/faccessat-y.c 2021-08-24 19:46:08.284554294 +0200 @@ -0,0 +1,4 @@ +#define FD_PATH "" +#define SKIP_IF_PROC_IS_UNAVAILABLE skip_if_unavailable("/proc/self/fd/") + +#include "faccessat.c" Index: strace-5.7/tests-mx32/faccessat-yy.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ strace-5.7/tests-mx32/faccessat-yy.c 2021-08-24 19:46:08.284554294 +0200 @@ -0,0 +1,4 @@ +#define FD_PATH ">" +#define SKIP_IF_PROC_IS_UNAVAILABLE skip_if_unavailable("/proc/self/fd/") + +#include "faccessat.c" Index: strace-5.7/tests-mx32/faccessat.c =================================================================== --- strace-5.7.orig/tests-mx32/faccessat.c 2019-09-25 03:02:03.000000000 +0200 +++ strace-5.7/tests-mx32/faccessat.c 2021-08-24 19:46:08.285554285 +0200 @@ -1,4 +1,6 @@ /* + * Check decoding of faccessat syscall. + * * Copyright (c) 2016-2019 The strace developers. * All rights reserved. * @@ -10,18 +12,133 @@ #ifdef __NR_faccessat +# include # include # include +# ifndef FD_PATH +# define FD_PATH "" +# endif +# ifndef SKIP_IF_PROC_IS_UNAVAILABLE +# define SKIP_IF_PROC_IS_UNAVAILABLE +# endif + +static const char *errstr; + +static long +k_faccessat(const unsigned int dirfd, + const void *const pathname, + const unsigned int mode) +{ + const kernel_ulong_t fill = (kernel_ulong_t) 0xdefaced00000000ULL; + const kernel_ulong_t bad = (kernel_ulong_t) 0xbadc0dedbadc0dedULL; + + const kernel_ulong_t arg1 = fill | dirfd; + const kernel_ulong_t arg2 = (uintptr_t) pathname; + const kernel_ulong_t arg3 = fill | mode; + const long rc = syscall(__NR_faccessat, + arg1, arg2, arg3, bad, bad, bad); + errstr = sprintrc(rc); + return rc; +} + int main(void) { - static const char sample[] = "faccessat.sample"; - const long int fd = (long int) 0xdeadbeefffffffffULL; + SKIP_IF_PROC_IS_UNAVAILABLE; - long rc = syscall(__NR_faccessat, fd, sample, F_OK); - printf("faccessat(%d, \"%s\", F_OK) = %ld %s (%m)\n", - (int) fd, sample, rc, errno2name()); + TAIL_ALLOC_OBJECT_CONST_PTR(const char, unterminated); + char *unterminated_str; + if (asprintf(&unterminated_str, "%p", unterminated) < 0) + perror_msg_and_fail("asprintf"); + const void *const efault = unterminated + 1; + char *efault_str; + if (asprintf(&efault_str, "%p", efault) < 0) + perror_msg_and_fail("asprintf"); + + typedef struct { + char sym; + char null; + } sym_null; + + TAIL_ALLOC_OBJECT_CONST_PTR(sym_null, dot); + dot->sym = '.'; + dot->null = '\0'; + const char *const null = &dot->null; + + TAIL_ALLOC_OBJECT_CONST_PTR(sym_null, slash); + slash->sym = '/'; + slash->null = '\0'; + + static const char path[] = "/dev/full"; + const char *const fd_path = tail_memdup(path, sizeof(path)); + int fd = open(path, O_WRONLY); + if (fd < 0) + perror_msg_and_fail("open: %s", path); + char *fd_str; + if (asprintf(&fd_str, "%d%s", fd, FD_PATH) < 0) + perror_msg_and_fail("asprintf"); + char *path_quoted; + if (asprintf(&path_quoted, "\"%s\"", path) < 0) + perror_msg_and_fail("asprintf"); + + struct { + int val; + const char *str; + } dirfds[] = { + { ARG_STR(-1) }, + { -100, "AT_FDCWD" }, + { fd, fd_str }, + }, modes[] = { + { ARG_STR(F_OK) }, + { ARG_STR(R_OK) }, + { ARG_STR(W_OK) }, + { ARG_STR(X_OK) }, + { ARG_STR(R_OK|W_OK) }, + { ARG_STR(R_OK|X_OK) }, + { ARG_STR(W_OK|X_OK) }, + { ARG_STR(R_OK|W_OK|X_OK) }, + { 8, "0x8 /* ?_OK */" }, + { -1, "R_OK|W_OK|X_OK|0xfffffff8" }, + }; + + struct { + const void *val; + const char *str; + } paths[] = { + { 0, "NULL" }, + { efault, efault_str }, + { unterminated, unterminated_str }, + { null, "\"\"" }, + { &dot->sym, "\".\"" }, + { &slash->sym, "\"/\"" }, + { fd_path, path_quoted }, + }; + + for (unsigned int dirfd_i = 0; + dirfd_i < ARRAY_SIZE(dirfds); + ++dirfd_i) { + for (unsigned int path_i = 0; + path_i < ARRAY_SIZE(paths); + ++path_i) { + for (unsigned int mode_i = 0; + mode_i < ARRAY_SIZE(modes); + ++mode_i) { + k_faccessat(dirfds[dirfd_i].val, + paths[path_i].val, + modes[mode_i].val); +# ifdef PATH_TRACING + if (dirfds[dirfd_i].val == fd || + paths[path_i].val == fd_path) +# endif + printf("faccessat(%s, %s, %s) = %s\n", + dirfds[dirfd_i].str, + paths[path_i].str, + modes[mode_i].str, + errstr); + } + } + } puts("+++ exited with 0 +++"); return 0; Index: strace-5.7/tests-mx32/faccessat.test =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ strace-5.7/tests-mx32/faccessat.test 2021-08-24 19:46:08.285554285 +0200 @@ -0,0 +1,19 @@ +#!/bin/sh +# +# Check decoding of faccessat syscall. +# +# Copyright (c) 2020 Dmitry V. Levin +# All rights reserved. +# +# SPDX-License-Identifier: GPL-2.0-or-later + +. "${srcdir=.}/init.sh" + +check_prog sed + +run_prog > /dev/null +run_strace -a23 --trace=faccessat "$@" $args > "$EXP" + +# Filter out faccessat() calls made by ld.so and libc. +sed -n '/^faccessat(-1, NULL,/,$p' < "$LOG" > "$OUT" +match_diff "$OUT" "$EXP" Index: strace-5.7/tests-mx32/gen_tests.in =================================================================== --- strace-5.7.orig/tests-mx32/gen_tests.in 2021-08-24 19:37:43.194829339 +0200 +++ strace-5.7/tests-mx32/gen_tests.in 2021-08-24 19:46:08.286554277 +0200 @@ -73,7 +73,9 @@ erestartsys -a34 -e signal=none -e trace=recvfrom execveat execveat-v -v -e trace=execveat -faccessat -P $NAME.sample +faccessat-P -a23 --trace=faccessat -P /dev/full +faccessat-y +faccessat.test -a24 -y +faccessat-yy +faccessat.test -a24 -yy fadvise64_64 +fadvise64.test fallocate -a18 fanotify_init Index: strace-5.7/tests-mx32/pure_executables.list =================================================================== --- strace-5.7.orig/tests-mx32/pure_executables.list 2021-08-24 19:37:43.195829330 +0200 +++ strace-5.7/tests-mx32/pure_executables.list 2021-08-24 19:46:08.286554277 +0200 @@ -61,6 +61,9 @@ execve execveat faccessat +faccessat-P +faccessat-y +faccessat-yy fadvise64 fadvise64_64 fallocate Index: strace-5.7/tests/Makefile.in =================================================================== --- strace-5.7.orig/tests/Makefile.in 2021-08-24 19:42:54.720192609 +0200 +++ strace-5.7/tests/Makefile.in 2021-08-24 19:46:08.292554226 +0200 @@ -6523,6 +6523,7 @@ execve-v.test \ execve.test \ fadvise64.test \ + faccessat.test \ futex.test \ getuid.test \ int_0x80.test \ Index: strace-5.7/tests-m32/Makefile.in =================================================================== --- strace-5.7.orig/tests-m32/Makefile.in 2021-08-24 19:43:13.669032228 +0200 +++ strace-5.7/tests-m32/Makefile.in 2021-08-24 19:46:08.296554192 +0200 @@ -6523,6 +6523,7 @@ execve-v.test \ execve.test \ fadvise64.test \ + faccessat.test \ futex.test \ getuid.test \ int_0x80.test \ Index: strace-5.7/tests-mx32/Makefile.in =================================================================== --- strace-5.7.orig/tests-mx32/Makefile.in 2021-08-24 19:43:32.469873099 +0200 +++ strace-5.7/tests-mx32/Makefile.in 2021-08-24 19:46:08.299554167 +0200 @@ -6523,6 +6523,7 @@ execve-v.test \ execve.test \ fadvise64.test \ + faccessat.test \ futex.test \ getuid.test \ int_0x80.test \