Blame SOURCES/0144-tests-check-decoding-of-faccessat-syscall-in-P-y-and.patch

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