import strace-5.7-3.el8

This commit is contained in:
CentOS Sources 2021-09-03 04:20:23 +00:00 committed by Andrew Lukoshko
parent 5d5a3a798f
commit 2307684af9
18 changed files with 20330 additions and 1 deletions

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,795 @@
From e244ae965b17280313d92baef71165efc00ac51b Mon Sep 17 00:00:00 2001
From: "Dmitry V. Levin" <ldv@altlinux.org>
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 "</dev/full>"
+#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 "</dev/full<char 1:7>>"
+#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 <fcntl.h>
# include <stdio.h>
# include <unistd.h>
+# 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 <ldv@altlinux.org>
+# 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 "</dev/full>"
+#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 "</dev/full<char 1:7>>"
+#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 <fcntl.h>
# include <stdio.h>
# include <unistd.h>
+# 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 <ldv@altlinux.org>
+# 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 "</dev/full>"
+#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 "</dev/full<char 1:7>>"
+#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 <fcntl.h>
# include <stdio.h>
# include <unistd.h>
+# 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 <ldv@altlinux.org>
+# 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 \

View File

@ -0,0 +1,65 @@
From f2b8769e4a9aa99cd5e0aef41a0408c34de3cc8e Mon Sep 17 00:00:00 2001
From: "Dmitry V. Levin" <ldv@strace.io>
Date: Mon, 15 Mar 2021 08:00:00 +0000
Subject: [PATCH 145/149] xmalloc: introduce xasprintf
xasprintf is a trivial wrapper around vasprintf,
the primary purpose of adding it is to simplify tests.
* xmalloc.h (xasprintf): New function declaration.
* xmalloc.c: Include <stdarg.h> and <stdio.h>
(xasprintf): New function.
---
xmalloc.c | 16 ++++++++++++++++
xmalloc.h | 6 ++++++
2 files changed, 22 insertions(+)
diff --git a/xmalloc.c b/xmalloc.c
index 8688f91..75019e9 100644
--- a/xmalloc.c
+++ b/xmalloc.c
@@ -10,6 +10,8 @@
# include "config.h"
#endif
+#include <stdarg.h>
+#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -146,3 +148,17 @@ xstrndup(const char *str, size_t n)
return p;
}
+
+char *
+xasprintf(const char *fmt, ...)
+{
+ va_list ap;
+ va_start(ap, fmt);
+
+ char *res;
+ if (vasprintf(&res, fmt, ap) < 0)
+ die_out_of_memory();
+
+ va_end(ap);
+ return res;
+}
diff --git a/xmalloc.h b/xmalloc.h
index 4bf1e2c..1305a1e 100644
--- a/xmalloc.h
+++ b/xmalloc.h
@@ -77,4 +77,10 @@ void *xgrowarray(void *ptr, size_t *nmemb, size_t memb_size);
char *xstrdup(const char *str) ATTRIBUTE_MALLOC;
char *xstrndup(const char *str, size_t n) ATTRIBUTE_MALLOC;
+/**
+ * Analogous to asprintf, die in case of an error.
+ */
+char *xasprintf(const char *fmt, ...)
+ ATTRIBUTE_FORMAT((printf, 1, 2)) ATTRIBUTE_MALLOC;
+
#endif /* !STRACE_XMALLOC_H */
--
2.1.4

View File

@ -0,0 +1,891 @@
From bcd0f3ef964aead4b9e95c10f4c5c75f58ba102c Mon Sep 17 00:00:00 2001
From: "Dmitry V. Levin" <ldv@strace.io>
Date: Mon, 15 Mar 2021 08:00:00 +0000
Subject: [PATCH 146/149] tests: use xasprintf instead of asprintf
* tests/clone-flags.c: Include "xmalloc.h", replace all asprintf
invocations followed by perror_msg_and_fail with xasprintf.
* tests/epoll_pwait2.c: Likewise.
* tests/faccessat.c: Likewise.
* tests/faccessat2.c: Likewise.
* tests/ioctl_kvm_run_common.c: Likewise.
* tests/keyctl.c: Likewise.
* tests/lock_file.c: Likewise.
* tests/mq.c: Likewise.
* tests/mq_sendrecv.c: Likewise.
* tests/netlink_protocol.c: Likewise.
* tests/old_mmap.c: Likewise.
* tests/tracer_ppid_pgid_sid.c: Likewise.
Conflicts:
tests/epoll_pwait2.c
tests/faccessat2.c
tests/mq_sendrecv.c
---
tests/clone-flags.c | 5 ++---
tests/faccessat.c | 17 +++++------------
tests/ioctl_kvm_run_common.c | 6 ++----
tests/keyctl.c | 29 +++++++++++++----------------
tests/lock_file.c | 5 ++---
tests/mq.c | 5 ++---
tests/mq_sendrecv.c | 4 ++--
tests/netlink_protocol.c | 5 ++---
tests/old_mmap.c | 5 ++---
tests/tracer_ppid_pgid_sid.c | 6 ++----
10 files changed, 34 insertions(+), 53 deletions(-)
diff --git a/tests/clone-flags.c b/tests/clone-flags.c
index 04bb2c7..aa7d48c 100644
--- a/tests/clone-flags.c
+++ b/tests/clone-flags.c
@@ -8,6 +8,7 @@
*/
#include "tests.h"
+#include "xmalloc.h"
#include <errno.h>
#include <limits.h>
@@ -134,9 +135,7 @@ main(void)
*ptid = 0;
pid = do_clone(child, child_stack, child_stack_size,
CLONE_PIDFD|SIGCHLD, 0, ptid);
- char *fname = 0;
- if (asprintf(&fname, "/proc/self/fd/%d", *ptid) < 0)
- perror_msg_and_fail("asprintf");
+ char *fname = xasprintf("/proc/self/fd/%d", *ptid);
int rc = readlink(fname, buf, sizeof(buf) - 1);
if ((unsigned int) rc >= sizeof(buf))
perror_msg_and_fail("readlink");
diff --git a/tests/faccessat.c b/tests/faccessat.c
index c42aa2d..8cda6f3 100644
--- a/tests/faccessat.c
+++ b/tests/faccessat.c
@@ -12,6 +12,7 @@
#ifdef __NR_faccessat
+# include "xmalloc.h"
# include <fcntl.h>
# include <stdio.h>
# include <unistd.h>
@@ -48,13 +49,9 @@ main(void)
SKIP_IF_PROC_IS_UNAVAILABLE;
TAIL_ALLOC_OBJECT_CONST_PTR(const char, unterminated);
- char *unterminated_str;
- if (asprintf(&unterminated_str, "%p", unterminated) < 0)
- perror_msg_and_fail("asprintf");
+ char *unterminated_str = xasprintf("%p", unterminated);
const void *const efault = unterminated + 1;
- char *efault_str;
- if (asprintf(&efault_str, "%p", efault) < 0)
- perror_msg_and_fail("asprintf");
+ char *efault_str = xasprintf("%p", efault);
typedef struct {
char sym;
@@ -75,12 +72,8 @@ main(void)
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");
+ char *fd_str = xasprintf("%d%s", fd, FD_PATH);
+ char *path_quoted = xasprintf("\"%s\"", path);
struct {
int val;
diff --git a/tests/ioctl_kvm_run_common.c b/tests/ioctl_kvm_run_common.c
index 9107c30..be1190e 100644
--- a/tests/ioctl_kvm_run_common.c
+++ b/tests/ioctl_kvm_run_common.c
@@ -48,6 +48,7 @@
# define KVM_MAX_CPUID_ENTRIES 80
# endif
+# include "xmalloc.h"
# include "xlat.h"
# include "xlat/kvm_cpuid_flags.h"
@@ -254,12 +255,9 @@ static int
vcpu_dev_should_have_cpuid(int fd)
{
int r = 0;
- char *filename = NULL;
+ char *filename = xasprintf("/proc/%d/fd/%d", getpid(), fd);
char buf[sizeof(vcpu_dev)];
- if (asprintf(&filename, "/proc/%d/fd/%d", getpid(), fd) < 0)
- error_msg_and_fail("asprintf");
-
if (readlink(filename, buf, sizeof(buf)) == sizeof(buf) - 1
&& (memcmp(buf, vcpu_dev, sizeof(buf) - 1) == 0))
r = 1;
diff --git a/tests/keyctl.c b/tests/keyctl.c
index 6dc30fb..96ac197 100644
--- a/tests/keyctl.c
+++ b/tests/keyctl.c
@@ -11,6 +11,7 @@
#include "tests.h"
#include "scno.h"
+#include "xmalloc.h"
#ifdef __NR_keyctl
@@ -445,7 +446,6 @@ main(void)
struct iovec *key_iov = tail_alloc(sizeof(*key_iov) * IOV_SIZE);
char *bogus_buf1 = tail_alloc(9);
char *bogus_buf2 = tail_alloc(256);
- char *key_iov_str1;
char *key_iov_str2 = tail_alloc(4096);
const char *errstr;
ssize_t ret;
@@ -472,21 +472,18 @@ main(void)
0x100000001ULL * i);
}
- ret = asprintf(&key_iov_str1, "[{iov_base=%p, iov_len=%zu}, "
- "{iov_base=%p, iov_len=%zu}, "
- "{iov_base=%p, iov_len=%zu}, "
- "{iov_base=%p, iov_len=%zu}]",
- key_iov[IOV_SIZE - 4].iov_base,
- key_iov[IOV_SIZE - 4].iov_len,
- key_iov[IOV_SIZE - 3].iov_base,
- key_iov[IOV_SIZE - 3].iov_len,
- key_iov[IOV_SIZE - 2].iov_base,
- key_iov[IOV_SIZE - 2].iov_len,
- key_iov[IOV_SIZE - 1].iov_base,
- key_iov[IOV_SIZE - 1].iov_len);
-
- if (ret < 0)
- error_msg_and_fail("asprintf");
+ char *key_iov_str1 = xasprintf("[{iov_base=%p, iov_len=%zu}, "
+ "{iov_base=%p, iov_len=%zu}, "
+ "{iov_base=%p, iov_len=%zu}, "
+ "{iov_base=%p, iov_len=%zu}]",
+ key_iov[IOV_SIZE - 4].iov_base,
+ key_iov[IOV_SIZE - 4].iov_len,
+ key_iov[IOV_SIZE - 3].iov_base,
+ key_iov[IOV_SIZE - 3].iov_len,
+ key_iov[IOV_SIZE - 2].iov_base,
+ key_iov[IOV_SIZE - 2].iov_len,
+ key_iov[IOV_SIZE - 1].iov_base,
+ key_iov[IOV_SIZE - 1].iov_len);
ret = snprintf(key_iov_str2, IOV_STR_SIZE,
"[{iov_base=\"%s\\0\", iov_len=%zu}, "
diff --git a/tests/lock_file.c b/tests/lock_file.c
index 56cf112..7618552 100644
--- a/tests/lock_file.c
+++ b/tests/lock_file.c
@@ -6,6 +6,7 @@
*/
#include "tests.h"
+#include "xmalloc.h"
#include <fcntl.h>
#include <stdio.h>
@@ -21,9 +22,7 @@ lock_file_by_dirname(const char *path_name, const char *lock_name)
const char *slash = path_name ? strrchr(path_name, '/') : NULL;
const int plen = slash ? (int) (slash - path_name) + 1 : 0;
- char *lock_file = NULL;
- if (asprintf(&lock_file, "%.*s%s", plen, path_name, lock_name) < 0)
- perror_msg_and_fail("asprintf");
+ char *lock_file = xasprintf("%.*s%s", plen, path_name, lock_name);
int lock_fd = open(lock_file, O_RDONLY);
if (lock_fd < 0)
diff --git a/tests/mq.c b/tests/mq.c
index a083e5a..7aa0914 100644
--- a/tests/mq.c
+++ b/tests/mq.c
@@ -17,6 +17,7 @@
# include <stdlib.h>
# include <unistd.h>
# include <sys/stat.h>
+# include "xmalloc.h"
int
main(void)
@@ -24,9 +25,7 @@ main(void)
struct mq_attr attr;
(void) close(0);
- char *name;
- if (asprintf(&name, "/strace-mq-%u.sample", getpid()) < 0)
- perror_msg_and_fail("asprintf");
+ char *name = xasprintf("/strace-mq-%u.sample", getpid());
if (mq_open(name, O_CREAT, 0700, NULL))
perror_msg_and_skip("mq_open");
diff --git a/tests/mq_sendrecv.c b/tests/mq_sendrecv.c
index 45ddf5e..5a919c4 100644
--- a/tests/mq_sendrecv.c
+++ b/tests/mq_sendrecv.c
@@ -27,6 +27,7 @@
# include <time.h>
# include <unistd.h>
+# include "xmalloc.h"
# include "sigevent.h"
# ifndef DUMPIO_READ
@@ -407,8 +408,7 @@ main(void)
/* Sending and receiving test */
- if (asprintf(&mq_name, "strace-mq_sendrecv-%u.sample", getpid()) < 0)
- perror_msg_and_fail("asprintf");
+ mq_name = xasprintf("strace-mq_sendrecv-%u.sample", getpid());
# if DUMPIO_READ || DUMPIO_WRITE
close(0);
diff --git a/tests/netlink_protocol.c b/tests/netlink_protocol.c
index e632ba3..c37489f 100644
--- a/tests/netlink_protocol.c
+++ b/tests/netlink_protocol.c
@@ -22,6 +22,7 @@
# include "netlink.h"
# include <linux/sock_diag.h>
# include <linux/netlink_diag.h>
+# include "xmalloc.h"
static void
send_query(const int fd)
@@ -388,9 +389,7 @@ int main(void)
{
const int fd = create_nl_socket(NETLINK_SOCK_DIAG);
- char *path;
- if (asprintf(&path, "/proc/self/fd/%u", fd) < 0)
- perror_msg_and_fail("asprintf");
+ char *path = xasprintf("/proc/self/fd/%u", fd);
char buf[256];
if (getxattr(path, "system.sockprotoname", buf, sizeof(buf) - 1) < 0)
perror_msg_and_skip("getxattr");
diff --git a/tests/old_mmap.c b/tests/old_mmap.c
index f095bc4..bb70359 100644
--- a/tests/old_mmap.c
+++ b/tests/old_mmap.c
@@ -27,6 +27,7 @@
# include <string.h>
# include <sys/mman.h>
# include <unistd.h>
+# include "xmalloc.h"
# ifndef TEST_FD
# define TEST_FD -2LU
@@ -82,9 +83,7 @@ main(void)
# ifndef PATH_TRACING
const char *errstr;
if (implemented) {
- char *str;
- if (asprintf(&str, "%#lx", rc) < 0)
- perror_msg_and_fail("asprintf");
+ char *str = xasprintf("%#lx", rc);
errstr = str;
} else {
errstr = sprintrc(rc);
diff --git a/tests/tracer_ppid_pgid_sid.c b/tests/tracer_ppid_pgid_sid.c
index 69687fa..ce9936d 100644
--- a/tests/tracer_ppid_pgid_sid.c
+++ b/tests/tracer_ppid_pgid_sid.c
@@ -8,6 +8,7 @@
*/
#include "tests.h"
+#include "xmalloc.h"
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
@@ -55,10 +56,7 @@ get_tracer_pid(void)
static void
get_ppid_pgid_sid(int pid, int *ppid, int *pgid, int *sid)
{
- char *stat;
- if (asprintf(&stat, "/proc/%d/stat", pid) < 0)
- perror_msg_and_fail("asprintf");
-
+ char *stat = xasprintf("/proc/%d/stat", pid);
FILE *fp = fopen(stat, "r");
if (!fp)
perror_msg_and_fail("fopen: %s", stat);
diff --git a/tests-m32/clone-flags.c b/tests-m32/clone-flags.c
index 04bb2c7..aa7d48c 100644
--- a/tests-m32/clone-flags.c
+++ b/tests-m32/clone-flags.c
@@ -8,6 +8,7 @@
*/
#include "tests.h"
+#include "xmalloc.h"
#include <errno.h>
#include <limits.h>
@@ -134,9 +135,7 @@ main(void)
*ptid = 0;
pid = do_clone(child, child_stack, child_stack_size,
CLONE_PIDFD|SIGCHLD, 0, ptid);
- char *fname = 0;
- if (asprintf(&fname, "/proc/self/fd/%d", *ptid) < 0)
- perror_msg_and_fail("asprintf");
+ char *fname = xasprintf("/proc/self/fd/%d", *ptid);
int rc = readlink(fname, buf, sizeof(buf) - 1);
if ((unsigned int) rc >= sizeof(buf))
perror_msg_and_fail("readlink");
diff --git a/tests-m32/faccessat.c b/tests-m32/faccessat.c
index c42aa2d..8cda6f3 100644
--- a/tests-m32/faccessat.c
+++ b/tests-m32/faccessat.c
@@ -12,6 +12,7 @@
#ifdef __NR_faccessat
+# include "xmalloc.h"
# include <fcntl.h>
# include <stdio.h>
# include <unistd.h>
@@ -48,13 +49,9 @@ main(void)
SKIP_IF_PROC_IS_UNAVAILABLE;
TAIL_ALLOC_OBJECT_CONST_PTR(const char, unterminated);
- char *unterminated_str;
- if (asprintf(&unterminated_str, "%p", unterminated) < 0)
- perror_msg_and_fail("asprintf");
+ char *unterminated_str = xasprintf("%p", unterminated);
const void *const efault = unterminated + 1;
- char *efault_str;
- if (asprintf(&efault_str, "%p", efault) < 0)
- perror_msg_and_fail("asprintf");
+ char *efault_str = xasprintf("%p", efault);
typedef struct {
char sym;
@@ -75,12 +72,8 @@ main(void)
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");
+ char *fd_str = xasprintf("%d%s", fd, FD_PATH);
+ char *path_quoted = xasprintf("\"%s\"", path);
struct {
int val;
diff --git a/tests-m32/ioctl_kvm_run_common.c b/tests-m32/ioctl_kvm_run_common.c
index 9107c30..be1190e 100644
--- a/tests-m32/ioctl_kvm_run_common.c
+++ b/tests-m32/ioctl_kvm_run_common.c
@@ -48,6 +48,7 @@
# define KVM_MAX_CPUID_ENTRIES 80
# endif
+# include "xmalloc.h"
# include "xlat.h"
# include "xlat/kvm_cpuid_flags.h"
@@ -254,12 +255,9 @@ static int
vcpu_dev_should_have_cpuid(int fd)
{
int r = 0;
- char *filename = NULL;
+ char *filename = xasprintf("/proc/%d/fd/%d", getpid(), fd);
char buf[sizeof(vcpu_dev)];
- if (asprintf(&filename, "/proc/%d/fd/%d", getpid(), fd) < 0)
- error_msg_and_fail("asprintf");
-
if (readlink(filename, buf, sizeof(buf)) == sizeof(buf) - 1
&& (memcmp(buf, vcpu_dev, sizeof(buf) - 1) == 0))
r = 1;
diff --git a/tests-m32/keyctl.c b/tests-m32/keyctl.c
index 6dc30fb..96ac197 100644
--- a/tests-m32/keyctl.c
+++ b/tests-m32/keyctl.c
@@ -11,6 +11,7 @@
#include "tests.h"
#include "scno.h"
+#include "xmalloc.h"
#ifdef __NR_keyctl
@@ -445,7 +446,6 @@ main(void)
struct iovec *key_iov = tail_alloc(sizeof(*key_iov) * IOV_SIZE);
char *bogus_buf1 = tail_alloc(9);
char *bogus_buf2 = tail_alloc(256);
- char *key_iov_str1;
char *key_iov_str2 = tail_alloc(4096);
const char *errstr;
ssize_t ret;
@@ -472,21 +472,18 @@ main(void)
0x100000001ULL * i);
}
- ret = asprintf(&key_iov_str1, "[{iov_base=%p, iov_len=%zu}, "
- "{iov_base=%p, iov_len=%zu}, "
- "{iov_base=%p, iov_len=%zu}, "
- "{iov_base=%p, iov_len=%zu}]",
- key_iov[IOV_SIZE - 4].iov_base,
- key_iov[IOV_SIZE - 4].iov_len,
- key_iov[IOV_SIZE - 3].iov_base,
- key_iov[IOV_SIZE - 3].iov_len,
- key_iov[IOV_SIZE - 2].iov_base,
- key_iov[IOV_SIZE - 2].iov_len,
- key_iov[IOV_SIZE - 1].iov_base,
- key_iov[IOV_SIZE - 1].iov_len);
-
- if (ret < 0)
- error_msg_and_fail("asprintf");
+ char *key_iov_str1 = xasprintf("[{iov_base=%p, iov_len=%zu}, "
+ "{iov_base=%p, iov_len=%zu}, "
+ "{iov_base=%p, iov_len=%zu}, "
+ "{iov_base=%p, iov_len=%zu}]",
+ key_iov[IOV_SIZE - 4].iov_base,
+ key_iov[IOV_SIZE - 4].iov_len,
+ key_iov[IOV_SIZE - 3].iov_base,
+ key_iov[IOV_SIZE - 3].iov_len,
+ key_iov[IOV_SIZE - 2].iov_base,
+ key_iov[IOV_SIZE - 2].iov_len,
+ key_iov[IOV_SIZE - 1].iov_base,
+ key_iov[IOV_SIZE - 1].iov_len);
ret = snprintf(key_iov_str2, IOV_STR_SIZE,
"[{iov_base=\"%s\\0\", iov_len=%zu}, "
diff --git a/tests-m32/lock_file.c b/tests-m32/lock_file.c
index 56cf112..7618552 100644
--- a/tests-m32/lock_file.c
+++ b/tests-m32/lock_file.c
@@ -6,6 +6,7 @@
*/
#include "tests.h"
+#include "xmalloc.h"
#include <fcntl.h>
#include <stdio.h>
@@ -21,9 +22,7 @@ lock_file_by_dirname(const char *path_name, const char *lock_name)
const char *slash = path_name ? strrchr(path_name, '/') : NULL;
const int plen = slash ? (int) (slash - path_name) + 1 : 0;
- char *lock_file = NULL;
- if (asprintf(&lock_file, "%.*s%s", plen, path_name, lock_name) < 0)
- perror_msg_and_fail("asprintf");
+ char *lock_file = xasprintf("%.*s%s", plen, path_name, lock_name);
int lock_fd = open(lock_file, O_RDONLY);
if (lock_fd < 0)
diff --git a/tests-m32/mq.c b/tests-m32/mq.c
index a083e5a..7aa0914 100644
--- a/tests-m32/mq.c
+++ b/tests-m32/mq.c
@@ -17,6 +17,7 @@
# include <stdlib.h>
# include <unistd.h>
# include <sys/stat.h>
+# include "xmalloc.h"
int
main(void)
@@ -24,9 +25,7 @@ main(void)
struct mq_attr attr;
(void) close(0);
- char *name;
- if (asprintf(&name, "/strace-mq-%u.sample", getpid()) < 0)
- perror_msg_and_fail("asprintf");
+ char *name = xasprintf("/strace-mq-%u.sample", getpid());
if (mq_open(name, O_CREAT, 0700, NULL))
perror_msg_and_skip("mq_open");
diff --git a/tests-m32/mq_sendrecv.c b/tests-m32/mq_sendrecv.c
index 45ddf5e..5a919c4 100644
--- a/tests-m32/mq_sendrecv.c
+++ b/tests-m32/mq_sendrecv.c
@@ -27,6 +27,7 @@
# include <time.h>
# include <unistd.h>
+# include "xmalloc.h"
# include "sigevent.h"
# ifndef DUMPIO_READ
@@ -407,8 +408,7 @@ main(void)
/* Sending and receiving test */
- if (asprintf(&mq_name, "strace-mq_sendrecv-%u.sample", getpid()) < 0)
- perror_msg_and_fail("asprintf");
+ mq_name = xasprintf("strace-mq_sendrecv-%u.sample", getpid());
# if DUMPIO_READ || DUMPIO_WRITE
close(0);
diff --git a/tests-m32/netlink_protocol.c b/tests-m32/netlink_protocol.c
index e632ba3..c37489f 100644
--- a/tests-m32/netlink_protocol.c
+++ b/tests-m32/netlink_protocol.c
@@ -22,6 +22,7 @@
# include "netlink.h"
# include <linux/sock_diag.h>
# include <linux/netlink_diag.h>
+# include "xmalloc.h"
static void
send_query(const int fd)
@@ -388,9 +389,7 @@ int main(void)
{
const int fd = create_nl_socket(NETLINK_SOCK_DIAG);
- char *path;
- if (asprintf(&path, "/proc/self/fd/%u", fd) < 0)
- perror_msg_and_fail("asprintf");
+ char *path = xasprintf("/proc/self/fd/%u", fd);
char buf[256];
if (getxattr(path, "system.sockprotoname", buf, sizeof(buf) - 1) < 0)
perror_msg_and_skip("getxattr");
diff --git a/tests-m32/old_mmap.c b/tests-m32/old_mmap.c
index f095bc4..bb70359 100644
--- a/tests-m32/old_mmap.c
+++ b/tests-m32/old_mmap.c
@@ -27,6 +27,7 @@
# include <string.h>
# include <sys/mman.h>
# include <unistd.h>
+# include "xmalloc.h"
# ifndef TEST_FD
# define TEST_FD -2LU
@@ -82,9 +83,7 @@ main(void)
# ifndef PATH_TRACING
const char *errstr;
if (implemented) {
- char *str;
- if (asprintf(&str, "%#lx", rc) < 0)
- perror_msg_and_fail("asprintf");
+ char *str = xasprintf("%#lx", rc);
errstr = str;
} else {
errstr = sprintrc(rc);
diff --git a/tests-m32/tracer_ppid_pgid_sid.c b/tests-m32/tracer_ppid_pgid_sid.c
index 69687fa..ce9936d 100644
--- a/tests-m32/tracer_ppid_pgid_sid.c
+++ b/tests-m32/tracer_ppid_pgid_sid.c
@@ -8,6 +8,7 @@
*/
#include "tests.h"
+#include "xmalloc.h"
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
@@ -55,10 +56,7 @@ get_tracer_pid(void)
static void
get_ppid_pgid_sid(int pid, int *ppid, int *pgid, int *sid)
{
- char *stat;
- if (asprintf(&stat, "/proc/%d/stat", pid) < 0)
- perror_msg_and_fail("asprintf");
-
+ char *stat = xasprintf("/proc/%d/stat", pid);
FILE *fp = fopen(stat, "r");
if (!fp)
perror_msg_and_fail("fopen: %s", stat);
diff --git a/tests-mx32/clone-flags.c b/tests-mx32/clone-flags.c
index 04bb2c7..aa7d48c 100644
--- a/tests-mx32/clone-flags.c
+++ b/tests-mx32/clone-flags.c
@@ -8,6 +8,7 @@
*/
#include "tests.h"
+#include "xmalloc.h"
#include <errno.h>
#include <limits.h>
@@ -134,9 +135,7 @@ main(void)
*ptid = 0;
pid = do_clone(child, child_stack, child_stack_size,
CLONE_PIDFD|SIGCHLD, 0, ptid);
- char *fname = 0;
- if (asprintf(&fname, "/proc/self/fd/%d", *ptid) < 0)
- perror_msg_and_fail("asprintf");
+ char *fname = xasprintf("/proc/self/fd/%d", *ptid);
int rc = readlink(fname, buf, sizeof(buf) - 1);
if ((unsigned int) rc >= sizeof(buf))
perror_msg_and_fail("readlink");
diff --git a/tests-mx32/faccessat.c b/tests-mx32/faccessat.c
index c42aa2d..8cda6f3 100644
--- a/tests-mx32/faccessat.c
+++ b/tests-mx32/faccessat.c
@@ -12,6 +12,7 @@
#ifdef __NR_faccessat
+# include "xmalloc.h"
# include <fcntl.h>
# include <stdio.h>
# include <unistd.h>
@@ -48,13 +49,9 @@ main(void)
SKIP_IF_PROC_IS_UNAVAILABLE;
TAIL_ALLOC_OBJECT_CONST_PTR(const char, unterminated);
- char *unterminated_str;
- if (asprintf(&unterminated_str, "%p", unterminated) < 0)
- perror_msg_and_fail("asprintf");
+ char *unterminated_str = xasprintf("%p", unterminated);
const void *const efault = unterminated + 1;
- char *efault_str;
- if (asprintf(&efault_str, "%p", efault) < 0)
- perror_msg_and_fail("asprintf");
+ char *efault_str = xasprintf("%p", efault);
typedef struct {
char sym;
@@ -75,12 +72,8 @@ main(void)
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");
+ char *fd_str = xasprintf("%d%s", fd, FD_PATH);
+ char *path_quoted = xasprintf("\"%s\"", path);
struct {
int val;
diff --git a/tests-mx32/ioctl_kvm_run_common.c b/tests-mx32/ioctl_kvm_run_common.c
index 9107c30..be1190e 100644
--- a/tests-mx32/ioctl_kvm_run_common.c
+++ b/tests-mx32/ioctl_kvm_run_common.c
@@ -48,6 +48,7 @@
# define KVM_MAX_CPUID_ENTRIES 80
# endif
+# include "xmalloc.h"
# include "xlat.h"
# include "xlat/kvm_cpuid_flags.h"
@@ -254,12 +255,9 @@ static int
vcpu_dev_should_have_cpuid(int fd)
{
int r = 0;
- char *filename = NULL;
+ char *filename = xasprintf("/proc/%d/fd/%d", getpid(), fd);
char buf[sizeof(vcpu_dev)];
- if (asprintf(&filename, "/proc/%d/fd/%d", getpid(), fd) < 0)
- error_msg_and_fail("asprintf");
-
if (readlink(filename, buf, sizeof(buf)) == sizeof(buf) - 1
&& (memcmp(buf, vcpu_dev, sizeof(buf) - 1) == 0))
r = 1;
diff --git a/tests-mx32/keyctl.c b/tests-mx32/keyctl.c
index 6dc30fb..96ac197 100644
--- a/tests-mx32/keyctl.c
+++ b/tests-mx32/keyctl.c
@@ -11,6 +11,7 @@
#include "tests.h"
#include "scno.h"
+#include "xmalloc.h"
#ifdef __NR_keyctl
@@ -445,7 +446,6 @@ main(void)
struct iovec *key_iov = tail_alloc(sizeof(*key_iov) * IOV_SIZE);
char *bogus_buf1 = tail_alloc(9);
char *bogus_buf2 = tail_alloc(256);
- char *key_iov_str1;
char *key_iov_str2 = tail_alloc(4096);
const char *errstr;
ssize_t ret;
@@ -472,21 +472,18 @@ main(void)
0x100000001ULL * i);
}
- ret = asprintf(&key_iov_str1, "[{iov_base=%p, iov_len=%zu}, "
- "{iov_base=%p, iov_len=%zu}, "
- "{iov_base=%p, iov_len=%zu}, "
- "{iov_base=%p, iov_len=%zu}]",
- key_iov[IOV_SIZE - 4].iov_base,
- key_iov[IOV_SIZE - 4].iov_len,
- key_iov[IOV_SIZE - 3].iov_base,
- key_iov[IOV_SIZE - 3].iov_len,
- key_iov[IOV_SIZE - 2].iov_base,
- key_iov[IOV_SIZE - 2].iov_len,
- key_iov[IOV_SIZE - 1].iov_base,
- key_iov[IOV_SIZE - 1].iov_len);
-
- if (ret < 0)
- error_msg_and_fail("asprintf");
+ char *key_iov_str1 = xasprintf("[{iov_base=%p, iov_len=%zu}, "
+ "{iov_base=%p, iov_len=%zu}, "
+ "{iov_base=%p, iov_len=%zu}, "
+ "{iov_base=%p, iov_len=%zu}]",
+ key_iov[IOV_SIZE - 4].iov_base,
+ key_iov[IOV_SIZE - 4].iov_len,
+ key_iov[IOV_SIZE - 3].iov_base,
+ key_iov[IOV_SIZE - 3].iov_len,
+ key_iov[IOV_SIZE - 2].iov_base,
+ key_iov[IOV_SIZE - 2].iov_len,
+ key_iov[IOV_SIZE - 1].iov_base,
+ key_iov[IOV_SIZE - 1].iov_len);
ret = snprintf(key_iov_str2, IOV_STR_SIZE,
"[{iov_base=\"%s\\0\", iov_len=%zu}, "
diff --git a/tests-mx32/lock_file.c b/tests-mx32/lock_file.c
index 56cf112..7618552 100644
--- a/tests-mx32/lock_file.c
+++ b/tests-mx32/lock_file.c
@@ -6,6 +6,7 @@
*/
#include "tests.h"
+#include "xmalloc.h"
#include <fcntl.h>
#include <stdio.h>
@@ -21,9 +22,7 @@ lock_file_by_dirname(const char *path_name, const char *lock_name)
const char *slash = path_name ? strrchr(path_name, '/') : NULL;
const int plen = slash ? (int) (slash - path_name) + 1 : 0;
- char *lock_file = NULL;
- if (asprintf(&lock_file, "%.*s%s", plen, path_name, lock_name) < 0)
- perror_msg_and_fail("asprintf");
+ char *lock_file = xasprintf("%.*s%s", plen, path_name, lock_name);
int lock_fd = open(lock_file, O_RDONLY);
if (lock_fd < 0)
diff --git a/tests-mx32/mq.c b/tests-mx32/mq.c
index a083e5a..7aa0914 100644
--- a/tests-mx32/mq.c
+++ b/tests-mx32/mq.c
@@ -17,6 +17,7 @@
# include <stdlib.h>
# include <unistd.h>
# include <sys/stat.h>
+# include "xmalloc.h"
int
main(void)
@@ -24,9 +25,7 @@ main(void)
struct mq_attr attr;
(void) close(0);
- char *name;
- if (asprintf(&name, "/strace-mq-%u.sample", getpid()) < 0)
- perror_msg_and_fail("asprintf");
+ char *name = xasprintf("/strace-mq-%u.sample", getpid());
if (mq_open(name, O_CREAT, 0700, NULL))
perror_msg_and_skip("mq_open");
diff --git a/tests-mx32/mq_sendrecv.c b/tests-mx32/mq_sendrecv.c
index 45ddf5e..5a919c4 100644
--- a/tests-mx32/mq_sendrecv.c
+++ b/tests-mx32/mq_sendrecv.c
@@ -27,6 +27,7 @@
# include <time.h>
# include <unistd.h>
+# include "xmalloc.h"
# include "sigevent.h"
# ifndef DUMPIO_READ
@@ -407,8 +408,7 @@ main(void)
/* Sending and receiving test */
- if (asprintf(&mq_name, "strace-mq_sendrecv-%u.sample", getpid()) < 0)
- perror_msg_and_fail("asprintf");
+ mq_name = xasprintf("strace-mq_sendrecv-%u.sample", getpid());
# if DUMPIO_READ || DUMPIO_WRITE
close(0);
diff --git a/tests-mx32/netlink_protocol.c b/tests-mx32/netlink_protocol.c
index e632ba3..c37489f 100644
--- a/tests-mx32/netlink_protocol.c
+++ b/tests-mx32/netlink_protocol.c
@@ -22,6 +22,7 @@
# include "netlink.h"
# include <linux/sock_diag.h>
# include <linux/netlink_diag.h>
+# include "xmalloc.h"
static void
send_query(const int fd)
@@ -388,9 +389,7 @@ int main(void)
{
const int fd = create_nl_socket(NETLINK_SOCK_DIAG);
- char *path;
- if (asprintf(&path, "/proc/self/fd/%u", fd) < 0)
- perror_msg_and_fail("asprintf");
+ char *path = xasprintf("/proc/self/fd/%u", fd);
char buf[256];
if (getxattr(path, "system.sockprotoname", buf, sizeof(buf) - 1) < 0)
perror_msg_and_skip("getxattr");
diff --git a/tests-mx32/old_mmap.c b/tests-mx32/old_mmap.c
index f095bc4..bb70359 100644
--- a/tests-mx32/old_mmap.c
+++ b/tests-mx32/old_mmap.c
@@ -27,6 +27,7 @@
# include <string.h>
# include <sys/mman.h>
# include <unistd.h>
+# include "xmalloc.h"
# ifndef TEST_FD
# define TEST_FD -2LU
@@ -82,9 +83,7 @@ main(void)
# ifndef PATH_TRACING
const char *errstr;
if (implemented) {
- char *str;
- if (asprintf(&str, "%#lx", rc) < 0)
- perror_msg_and_fail("asprintf");
+ char *str = xasprintf("%#lx", rc);
errstr = str;
} else {
errstr = sprintrc(rc);
diff --git a/tests-mx32/tracer_ppid_pgid_sid.c b/tests-mx32/tracer_ppid_pgid_sid.c
index 69687fa..ce9936d 100644
--- a/tests-mx32/tracer_ppid_pgid_sid.c
+++ b/tests-mx32/tracer_ppid_pgid_sid.c
@@ -8,6 +8,7 @@
*/
#include "tests.h"
+#include "xmalloc.h"
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
@@ -55,10 +56,7 @@ get_tracer_pid(void)
static void
get_ppid_pgid_sid(int pid, int *ppid, int *pgid, int *sid)
{
- char *stat;
- if (asprintf(&stat, "/proc/%d/stat", pid) < 0)
- perror_msg_and_fail("asprintf");
-
+ char *stat = xasprintf("/proc/%d/stat", pid);
FILE *fp = fopen(stat, "r");
if (!fp)
perror_msg_and_fail("fopen: %s", stat);
--
2.1.4

View File

@ -0,0 +1,276 @@
From 5a8d3bab6f492b3932299d9e80fb247ab00b8102 Mon Sep 17 00:00:00 2001
From: "Dmitry V. Levin" <ldv@strace.io>
Date: Sun, 7 Mar 2021 08:00:00 +0000
Subject: [PATCH 147/149] file_handle: print f_handle as a hexadecimal string
Printing the sequence of bytes as a hexadecimal number is misleading
because the latter depends on endianness.
* src/file_handle.c (print_f_handle): New function.
(SYS_FUNC(name_to_handle_at), SYS_FUNC(open_by_handle_at)): Use it
to print struct file_handle.f_handle.
* tests/file_handle.c (print_handle_data, do_open_by_handle_at, main):
Update expected output.
---
file_handle.c | 47 ++++++++++++++++++++++-------------------------
tests/file_handle.c | 26 +++++++++++---------------
2 files changed, 33 insertions(+), 40 deletions(-)
diff --git a/file_handle.c b/file_handle.c
index d82a1bc..343111f 100644
--- a/file_handle.c
+++ b/file_handle.c
@@ -19,6 +19,22 @@ typedef struct {
int handle_type;
} file_handle_header;
+static void
+print_f_handle(struct tcb *tcp, kernel_ulong_t addr, unsigned int handle_bytes)
+{
+ unsigned int len = MIN(handle_bytes, MAX_HANDLE_SZ);
+ char f_handle[MAX_HANDLE_SZ];
+ addr += sizeof(file_handle_header);
+ if (addr > sizeof(file_handle_header) &&
+ !umoven(tcp, addr, len, f_handle)) {
+ print_quoted_string(f_handle, len, QUOTE_FORCE_HEX);
+ if (handle_bytes > len)
+ tprints("...");
+ } else {
+ tprints("???");
+ }
+}
+
SYS_FUNC(name_to_handle_at)
{
file_handle_header h;
@@ -53,24 +69,15 @@ SYS_FUNC(name_to_handle_at)
return 0;
} else {
- unsigned int i = get_tcb_priv_ulong(tcp);
-
if ((!syserror(tcp) || EOVERFLOW == tcp->u_error)
&& !umove(tcp, addr, &h)) {
- unsigned char f_handle[MAX_HANDLE_SZ];
- if (i != h.handle_bytes)
+ if (h.handle_bytes != get_tcb_priv_ulong(tcp))
tprintf(" => %u", h.handle_bytes);
if (!syserror(tcp)) {
- tprintf(", handle_type=%d", h.handle_type);
- if (h.handle_bytes > MAX_HANDLE_SZ)
- h.handle_bytes = MAX_HANDLE_SZ;
- if (!umoven(tcp, addr + sizeof(h), h.handle_bytes,
- f_handle)) {
- tprints(", f_handle=0x");
- for (i = 0; i < h.handle_bytes; ++i)
- tprintf("%02x", f_handle[i]);
- }
+ tprintf(", handle_type=%d, f_handle=",
+ h.handle_type);
+ print_f_handle(tcp, addr, h.handle_bytes);
}
}
tprints("}, ");
@@ -96,19 +103,9 @@ SYS_FUNC(open_by_handle_at)
/* handle */
if (!umove_or_printaddr(tcp, addr, &h)) {
- unsigned char f_handle[MAX_HANDLE_SZ];
-
- tprintf("{handle_bytes=%u, handle_type=%d",
+ tprintf("{handle_bytes=%u, handle_type=%d, f_handle=",
h.handle_bytes, h.handle_type);
- if (h.handle_bytes > MAX_HANDLE_SZ)
- h.handle_bytes = MAX_HANDLE_SZ;
- if (!umoven(tcp, addr + sizeof(h), h.handle_bytes, &f_handle)) {
- unsigned int i;
-
- tprints(", f_handle=0x");
- for (i = 0; i < h.handle_bytes; ++i)
- tprintf("%02x", f_handle[i]);
- }
+ print_f_handle(tcp, addr, h.handle_bytes);
tprints("}");
}
tprints(", ");
diff --git a/tests/file_handle.c b/tests/file_handle.c
index edabde6..07af7ba 100644
--- a/tests/file_handle.c
+++ b/tests/file_handle.c
@@ -42,14 +42,10 @@ struct file_handle {
void
print_handle_data(unsigned char *bytes, unsigned int size)
{
- unsigned int i;
-
- if (size > MAX_HANDLE_SZ)
- size = MAX_HANDLE_SZ;
-
- printf("0x");
- for (i = 0; i < size; ++i)
- printf("%02x", bytes[i]);
+ unsigned int len = MIN(size, MAX_HANDLE_SZ);
+ print_quoted_hex(bytes, len);
+ if (size > len)
+ printf("...");
}
void
@@ -111,11 +107,13 @@ do_open_by_handle_at(kernel_ulong_t mount_fd,
printf("{handle_bytes=%u, handle_type=%d", fh->handle_bytes,
fh->handle_type);
+ printf(", f_handle=");
if (valid_data) {
- printf(", f_handle=");
print_handle_data((unsigned char *) fh +
sizeof(struct file_handle),
fh->handle_bytes);
+ } else {
+ printf("???");
}
printf("}");
@@ -275,16 +273,14 @@ main(void)
assert(syscall(__NR_name_to_handle_at, fdcwd, ".", handle, &mount_id,
flags) == 0);
printf("name_to_handle_at(AT_FDCWD, \".\", {handle_bytes=%u"
- ", handle_type=%d, f_handle=0x",
+ ", handle_type=%d, f_handle=",
handle->handle_bytes, handle->handle_type);
- for (i = 0; i < handle->handle_bytes; ++i)
- printf("%02x", handle->f_handle[i]);
+ print_handle_data(handle->f_handle, handle->handle_bytes);
printf("}, [%d], AT_SYMLINK_FOLLOW) = 0\n", mount_id);
printf("open_by_handle_at(-1, {handle_bytes=%u, handle_type=%d"
- ", f_handle=0x", handle->handle_bytes, handle->handle_type);
- for (i = 0; i < handle->handle_bytes; ++i)
- printf("%02x", handle->f_handle[i]);
+ ", f_handle=", handle->handle_bytes, handle->handle_type);
+ print_handle_data(handle->f_handle, handle->handle_bytes);
int rc = syscall(__NR_open_by_handle_at, -1, handle,
O_RDONLY | O_DIRECTORY);
printf("}, O_RDONLY|O_DIRECTORY) = %d %s (%m)\n", rc, errno2name());
diff --git a/tests-m32/file_handle.c b/tests-m32/file_handle.c
index edabde6..07af7ba 100644
--- a/tests-m32/file_handle.c
+++ b/tests-m32/file_handle.c
@@ -42,14 +42,10 @@ struct file_handle {
void
print_handle_data(unsigned char *bytes, unsigned int size)
{
- unsigned int i;
-
- if (size > MAX_HANDLE_SZ)
- size = MAX_HANDLE_SZ;
-
- printf("0x");
- for (i = 0; i < size; ++i)
- printf("%02x", bytes[i]);
+ unsigned int len = MIN(size, MAX_HANDLE_SZ);
+ print_quoted_hex(bytes, len);
+ if (size > len)
+ printf("...");
}
void
@@ -111,11 +107,13 @@ do_open_by_handle_at(kernel_ulong_t mount_fd,
printf("{handle_bytes=%u, handle_type=%d", fh->handle_bytes,
fh->handle_type);
+ printf(", f_handle=");
if (valid_data) {
- printf(", f_handle=");
print_handle_data((unsigned char *) fh +
sizeof(struct file_handle),
fh->handle_bytes);
+ } else {
+ printf("???");
}
printf("}");
@@ -275,16 +273,14 @@ main(void)
assert(syscall(__NR_name_to_handle_at, fdcwd, ".", handle, &mount_id,
flags) == 0);
printf("name_to_handle_at(AT_FDCWD, \".\", {handle_bytes=%u"
- ", handle_type=%d, f_handle=0x",
+ ", handle_type=%d, f_handle=",
handle->handle_bytes, handle->handle_type);
- for (i = 0; i < handle->handle_bytes; ++i)
- printf("%02x", handle->f_handle[i]);
+ print_handle_data(handle->f_handle, handle->handle_bytes);
printf("}, [%d], AT_SYMLINK_FOLLOW) = 0\n", mount_id);
printf("open_by_handle_at(-1, {handle_bytes=%u, handle_type=%d"
- ", f_handle=0x", handle->handle_bytes, handle->handle_type);
- for (i = 0; i < handle->handle_bytes; ++i)
- printf("%02x", handle->f_handle[i]);
+ ", f_handle=", handle->handle_bytes, handle->handle_type);
+ print_handle_data(handle->f_handle, handle->handle_bytes);
int rc = syscall(__NR_open_by_handle_at, -1, handle,
O_RDONLY | O_DIRECTORY);
printf("}, O_RDONLY|O_DIRECTORY) = %d %s (%m)\n", rc, errno2name());
diff --git a/tests-mx32/file_handle.c b/tests-mx32/file_handle.c
index edabde6..07af7ba 100644
--- a/tests-mx32/file_handle.c
+++ b/tests-mx32/file_handle.c
@@ -42,14 +42,10 @@ struct file_handle {
void
print_handle_data(unsigned char *bytes, unsigned int size)
{
- unsigned int i;
-
- if (size > MAX_HANDLE_SZ)
- size = MAX_HANDLE_SZ;
-
- printf("0x");
- for (i = 0; i < size; ++i)
- printf("%02x", bytes[i]);
+ unsigned int len = MIN(size, MAX_HANDLE_SZ);
+ print_quoted_hex(bytes, len);
+ if (size > len)
+ printf("...");
}
void
@@ -111,11 +107,13 @@ do_open_by_handle_at(kernel_ulong_t mount_fd,
printf("{handle_bytes=%u, handle_type=%d", fh->handle_bytes,
fh->handle_type);
+ printf(", f_handle=");
if (valid_data) {
- printf(", f_handle=");
print_handle_data((unsigned char *) fh +
sizeof(struct file_handle),
fh->handle_bytes);
+ } else {
+ printf("???");
}
printf("}");
@@ -275,16 +273,14 @@ main(void)
assert(syscall(__NR_name_to_handle_at, fdcwd, ".", handle, &mount_id,
flags) == 0);
printf("name_to_handle_at(AT_FDCWD, \".\", {handle_bytes=%u"
- ", handle_type=%d, f_handle=0x",
+ ", handle_type=%d, f_handle=",
handle->handle_bytes, handle->handle_type);
- for (i = 0; i < handle->handle_bytes; ++i)
- printf("%02x", handle->f_handle[i]);
+ print_handle_data(handle->f_handle, handle->handle_bytes);
printf("}, [%d], AT_SYMLINK_FOLLOW) = 0\n", mount_id);
printf("open_by_handle_at(-1, {handle_bytes=%u, handle_type=%d"
- ", f_handle=0x", handle->handle_bytes, handle->handle_type);
- for (i = 0; i < handle->handle_bytes; ++i)
- printf("%02x", handle->f_handle[i]);
+ ", f_handle=", handle->handle_bytes, handle->handle_type);
+ print_handle_data(handle->f_handle, handle->handle_bytes);
int rc = syscall(__NR_open_by_handle_at, -1, handle,
O_RDONLY | O_DIRECTORY);
printf("}, O_RDONLY|O_DIRECTORY) = %d %s (%m)\n", rc, errno2name());
--
2.1.4

View File

@ -0,0 +1,486 @@
From 1ec648999d3bf01ae87cac65c810d5d8f19c71c0 Mon Sep 17 00:00:00 2001
From: Sven Schnelle <svens@stackframe.org>
Date: Tue, 10 Nov 2020 07:38:34 +0100
Subject: [PATCH 148/149] tests: fix execve test with fresh linux kernels
Starting with Linux commit v5.9-rc1~164^2^2~2, execve copies syscall
arguments before trying to find the executable, failing with EFAULT
in case of a faulty address. Adjust the test to handle both variants
of execve behaviour.
* tests/execve.c (errstr): New variable.
(call_execve): New function.
(main): Use it instead of execve. Do not hardcode ENOENT in expected
output of tests, use errstr instead.
Signed-off-by: Sven Schnelle <svens@stackframe.org>
Signed-off-by: Dmitry V. Levin <ldv@altlinux.org>
---
tests/execve.c | 54 ++++++++++++++++++++++++++++++++----------------------
1 file changed, 32 insertions(+), 22 deletions(-)
diff --git a/tests/execve.c b/tests/execve.c
index 2f6ae52..961d284 100644
--- a/tests/execve.c
+++ b/tests/execve.c
@@ -12,6 +12,16 @@
#include <stdio.h>
#include <unistd.h>
+static const char *errstr;
+
+static int
+call_execve(const char *pathname, char *const *argv, char *const *envp)
+{
+ int rc = execve(pathname, argv, envp);
+ errstr = sprintrc(rc);
+ return rc;
+}
+
#define FILENAME "test.execve\nfilename"
#define Q_FILENAME "test.execve\\nfilename"
@@ -43,7 +53,7 @@ main(void)
char ** const tail_argv = tail_memdup(argv, sizeof(argv));
char ** const tail_envp = tail_memdup(envp, sizeof(envp));
- execve(FILENAME, tail_argv, tail_envp);
+ call_execve(FILENAME, tail_argv, tail_envp);
printf("execve(\"%s\""
", [\"%s\", \"%s\", \"%s\", %p, %p, %p, ... /* %p */]"
#if VERBOSE
@@ -51,7 +61,7 @@ main(void)
#else
", %p /* 5 vars, unterminated */"
#endif
- ") = -1 ENOENT (%m)\n",
+ ") = %s\n",
Q_FILENAME, q_argv[0], q_argv[1], q_argv[2],
argv[3], argv[4], argv[5], (char *) tail_argv + sizeof(argv)
#if VERBOSE
@@ -60,60 +70,60 @@ main(void)
#else
, tail_envp
#endif
- );
+ , errstr);
tail_argv[ARRAY_SIZE(q_argv)] = NULL;
tail_envp[ARRAY_SIZE(q_envp)] = NULL;
(void) q_envp; /* workaround for clang bug #33068 */
- execve(FILENAME, tail_argv, tail_envp);
+ call_execve(FILENAME, tail_argv, tail_envp);
printf("execve(\"%s\", [\"%s\", \"%s\", \"%s\"]"
#if VERBOSE
", [\"%s\", \"%s\"]"
#else
", %p /* 2 vars */"
#endif
- ") = -1 ENOENT (%m)\n",
+ ") = %s\n",
Q_FILENAME, q_argv[0], q_argv[1], q_argv[2]
#if VERBOSE
, q_envp[0], q_envp[1]
#else
, tail_envp
#endif
- );
+ , errstr);
- execve(FILENAME, tail_argv + 2, tail_envp + 1);
+ call_execve(FILENAME, tail_argv + 2, tail_envp + 1);
printf("execve(\"%s\", [\"%s\"]"
#if VERBOSE
", [\"%s\"]"
#else
", %p /* 1 var */"
#endif
- ") = -1 ENOENT (%m)\n",
+ ") = %s\n",
Q_FILENAME, q_argv[2]
#if VERBOSE
, q_envp[1]
#else
, tail_envp + 1
#endif
- );
+ , errstr);
TAIL_ALLOC_OBJECT_CONST_PTR(char *, empty);
char **const efault = empty + 1;
*empty = NULL;
- execve(FILENAME, empty, empty);
+ call_execve(FILENAME, empty, empty);
printf("execve(\"%s\", []"
#if VERBOSE
", []"
#else
", %p /* 0 vars */"
#endif
- ") = -1 ENOENT (%m)\n", Q_FILENAME
+ ") = %s\n", Q_FILENAME
#if !VERBOSE
, empty
#endif
- );
+ , errstr);
char *const str_a = tail_alloc(DEFAULT_STRLEN + 2);
fill_memory_ex(str_a, DEFAULT_STRLEN + 1, '0', 10);
@@ -132,7 +142,7 @@ main(void)
}
a[i] = b[i] = NULL;
- execve(FILENAME, a, b);
+ call_execve(FILENAME, a, b);
printf("execve(\"%s\", [\"%.*s\"...", Q_FILENAME, DEFAULT_STRLEN, a[0]);
for (i = 1; i < DEFAULT_STRLEN; ++i)
printf(", \"%s\"", a[i]);
@@ -149,9 +159,9 @@ main(void)
#else
printf("], %p /* %u vars */", b, DEFAULT_STRLEN + 1);
#endif
- printf(") = -1 ENOENT (%m)\n");
+ printf(") = %s\n", errstr);
- execve(FILENAME, a + 1, b + 1);
+ call_execve(FILENAME, a + 1, b + 1);
printf("execve(\"%s\", [\"%s\"", Q_FILENAME, a[1]);
for (i = 2; i <= DEFAULT_STRLEN; ++i)
printf(", \"%s\"", a[i]);
@@ -163,15 +173,15 @@ main(void)
#else
printf("], %p /* %d vars */", b + 1, DEFAULT_STRLEN);
#endif
- printf(") = -1 ENOENT (%m)\n");
+ printf(") = %s\n", errstr);
- execve(FILENAME, (char **) tail_argv[ARRAY_SIZE(q_argv)], efault);
- printf("execve(\"%s\", NULL, %p) = -1 ENOENT (%m)\n",
- Q_FILENAME, efault);
+ call_execve(FILENAME, (char **) tail_argv[ARRAY_SIZE(q_argv)], efault);
+ printf("execve(\"%s\", NULL, %p) = %s\n",
+ Q_FILENAME, efault, errstr);
- execve(FILENAME, efault, NULL);
- printf("execve(\"%s\", %p, NULL) = -1 ENOENT (%m)\n",
- Q_FILENAME, efault);
+ call_execve(FILENAME, efault, NULL);
+ printf("execve(\"%s\", %p, NULL) = %s\n",
+ Q_FILENAME, efault, errstr);
leave_and_remove_subdir();
diff --git a/tests-m32/execve.c b/tests-m32/execve.c
index 2f6ae52..961d284 100644
--- a/tests-m32/execve.c
+++ b/tests-m32/execve.c
@@ -12,6 +12,16 @@
#include <stdio.h>
#include <unistd.h>
+static const char *errstr;
+
+static int
+call_execve(const char *pathname, char *const *argv, char *const *envp)
+{
+ int rc = execve(pathname, argv, envp);
+ errstr = sprintrc(rc);
+ return rc;
+}
+
#define FILENAME "test.execve\nfilename"
#define Q_FILENAME "test.execve\\nfilename"
@@ -43,7 +53,7 @@ main(void)
char ** const tail_argv = tail_memdup(argv, sizeof(argv));
char ** const tail_envp = tail_memdup(envp, sizeof(envp));
- execve(FILENAME, tail_argv, tail_envp);
+ call_execve(FILENAME, tail_argv, tail_envp);
printf("execve(\"%s\""
", [\"%s\", \"%s\", \"%s\", %p, %p, %p, ... /* %p */]"
#if VERBOSE
@@ -51,7 +61,7 @@ main(void)
#else
", %p /* 5 vars, unterminated */"
#endif
- ") = -1 ENOENT (%m)\n",
+ ") = %s\n",
Q_FILENAME, q_argv[0], q_argv[1], q_argv[2],
argv[3], argv[4], argv[5], (char *) tail_argv + sizeof(argv)
#if VERBOSE
@@ -60,60 +70,60 @@ main(void)
#else
, tail_envp
#endif
- );
+ , errstr);
tail_argv[ARRAY_SIZE(q_argv)] = NULL;
tail_envp[ARRAY_SIZE(q_envp)] = NULL;
(void) q_envp; /* workaround for clang bug #33068 */
- execve(FILENAME, tail_argv, tail_envp);
+ call_execve(FILENAME, tail_argv, tail_envp);
printf("execve(\"%s\", [\"%s\", \"%s\", \"%s\"]"
#if VERBOSE
", [\"%s\", \"%s\"]"
#else
", %p /* 2 vars */"
#endif
- ") = -1 ENOENT (%m)\n",
+ ") = %s\n",
Q_FILENAME, q_argv[0], q_argv[1], q_argv[2]
#if VERBOSE
, q_envp[0], q_envp[1]
#else
, tail_envp
#endif
- );
+ , errstr);
- execve(FILENAME, tail_argv + 2, tail_envp + 1);
+ call_execve(FILENAME, tail_argv + 2, tail_envp + 1);
printf("execve(\"%s\", [\"%s\"]"
#if VERBOSE
", [\"%s\"]"
#else
", %p /* 1 var */"
#endif
- ") = -1 ENOENT (%m)\n",
+ ") = %s\n",
Q_FILENAME, q_argv[2]
#if VERBOSE
, q_envp[1]
#else
, tail_envp + 1
#endif
- );
+ , errstr);
TAIL_ALLOC_OBJECT_CONST_PTR(char *, empty);
char **const efault = empty + 1;
*empty = NULL;
- execve(FILENAME, empty, empty);
+ call_execve(FILENAME, empty, empty);
printf("execve(\"%s\", []"
#if VERBOSE
", []"
#else
", %p /* 0 vars */"
#endif
- ") = -1 ENOENT (%m)\n", Q_FILENAME
+ ") = %s\n", Q_FILENAME
#if !VERBOSE
, empty
#endif
- );
+ , errstr);
char *const str_a = tail_alloc(DEFAULT_STRLEN + 2);
fill_memory_ex(str_a, DEFAULT_STRLEN + 1, '0', 10);
@@ -132,7 +142,7 @@ main(void)
}
a[i] = b[i] = NULL;
- execve(FILENAME, a, b);
+ call_execve(FILENAME, a, b);
printf("execve(\"%s\", [\"%.*s\"...", Q_FILENAME, DEFAULT_STRLEN, a[0]);
for (i = 1; i < DEFAULT_STRLEN; ++i)
printf(", \"%s\"", a[i]);
@@ -149,9 +159,9 @@ main(void)
#else
printf("], %p /* %u vars */", b, DEFAULT_STRLEN + 1);
#endif
- printf(") = -1 ENOENT (%m)\n");
+ printf(") = %s\n", errstr);
- execve(FILENAME, a + 1, b + 1);
+ call_execve(FILENAME, a + 1, b + 1);
printf("execve(\"%s\", [\"%s\"", Q_FILENAME, a[1]);
for (i = 2; i <= DEFAULT_STRLEN; ++i)
printf(", \"%s\"", a[i]);
@@ -163,15 +173,15 @@ main(void)
#else
printf("], %p /* %d vars */", b + 1, DEFAULT_STRLEN);
#endif
- printf(") = -1 ENOENT (%m)\n");
+ printf(") = %s\n", errstr);
- execve(FILENAME, (char **) tail_argv[ARRAY_SIZE(q_argv)], efault);
- printf("execve(\"%s\", NULL, %p) = -1 ENOENT (%m)\n",
- Q_FILENAME, efault);
+ call_execve(FILENAME, (char **) tail_argv[ARRAY_SIZE(q_argv)], efault);
+ printf("execve(\"%s\", NULL, %p) = %s\n",
+ Q_FILENAME, efault, errstr);
- execve(FILENAME, efault, NULL);
- printf("execve(\"%s\", %p, NULL) = -1 ENOENT (%m)\n",
- Q_FILENAME, efault);
+ call_execve(FILENAME, efault, NULL);
+ printf("execve(\"%s\", %p, NULL) = %s\n",
+ Q_FILENAME, efault, errstr);
leave_and_remove_subdir();
diff --git a/tests-mx32/execve.c b/tests-mx32/execve.c
index 2f6ae52..961d284 100644
--- a/tests-mx32/execve.c
+++ b/tests-mx32/execve.c
@@ -12,6 +12,16 @@
#include <stdio.h>
#include <unistd.h>
+static const char *errstr;
+
+static int
+call_execve(const char *pathname, char *const *argv, char *const *envp)
+{
+ int rc = execve(pathname, argv, envp);
+ errstr = sprintrc(rc);
+ return rc;
+}
+
#define FILENAME "test.execve\nfilename"
#define Q_FILENAME "test.execve\\nfilename"
@@ -43,7 +53,7 @@ main(void)
char ** const tail_argv = tail_memdup(argv, sizeof(argv));
char ** const tail_envp = tail_memdup(envp, sizeof(envp));
- execve(FILENAME, tail_argv, tail_envp);
+ call_execve(FILENAME, tail_argv, tail_envp);
printf("execve(\"%s\""
", [\"%s\", \"%s\", \"%s\", %p, %p, %p, ... /* %p */]"
#if VERBOSE
@@ -51,7 +61,7 @@ main(void)
#else
", %p /* 5 vars, unterminated */"
#endif
- ") = -1 ENOENT (%m)\n",
+ ") = %s\n",
Q_FILENAME, q_argv[0], q_argv[1], q_argv[2],
argv[3], argv[4], argv[5], (char *) tail_argv + sizeof(argv)
#if VERBOSE
@@ -60,60 +70,60 @@ main(void)
#else
, tail_envp
#endif
- );
+ , errstr);
tail_argv[ARRAY_SIZE(q_argv)] = NULL;
tail_envp[ARRAY_SIZE(q_envp)] = NULL;
(void) q_envp; /* workaround for clang bug #33068 */
- execve(FILENAME, tail_argv, tail_envp);
+ call_execve(FILENAME, tail_argv, tail_envp);
printf("execve(\"%s\", [\"%s\", \"%s\", \"%s\"]"
#if VERBOSE
", [\"%s\", \"%s\"]"
#else
", %p /* 2 vars */"
#endif
- ") = -1 ENOENT (%m)\n",
+ ") = %s\n",
Q_FILENAME, q_argv[0], q_argv[1], q_argv[2]
#if VERBOSE
, q_envp[0], q_envp[1]
#else
, tail_envp
#endif
- );
+ , errstr);
- execve(FILENAME, tail_argv + 2, tail_envp + 1);
+ call_execve(FILENAME, tail_argv + 2, tail_envp + 1);
printf("execve(\"%s\", [\"%s\"]"
#if VERBOSE
", [\"%s\"]"
#else
", %p /* 1 var */"
#endif
- ") = -1 ENOENT (%m)\n",
+ ") = %s\n",
Q_FILENAME, q_argv[2]
#if VERBOSE
, q_envp[1]
#else
, tail_envp + 1
#endif
- );
+ , errstr);
TAIL_ALLOC_OBJECT_CONST_PTR(char *, empty);
char **const efault = empty + 1;
*empty = NULL;
- execve(FILENAME, empty, empty);
+ call_execve(FILENAME, empty, empty);
printf("execve(\"%s\", []"
#if VERBOSE
", []"
#else
", %p /* 0 vars */"
#endif
- ") = -1 ENOENT (%m)\n", Q_FILENAME
+ ") = %s\n", Q_FILENAME
#if !VERBOSE
, empty
#endif
- );
+ , errstr);
char *const str_a = tail_alloc(DEFAULT_STRLEN + 2);
fill_memory_ex(str_a, DEFAULT_STRLEN + 1, '0', 10);
@@ -132,7 +142,7 @@ main(void)
}
a[i] = b[i] = NULL;
- execve(FILENAME, a, b);
+ call_execve(FILENAME, a, b);
printf("execve(\"%s\", [\"%.*s\"...", Q_FILENAME, DEFAULT_STRLEN, a[0]);
for (i = 1; i < DEFAULT_STRLEN; ++i)
printf(", \"%s\"", a[i]);
@@ -149,9 +159,9 @@ main(void)
#else
printf("], %p /* %u vars */", b, DEFAULT_STRLEN + 1);
#endif
- printf(") = -1 ENOENT (%m)\n");
+ printf(") = %s\n", errstr);
- execve(FILENAME, a + 1, b + 1);
+ call_execve(FILENAME, a + 1, b + 1);
printf("execve(\"%s\", [\"%s\"", Q_FILENAME, a[1]);
for (i = 2; i <= DEFAULT_STRLEN; ++i)
printf(", \"%s\"", a[i]);
@@ -163,15 +173,15 @@ main(void)
#else
printf("], %p /* %d vars */", b + 1, DEFAULT_STRLEN);
#endif
- printf(") = -1 ENOENT (%m)\n");
+ printf(") = %s\n", errstr);
- execve(FILENAME, (char **) tail_argv[ARRAY_SIZE(q_argv)], efault);
- printf("execve(\"%s\", NULL, %p) = -1 ENOENT (%m)\n",
- Q_FILENAME, efault);
+ call_execve(FILENAME, (char **) tail_argv[ARRAY_SIZE(q_argv)], efault);
+ printf("execve(\"%s\", NULL, %p) = %s\n",
+ Q_FILENAME, efault, errstr);
- execve(FILENAME, efault, NULL);
- printf("execve(\"%s\", %p, NULL) = -1 ENOENT (%m)\n",
- Q_FILENAME, efault);
+ call_execve(FILENAME, efault, NULL);
+ printf("execve(\"%s\", %p, NULL) = %s\n",
+ Q_FILENAME, efault, errstr);
leave_and_remove_subdir();
--
2.1.4

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,86 @@
From bbe5eefaa928449de5994c5288a7c85fae54f716 Mon Sep 17 00:00:00 2001
From: Eugene Syromyatnikov <evgsyr@gmail.com>
Date: Sat, 31 Jul 2021 15:17:41 +0200
Subject: [PATCH] m4/mpers.m4: generate HAVE_*_SELINUX_RUNTIME config defines
While bootstrap has some provisions for mangling HAVE_SELINUX_RUNTIME
into HAVE_{M32,MX32}_SELINUX_RUNTIME, and there is logic for checking
SELinux runtime presence in non-native personalities, the relevant
configuration definition is not ultimately generated, as it has to be
defined explicitly, similarly to HAVE_*_MPERS.
* m4/mpers.m4 (st_MPERS) [$st_cv_selinux_runtime == yes]: AC_DEFINE
HAVE_SELINUX_RUNTIME.
Complements: v5.12~49 "Implement --secontext[=full] option to display SELinux contexts"
---
m4/mpers.m4 | 4 ++++
1 file changed, 4 insertions(+)
Index: strace-5.7/m4/mpers.m4
===================================================================
--- strace-5.7.orig/m4/mpers.m4 2021-08-24 21:08:43.252246052 +0200
+++ strace-5.7/m4/mpers.m4 2021-08-24 21:26:07.436408149 +0200
@@ -179,6 +179,10 @@
popdef([SIZEOF_STRUCT_MSQID64_DS])
fi
fi
+ if test "x$st_cv_selinux_runtime" = xyes; then
+ AC_DEFINE([HAVE_SELINUX_RUNTIME], [1],
+ [Define to enable SELinux security contexts testing for ]mpers_name[ personality])
+ fi
fi
CPPFLAGS="$saved_CPPFLAGS"
CFLAGS="$saved_CFLAGS"
Index: strace-5.7/config.h.in
===================================================================
--- strace-5.7.orig/config.h.in 2021-08-24 21:08:43.304245612 +0200
+++ strace-5.7/config.h.in 2021-08-24 21:26:07.437408141 +0200
@@ -2181,6 +2181,9 @@
/* Define to 1 if you have mpers_name mpers support */
#undef HAVE_M32_MPERS
+/* Define to enable SELinux security contexts testing for m32 personality */
+#undef HAVE_M32_SELINUX_RUNTIME
+
/* Define to 1 if m32 has the type 'struct stat'. */
#undef HAVE_M32_STRUCT_STAT
@@ -2202,6 +2205,9 @@
/* Define to 1 if you have mpers_name mpers support */
#undef HAVE_MX32_MPERS
+/* Define to enable SELinux security contexts testing for mx32 personality */
+#undef HAVE_MX32_SELINUX_RUNTIME
+
/* Define to 1 if mx32 has the type 'struct stat'. */
#undef HAVE_MX32_STRUCT_STAT
Index: strace-5.7/configure
===================================================================
--- strace-5.7.orig/configure 2021-08-24 21:08:43.315245519 +0200
+++ strace-5.7/configure 2021-08-24 21:26:07.439408124 +0200
@@ -23632,6 +23632,11 @@
fi
fi
+ if test "x$st_cv_m32_selinux_runtime" = xyes; then
+
+$as_echo "#define HAVE_M32_SELINUX_RUNTIME 1" >>confdefs.h
+
+ fi
fi
CPPFLAGS="$saved_CPPFLAGS"
CFLAGS="$saved_CFLAGS"
@@ -24314,6 +24319,11 @@
fi
fi
+ if test "x$st_cv_mx32_selinux_runtime" = xyes; then
+
+$as_echo "#define HAVE_MX32_SELINUX_RUNTIME 1" >>confdefs.h
+
+ fi
fi
CPPFLAGS="$saved_CPPFLAGS"
CFLAGS="$saved_CFLAGS"

View File

@ -0,0 +1,209 @@
From 21bbf3a53b8be9b3fe90bcdb66c7ded35bc3e344 Mon Sep 17 00:00:00 2001
From: "Dmitry V. Levin" <ldv@altlinux.org>
Date: Sat, 12 Sep 2020 08:00:00 +0000
Subject: [PATCH 156/162] Introduce GLIBC_PREREQ_GE and GLIBC_PREREQ_LT macros
* gcc_compat.h (GLIBC_PREREQ_GE, GLIBC_PREREQ_LT): New macros.
* tests/ipc_msg.c: Use GLIBC_PREREQ_LT instead of manual checking
for __GLIBC__ and __GLIBC_MINOR__.
* tests/readahead.c: Likewise.
---
gcc_compat.h | 15 +++++++++++++++
tests/ipc_msg.c | 9 +++------
tests/readahead.c | 16 ++++++----------
3 files changed, 24 insertions(+), 16 deletions(-)
diff --git a/gcc_compat.h b/gcc_compat.h
index 0525b5e..4c23ebc 100644
--- a/gcc_compat.h
+++ b/gcc_compat.h
@@ -23,6 +23,21 @@
# define CLANG_PREREQ(maj, min) 0
# endif
+# ifdef __GLIBC__
+# ifdef __GLIBC_MINOR__
+# define GLIBC_PREREQ_GE(maj, min) \
+ ((__GLIBC__ << 16) + __GLIBC_MINOR__ >= ((maj) << 16) + (min))
+# define GLIBC_PREREQ_LT(maj, min) \
+ ((__GLIBC__ << 16) + __GLIBC_MINOR__ < ((maj) << 16) + (min))
+# else /* !__GLIBC_MINOR__ */
+# define GLIBC_PREREQ_GE(maj, min) 0
+# define GLIBC_PREREQ_LT(maj, min) 1
+# endif
+# else /* !__GLIBC__ */
+# define GLIBC_PREREQ_GE(maj, min) 0
+# define GLIBC_PREREQ_LT(maj, min) 0
+# endif
+
# if !(GNUC_PREREQ(2, 0) || CLANG_PREREQ(1, 0))
# define __attribute__(x) /* empty */
# endif
diff --git a/tests/ipc_msg.c b/tests/ipc_msg.c
index 63bdd77..dd0f303 100644
--- a/tests/ipc_msg.c
+++ b/tests/ipc_msg.c
@@ -26,12 +26,9 @@
* which led to segmentation fault.
*/
#undef TEST_MSGCTL_BOGUS_ADDR
-#if defined __GLIBC__ && (defined POWERPC64 || defined POWERPC64LE)
-# if !(defined __GLIBC_MINOR__) \
- || ((__GLIBC__ << 16) + __GLIBC_MINOR__ < (2 << 16) + 23)
-# define TEST_MSGCTL_BOGUS_ADDR 0
-# endif
-#endif /* __GLIBC__ && (POWERPC64 || POWERPC64LE) */
+#if GLIBC_PREREQ_LT(2, 23) && (defined POWERPC64 || defined POWERPC64LE)
+# define TEST_MSGCTL_BOGUS_ADDR 0
+#endif
#ifndef TEST_MSGCTL_BOGUS_ADDR
# define TEST_MSGCTL_BOGUS_ADDR 1
diff --git a/tests/readahead.c b/tests/readahead.c
index 86d09b0..6f4b81e 100644
--- a/tests/readahead.c
+++ b/tests/readahead.c
@@ -11,24 +11,20 @@
#ifdef HAVE_READAHEAD
/* Check for glibc readahead argument passing bugs. */
-# ifdef __GLIBC__
/*
* glibc < 2.8 had an incorrect order of higher and lower parts of offset,
* see https://sourceware.org/bugzilla/show_bug.cgi?id=5208
*/
-# if !(defined __GLIBC_MINOR__ && \
- (__GLIBC__ << 16) + __GLIBC_MINOR__ >= (2 << 16) + 8)
-# undef HAVE_READAHEAD
-# endif /* glibc < 2.8 */
+# if GLIBC_PREREQ_LT(2, 8)
+# undef HAVE_READAHEAD
+# endif /* glibc < 2.8 */
/*
* glibc < 2.25 had an incorrect implementation on mips n64,
* see https://sourceware.org/bugzilla/show_bug.cgi?id=21026
*/
-# if defined LINUX_MIPSN64 && !(defined __GLIBC_MINOR__ && \
- (__GLIBC__ << 16) + __GLIBC_MINOR__ >= (2 << 16) + 25)
-# undef HAVE_READAHEAD
-# endif /* LINUX_MIPSN64 && glibc < 2.25 */
-# endif /* __GLIBC__ */
+# if GLIBC_PREREQ_LT(2, 25) && defined LINUX_MIPSN64
+# undef HAVE_READAHEAD
+# endif /* LINUX_MIPSN64 && glibc < 2.25 */
#endif /* HAVE_READAHEAD */
#ifdef HAVE_READAHEAD
diff --git a/tests-m32/ipc_msg.c b/tests-m32/ipc_msg.c
index 63bdd77..dd0f303 100644
--- a/tests-m32/ipc_msg.c
+++ b/tests-m32/ipc_msg.c
@@ -26,12 +26,9 @@
* which led to segmentation fault.
*/
#undef TEST_MSGCTL_BOGUS_ADDR
-#if defined __GLIBC__ && (defined POWERPC64 || defined POWERPC64LE)
-# if !(defined __GLIBC_MINOR__) \
- || ((__GLIBC__ << 16) + __GLIBC_MINOR__ < (2 << 16) + 23)
-# define TEST_MSGCTL_BOGUS_ADDR 0
-# endif
-#endif /* __GLIBC__ && (POWERPC64 || POWERPC64LE) */
+#if GLIBC_PREREQ_LT(2, 23) && (defined POWERPC64 || defined POWERPC64LE)
+# define TEST_MSGCTL_BOGUS_ADDR 0
+#endif
#ifndef TEST_MSGCTL_BOGUS_ADDR
# define TEST_MSGCTL_BOGUS_ADDR 1
diff --git a/tests-m32/readahead.c b/tests-m32/readahead.c
index 86d09b0..6f4b81e 100644
--- a/tests-m32/readahead.c
+++ b/tests-m32/readahead.c
@@ -11,24 +11,20 @@
#ifdef HAVE_READAHEAD
/* Check for glibc readahead argument passing bugs. */
-# ifdef __GLIBC__
/*
* glibc < 2.8 had an incorrect order of higher and lower parts of offset,
* see https://sourceware.org/bugzilla/show_bug.cgi?id=5208
*/
-# if !(defined __GLIBC_MINOR__ && \
- (__GLIBC__ << 16) + __GLIBC_MINOR__ >= (2 << 16) + 8)
-# undef HAVE_READAHEAD
-# endif /* glibc < 2.8 */
+# if GLIBC_PREREQ_LT(2, 8)
+# undef HAVE_READAHEAD
+# endif /* glibc < 2.8 */
/*
* glibc < 2.25 had an incorrect implementation on mips n64,
* see https://sourceware.org/bugzilla/show_bug.cgi?id=21026
*/
-# if defined LINUX_MIPSN64 && !(defined __GLIBC_MINOR__ && \
- (__GLIBC__ << 16) + __GLIBC_MINOR__ >= (2 << 16) + 25)
-# undef HAVE_READAHEAD
-# endif /* LINUX_MIPSN64 && glibc < 2.25 */
-# endif /* __GLIBC__ */
+# if GLIBC_PREREQ_LT(2, 25) && defined LINUX_MIPSN64
+# undef HAVE_READAHEAD
+# endif /* LINUX_MIPSN64 && glibc < 2.25 */
#endif /* HAVE_READAHEAD */
#ifdef HAVE_READAHEAD
diff --git a/tests-mx32/ipc_msg.c b/tests-mx32/ipc_msg.c
index 63bdd77..dd0f303 100644
--- a/tests-mx32/ipc_msg.c
+++ b/tests-mx32/ipc_msg.c
@@ -26,12 +26,9 @@
* which led to segmentation fault.
*/
#undef TEST_MSGCTL_BOGUS_ADDR
-#if defined __GLIBC__ && (defined POWERPC64 || defined POWERPC64LE)
-# if !(defined __GLIBC_MINOR__) \
- || ((__GLIBC__ << 16) + __GLIBC_MINOR__ < (2 << 16) + 23)
-# define TEST_MSGCTL_BOGUS_ADDR 0
-# endif
-#endif /* __GLIBC__ && (POWERPC64 || POWERPC64LE) */
+#if GLIBC_PREREQ_LT(2, 23) && (defined POWERPC64 || defined POWERPC64LE)
+# define TEST_MSGCTL_BOGUS_ADDR 0
+#endif
#ifndef TEST_MSGCTL_BOGUS_ADDR
# define TEST_MSGCTL_BOGUS_ADDR 1
diff --git a/tests-mx32/readahead.c b/tests-mx32/readahead.c
index 86d09b0..6f4b81e 100644
--- a/tests-mx32/readahead.c
+++ b/tests-mx32/readahead.c
@@ -11,24 +11,20 @@
#ifdef HAVE_READAHEAD
/* Check for glibc readahead argument passing bugs. */
-# ifdef __GLIBC__
/*
* glibc < 2.8 had an incorrect order of higher and lower parts of offset,
* see https://sourceware.org/bugzilla/show_bug.cgi?id=5208
*/
-# if !(defined __GLIBC_MINOR__ && \
- (__GLIBC__ << 16) + __GLIBC_MINOR__ >= (2 << 16) + 8)
-# undef HAVE_READAHEAD
-# endif /* glibc < 2.8 */
+# if GLIBC_PREREQ_LT(2, 8)
+# undef HAVE_READAHEAD
+# endif /* glibc < 2.8 */
/*
* glibc < 2.25 had an incorrect implementation on mips n64,
* see https://sourceware.org/bugzilla/show_bug.cgi?id=21026
*/
-# if defined LINUX_MIPSN64 && !(defined __GLIBC_MINOR__ && \
- (__GLIBC__ << 16) + __GLIBC_MINOR__ >= (2 << 16) + 25)
-# undef HAVE_READAHEAD
-# endif /* LINUX_MIPSN64 && glibc < 2.25 */
-# endif /* __GLIBC__ */
+# if GLIBC_PREREQ_LT(2, 25) && defined LINUX_MIPSN64
+# undef HAVE_READAHEAD
+# endif /* LINUX_MIPSN64 && glibc < 2.25 */
#endif /* HAVE_READAHEAD */
#ifdef HAVE_READAHEAD
--
2.1.4

View File

@ -0,0 +1,103 @@
From af1e2888699afc985d7f354b875c517531dff4ea Mon Sep 17 00:00:00 2001
From: "Dmitry V. Levin" <ldv@altlinux.org>
Date: Sat, 12 Sep 2020 08:00:00 +0000
Subject: [PATCH 157/162] tests/ipc_msg.c: disable TEST_MSGCTL_BOGUS_ADDR on
glibc >= 2.32
Starting with commit glibc-2.32~83, on every 32-bit architecture where
32-bit time_t support is enabled, glibc tries to retrieve the data
provided in the third argument of msgctl call. This results to
segfaults inside glibc if TEST_MSGCTL_BOGUS_ADDR is enabled.
* tests/ipc_msg.c [GLIBC_PREREQ_GE(2, 32) && __TIMESIZE != 64]
(TEST_MSGCTL_BOGUS_ADDR): Define to 0.
Reported-by: Ruinland ChuanTzu Tsai <ruinland@andestech.com>
---
tests/ipc_msg.c | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/tests/ipc_msg.c b/tests/ipc_msg.c
index dd0f303..3ab8b90 100644
--- a/tests/ipc_msg.c
+++ b/tests/ipc_msg.c
@@ -20,12 +20,21 @@
# define MSG_STAT_ANY 13
#endif
+#undef TEST_MSGCTL_BOGUS_ADDR
+
+/*
+ * Starting with commit glibc-2.32~83, on every 32-bit architecture
+ * where 32-bit time_t support is enabled, glibc tries to retrieve
+ * the data provided in the third argument of msgctl call.
+ */
+#if GLIBC_PREREQ_GE(2, 32) && defined __TIMESIZE && __TIMESIZE != 64
+# define TEST_MSGCTL_BOGUS_ADDR 0
+#endif
/*
* Before glibc-2.22-122-gbe48165, ppc64 code tried to retrieve data
* provided in third argument of msgctl call (in case of IPC_SET cmd)
* which led to segmentation fault.
*/
-#undef TEST_MSGCTL_BOGUS_ADDR
#if GLIBC_PREREQ_LT(2, 23) && (defined POWERPC64 || defined POWERPC64LE)
# define TEST_MSGCTL_BOGUS_ADDR 0
#endif
diff --git a/tests-m32/ipc_msg.c b/tests-m32/ipc_msg.c
index dd0f303..3ab8b90 100644
--- a/tests-m32/ipc_msg.c
+++ b/tests-m32/ipc_msg.c
@@ -20,12 +20,21 @@
# define MSG_STAT_ANY 13
#endif
+#undef TEST_MSGCTL_BOGUS_ADDR
+
+/*
+ * Starting with commit glibc-2.32~83, on every 32-bit architecture
+ * where 32-bit time_t support is enabled, glibc tries to retrieve
+ * the data provided in the third argument of msgctl call.
+ */
+#if GLIBC_PREREQ_GE(2, 32) && defined __TIMESIZE && __TIMESIZE != 64
+# define TEST_MSGCTL_BOGUS_ADDR 0
+#endif
/*
* Before glibc-2.22-122-gbe48165, ppc64 code tried to retrieve data
* provided in third argument of msgctl call (in case of IPC_SET cmd)
* which led to segmentation fault.
*/
-#undef TEST_MSGCTL_BOGUS_ADDR
#if GLIBC_PREREQ_LT(2, 23) && (defined POWERPC64 || defined POWERPC64LE)
# define TEST_MSGCTL_BOGUS_ADDR 0
#endif
diff --git a/tests-mx32/ipc_msg.c b/tests-mx32/ipc_msg.c
index dd0f303..3ab8b90 100644
--- a/tests-mx32/ipc_msg.c
+++ b/tests-mx32/ipc_msg.c
@@ -20,12 +20,21 @@
# define MSG_STAT_ANY 13
#endif
+#undef TEST_MSGCTL_BOGUS_ADDR
+
+/*
+ * Starting with commit glibc-2.32~83, on every 32-bit architecture
+ * where 32-bit time_t support is enabled, glibc tries to retrieve
+ * the data provided in the third argument of msgctl call.
+ */
+#if GLIBC_PREREQ_GE(2, 32) && defined __TIMESIZE && __TIMESIZE != 64
+# define TEST_MSGCTL_BOGUS_ADDR 0
+#endif
/*
* Before glibc-2.22-122-gbe48165, ppc64 code tried to retrieve data
* provided in third argument of msgctl call (in case of IPC_SET cmd)
* which led to segmentation fault.
*/
-#undef TEST_MSGCTL_BOGUS_ADDR
#if GLIBC_PREREQ_LT(2, 23) && (defined POWERPC64 || defined POWERPC64LE)
# define TEST_MSGCTL_BOGUS_ADDR 0
#endif
--
2.1.4

View File

@ -0,0 +1,89 @@
From b4623939316807928680913ece9a6cefc23a73b2 Mon Sep 17 00:00:00 2001
From: "Dmitry V. Levin" <ldv@altlinux.org>
Date: Tue, 10 Nov 2020 08:00:00 +0000
Subject: [PATCH 158/162] tests: disable TEST_MSGCTL_BOGUS_ADDR in ipc_msg test
on glibc >= 2.31
Starting with commit glibc-2.31~358, on every architecture where
__ASSUME_SYSVIPC_BROKEN_MODE_T is defined, glibc tries to modify the
data provided in the third argument of msgctl call. This results
to segfaults inside glibc if TEST_MSGCTL_BOGUS_ADDR is enabled.
* tests/ipc_msg.c [GLIBC_PREREQ_GE(2, 31) && (__m68k__ || __s390__ ||
(WORDS_BIGENDIAN && (__arm__ || __microblaze__ || __sh__)))]
(TEST_MSGCTL_BOGUS_ADDR): Define to 0.
Reported-by: Sven Schnelle <svens@linux.ibm.com>
---
tests/ipc_msg.c | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/tests/ipc_msg.c b/tests/ipc_msg.c
index 3ab8b90..f7c36cd 100644
--- a/tests/ipc_msg.c
+++ b/tests/ipc_msg.c
@@ -31,6 +31,17 @@
# define TEST_MSGCTL_BOGUS_ADDR 0
#endif
/*
+ * Starting with commit glibc-2.31~358, on every architecture where
+ * __ASSUME_SYSVIPC_BROKEN_MODE_T is defined, glibc tries to modify
+ * the data provided in the third argument of msgctl call.
+ */
+#if GLIBC_PREREQ_GE(2, 31) && \
+ (defined __m68k__ || defined __s390__ || \
+ (WORDS_BIGENDIAN && \
+ (defined __arm__ || defined __microblaze__ || defined __sh__)))
+# define TEST_MSGCTL_BOGUS_ADDR 0
+#endif
+/*
* Before glibc-2.22-122-gbe48165, ppc64 code tried to retrieve data
* provided in third argument of msgctl call (in case of IPC_SET cmd)
* which led to segmentation fault.
diff --git a/tests-m32/ipc_msg.c b/tests-m32/ipc_msg.c
index 3ab8b90..f7c36cd 100644
--- a/tests-m32/ipc_msg.c
+++ b/tests-m32/ipc_msg.c
@@ -31,6 +31,17 @@
# define TEST_MSGCTL_BOGUS_ADDR 0
#endif
/*
+ * Starting with commit glibc-2.31~358, on every architecture where
+ * __ASSUME_SYSVIPC_BROKEN_MODE_T is defined, glibc tries to modify
+ * the data provided in the third argument of msgctl call.
+ */
+#if GLIBC_PREREQ_GE(2, 31) && \
+ (defined __m68k__ || defined __s390__ || \
+ (WORDS_BIGENDIAN && \
+ (defined __arm__ || defined __microblaze__ || defined __sh__)))
+# define TEST_MSGCTL_BOGUS_ADDR 0
+#endif
+/*
* Before glibc-2.22-122-gbe48165, ppc64 code tried to retrieve data
* provided in third argument of msgctl call (in case of IPC_SET cmd)
* which led to segmentation fault.
diff --git a/tests-mx32/ipc_msg.c b/tests-mx32/ipc_msg.c
index 3ab8b90..f7c36cd 100644
--- a/tests-mx32/ipc_msg.c
+++ b/tests-mx32/ipc_msg.c
@@ -31,6 +31,17 @@
# define TEST_MSGCTL_BOGUS_ADDR 0
#endif
/*
+ * Starting with commit glibc-2.31~358, on every architecture where
+ * __ASSUME_SYSVIPC_BROKEN_MODE_T is defined, glibc tries to modify
+ * the data provided in the third argument of msgctl call.
+ */
+#if GLIBC_PREREQ_GE(2, 31) && \
+ (defined __m68k__ || defined __s390__ || \
+ (WORDS_BIGENDIAN && \
+ (defined __arm__ || defined __microblaze__ || defined __sh__)))
+# define TEST_MSGCTL_BOGUS_ADDR 0
+#endif
+/*
* Before glibc-2.22-122-gbe48165, ppc64 code tried to retrieve data
* provided in third argument of msgctl call (in case of IPC_SET cmd)
* which led to segmentation fault.
--
2.1.4

View File

@ -0,0 +1,214 @@
From b702ddfd448794f3ac5033c897a07da3de8f5fc7 Mon Sep 17 00:00:00 2001
From: "Dmitry V. Levin" <ldv@altlinux.org>
Date: Sun, 6 Dec 2020 08:00:00 +0000
Subject: [PATCH 159/162] tests: disable tests for invalid msgctl commands on
glibc >= 2.32
Starting with commit glibc-2.32.9000-149-gbe9b0b9a012780a403a2,
glibc skips msgctl syscall invocations and returns EINVAL
for invalid msgctl commands.
* tests/ipc_msg.c [GLIBC_PREREQ_GE(2, 32)] (TEST_MSGCTL_BOGUS_CMD):
Define to 0.
[!TEST_MSGCTL_BOGUS_CMD] (TEST_MSGCTL_BOGUS_CMD): Define to 1.
(main) [!TEST_MSGCTL_BOGUS_CMD] (bogus_cmd): Do not define and do not
use.
---
tests/ipc_msg.c | 21 ++++++++++++++++++++-
1 file changed, 20 insertions(+), 1 deletion(-)
diff --git a/tests/ipc_msg.c b/tests/ipc_msg.c
index f7c36cd..6a96a5f 100644
--- a/tests/ipc_msg.c
+++ b/tests/ipc_msg.c
@@ -21,6 +21,7 @@
#endif
#undef TEST_MSGCTL_BOGUS_ADDR
+#undef TEST_MSGCTL_BOGUS_CMD
/*
* Starting with commit glibc-2.32~83, on every 32-bit architecture
@@ -50,9 +51,21 @@
# define TEST_MSGCTL_BOGUS_ADDR 0
#endif
+/*
+ * Starting with commit glibc-2.32.9000-149-gbe9b0b9a012780a403a2,
+ * glibc skips msgctl syscall invocations and returns EINVAL
+ * for invalid msgctl commands.
+ */
+#if GLIBC_PREREQ_GE(2, 32)
+# define TEST_MSGCTL_BOGUS_CMD 0
+#endif
+
#ifndef TEST_MSGCTL_BOGUS_ADDR
# define TEST_MSGCTL_BOGUS_ADDR 1
#endif
+#ifndef TEST_MSGCTL_BOGUS_CMD
+# define TEST_MSGCTL_BOGUS_CMD 1
+#endif
#if XLAT_RAW
# define str_ipc_excl_nowait "0xface1c00"
@@ -107,12 +120,16 @@ main(void)
static const key_t private_key =
(key_t) (0xffffffff00000000ULL | IPC_PRIVATE);
static const key_t bogus_key = (key_t) 0xeca86420fdb9f531ULL;
+ static const int bogus_flags = 0xface1e55 & ~IPC_CREAT;
+#if TEST_MSGCTL_BOGUS_CMD || TEST_MSGCTL_BOGUS_ADDR
static const int bogus_msgid = 0xfdb97531;
+#endif
+#if TEST_MSGCTL_BOGUS_CMD
static const int bogus_cmd = 0xdeadbeef;
+#endif
#if TEST_MSGCTL_BOGUS_ADDR
static void * const bogus_addr = (void *) -1L;
#endif
- static const int bogus_flags = 0xface1e55 & ~IPC_CREAT;
int rc;
struct msqid_ds ds;
@@ -129,9 +146,11 @@ main(void)
printf("msgget\\(%s, 0600\\) = %d\n", str_ipc_private, id);
atexit(cleanup);
+#if TEST_MSGCTL_BOGUS_CMD
rc = msgctl(bogus_msgid, bogus_cmd, NULL);
printf("msgctl\\(%d, (%s\\|)?%s, NULL\\) = %s\n",
bogus_msgid, str_ipc_64, str_bogus_cmd, sprintrc_grep(rc));
+#endif
#if TEST_MSGCTL_BOGUS_ADDR
rc = msgctl(bogus_msgid, IPC_SET, bogus_addr);
diff --git a/tests-m32/ipc_msg.c b/tests-m32/ipc_msg.c
index f7c36cd..6a96a5f 100644
--- a/tests-m32/ipc_msg.c
+++ b/tests-m32/ipc_msg.c
@@ -21,6 +21,7 @@
#endif
#undef TEST_MSGCTL_BOGUS_ADDR
+#undef TEST_MSGCTL_BOGUS_CMD
/*
* Starting with commit glibc-2.32~83, on every 32-bit architecture
@@ -50,9 +51,21 @@
# define TEST_MSGCTL_BOGUS_ADDR 0
#endif
+/*
+ * Starting with commit glibc-2.32.9000-149-gbe9b0b9a012780a403a2,
+ * glibc skips msgctl syscall invocations and returns EINVAL
+ * for invalid msgctl commands.
+ */
+#if GLIBC_PREREQ_GE(2, 32)
+# define TEST_MSGCTL_BOGUS_CMD 0
+#endif
+
#ifndef TEST_MSGCTL_BOGUS_ADDR
# define TEST_MSGCTL_BOGUS_ADDR 1
#endif
+#ifndef TEST_MSGCTL_BOGUS_CMD
+# define TEST_MSGCTL_BOGUS_CMD 1
+#endif
#if XLAT_RAW
# define str_ipc_excl_nowait "0xface1c00"
@@ -107,12 +120,16 @@ main(void)
static const key_t private_key =
(key_t) (0xffffffff00000000ULL | IPC_PRIVATE);
static const key_t bogus_key = (key_t) 0xeca86420fdb9f531ULL;
+ static const int bogus_flags = 0xface1e55 & ~IPC_CREAT;
+#if TEST_MSGCTL_BOGUS_CMD || TEST_MSGCTL_BOGUS_ADDR
static const int bogus_msgid = 0xfdb97531;
+#endif
+#if TEST_MSGCTL_BOGUS_CMD
static const int bogus_cmd = 0xdeadbeef;
+#endif
#if TEST_MSGCTL_BOGUS_ADDR
static void * const bogus_addr = (void *) -1L;
#endif
- static const int bogus_flags = 0xface1e55 & ~IPC_CREAT;
int rc;
struct msqid_ds ds;
@@ -129,9 +146,11 @@ main(void)
printf("msgget\\(%s, 0600\\) = %d\n", str_ipc_private, id);
atexit(cleanup);
+#if TEST_MSGCTL_BOGUS_CMD
rc = msgctl(bogus_msgid, bogus_cmd, NULL);
printf("msgctl\\(%d, (%s\\|)?%s, NULL\\) = %s\n",
bogus_msgid, str_ipc_64, str_bogus_cmd, sprintrc_grep(rc));
+#endif
#if TEST_MSGCTL_BOGUS_ADDR
rc = msgctl(bogus_msgid, IPC_SET, bogus_addr);
diff --git a/tests-mx32/ipc_msg.c b/tests-mx32/ipc_msg.c
index f7c36cd..6a96a5f 100644
--- a/tests-mx32/ipc_msg.c
+++ b/tests-mx32/ipc_msg.c
@@ -21,6 +21,7 @@
#endif
#undef TEST_MSGCTL_BOGUS_ADDR
+#undef TEST_MSGCTL_BOGUS_CMD
/*
* Starting with commit glibc-2.32~83, on every 32-bit architecture
@@ -50,9 +51,21 @@
# define TEST_MSGCTL_BOGUS_ADDR 0
#endif
+/*
+ * Starting with commit glibc-2.32.9000-149-gbe9b0b9a012780a403a2,
+ * glibc skips msgctl syscall invocations and returns EINVAL
+ * for invalid msgctl commands.
+ */
+#if GLIBC_PREREQ_GE(2, 32)
+# define TEST_MSGCTL_BOGUS_CMD 0
+#endif
+
#ifndef TEST_MSGCTL_BOGUS_ADDR
# define TEST_MSGCTL_BOGUS_ADDR 1
#endif
+#ifndef TEST_MSGCTL_BOGUS_CMD
+# define TEST_MSGCTL_BOGUS_CMD 1
+#endif
#if XLAT_RAW
# define str_ipc_excl_nowait "0xface1c00"
@@ -107,12 +120,16 @@ main(void)
static const key_t private_key =
(key_t) (0xffffffff00000000ULL | IPC_PRIVATE);
static const key_t bogus_key = (key_t) 0xeca86420fdb9f531ULL;
+ static const int bogus_flags = 0xface1e55 & ~IPC_CREAT;
+#if TEST_MSGCTL_BOGUS_CMD || TEST_MSGCTL_BOGUS_ADDR
static const int bogus_msgid = 0xfdb97531;
+#endif
+#if TEST_MSGCTL_BOGUS_CMD
static const int bogus_cmd = 0xdeadbeef;
+#endif
#if TEST_MSGCTL_BOGUS_ADDR
static void * const bogus_addr = (void *) -1L;
#endif
- static const int bogus_flags = 0xface1e55 & ~IPC_CREAT;
int rc;
struct msqid_ds ds;
@@ -129,9 +146,11 @@ main(void)
printf("msgget\\(%s, 0600\\) = %d\n", str_ipc_private, id);
atexit(cleanup);
+#if TEST_MSGCTL_BOGUS_CMD
rc = msgctl(bogus_msgid, bogus_cmd, NULL);
printf("msgctl\\(%d, (%s\\|)?%s, NULL\\) = %s\n",
bogus_msgid, str_ipc_64, str_bogus_cmd, sprintrc_grep(rc));
+#endif
#if TEST_MSGCTL_BOGUS_ADDR
rc = msgctl(bogus_msgid, IPC_SET, bogus_addr);
--
2.1.4

View File

@ -0,0 +1,169 @@
From 8c1a84778bb05a3becc493698b215681bf7249b3 Mon Sep 17 00:00:00 2001
From: "Dmitry V. Levin" <ldv@altlinux.org>
Date: Sat, 19 Sep 2020 08:00:00 +0000
Subject: [PATCH 160/162] tests: disable shmctl IPC_STAT test with a bogus
address on glibc >= 2.32
Starting with commit glibc-2.32~80, on every 32-bit architecture where
32-bit time_t support is enabled, glibc tries to retrieve the data
provided in the third argument of shmctl call. This results to
segfaults inside glibc when shmctl is called with a bogus address.
* tests/ipc_shm.c [GLIBC_PREREQ_GE(2, 32) && __TIMESIZE != 64]
(TEST_SHMCTL_BOGUS_ADDR): Define to 0.
(main): Conditionalize on TEST_SHMCTL_BOGUS_ADDR the shmctl IPC_STAT
invocation with a bogus address.
---
tests/ipc_shm.c | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
diff --git a/tests/ipc_shm.c b/tests/ipc_shm.c
index 5cd414e..695fd94 100644
--- a/tests/ipc_shm.c
+++ b/tests/ipc_shm.c
@@ -73,6 +73,21 @@
# define str_bogus_cmd "0xdefaced2 /\\* SHM_\\?\\?\\? \\*/"
#endif
+#undef TEST_SHMCTL_BOGUS_ADDR
+
+/*
+ * Starting with commit glibc-2.32~80, on every 32-bit architecture
+ * where 32-bit time_t support is enabled, glibc tries to retrieve
+ * the data provided in the third argument of shmctl call.
+ */
+#if GLIBC_PREREQ_GE(2, 32) && defined __TIMESIZE && __TIMESIZE != 64
+# define TEST_SHMCTL_BOGUS_ADDR 0
+#endif
+
+#ifndef TEST_SHMCTL_BOGUS_ADDR
+# define TEST_SHMCTL_BOGUS_ADDR 1
+#endif
+
static int id = -1;
static void
@@ -92,7 +107,9 @@ main(void)
static const key_t bogus_key = (key_t) 0xeca86420fdb97531ULL;
static const int bogus_id = 0xdefaced1;
static const int bogus_cmd = 0xdefaced2;
+#if TEST_SHMCTL_BOGUS_ADDR
static void * const bogus_addr = (void *) -1L;
+#endif
static const size_t bogus_size =
/*
* musl sets size to SIZE_MAX if size argument is greater than
@@ -160,10 +177,12 @@ main(void)
printf("shmctl\\(%d, (%s\\|)?%s, NULL\\) = %s\n",
bogus_id, str_ipc_64, str_bogus_cmd, sprintrc_grep(rc));
+#if TEST_SHMCTL_BOGUS_ADDR
rc = shmctl(bogus_id, IPC_STAT, bogus_addr);
printf("shmctl\\(%d, (%s\\|)?%s, %p\\) = %s\n",
bogus_id, str_ipc_64, str_ipc_stat, bogus_addr,
sprintrc_grep(rc));
+#endif
if (shmctl(id, IPC_STAT, &ds))
perror_msg_and_skip("shmctl IPC_STAT");
diff --git a/tests-m32/ipc_shm.c b/tests-m32/ipc_shm.c
index 5cd414e..695fd94 100644
--- a/tests-m32/ipc_shm.c
+++ b/tests-m32/ipc_shm.c
@@ -73,6 +73,21 @@
# define str_bogus_cmd "0xdefaced2 /\\* SHM_\\?\\?\\? \\*/"
#endif
+#undef TEST_SHMCTL_BOGUS_ADDR
+
+/*
+ * Starting with commit glibc-2.32~80, on every 32-bit architecture
+ * where 32-bit time_t support is enabled, glibc tries to retrieve
+ * the data provided in the third argument of shmctl call.
+ */
+#if GLIBC_PREREQ_GE(2, 32) && defined __TIMESIZE && __TIMESIZE != 64
+# define TEST_SHMCTL_BOGUS_ADDR 0
+#endif
+
+#ifndef TEST_SHMCTL_BOGUS_ADDR
+# define TEST_SHMCTL_BOGUS_ADDR 1
+#endif
+
static int id = -1;
static void
@@ -92,7 +107,9 @@ main(void)
static const key_t bogus_key = (key_t) 0xeca86420fdb97531ULL;
static const int bogus_id = 0xdefaced1;
static const int bogus_cmd = 0xdefaced2;
+#if TEST_SHMCTL_BOGUS_ADDR
static void * const bogus_addr = (void *) -1L;
+#endif
static const size_t bogus_size =
/*
* musl sets size to SIZE_MAX if size argument is greater than
@@ -160,10 +177,12 @@ main(void)
printf("shmctl\\(%d, (%s\\|)?%s, NULL\\) = %s\n",
bogus_id, str_ipc_64, str_bogus_cmd, sprintrc_grep(rc));
+#if TEST_SHMCTL_BOGUS_ADDR
rc = shmctl(bogus_id, IPC_STAT, bogus_addr);
printf("shmctl\\(%d, (%s\\|)?%s, %p\\) = %s\n",
bogus_id, str_ipc_64, str_ipc_stat, bogus_addr,
sprintrc_grep(rc));
+#endif
if (shmctl(id, IPC_STAT, &ds))
perror_msg_and_skip("shmctl IPC_STAT");
diff --git a/tests-mx32/ipc_shm.c b/tests-mx32/ipc_shm.c
index 5cd414e..695fd94 100644
--- a/tests-mx32/ipc_shm.c
+++ b/tests-mx32/ipc_shm.c
@@ -73,6 +73,21 @@
# define str_bogus_cmd "0xdefaced2 /\\* SHM_\\?\\?\\? \\*/"
#endif
+#undef TEST_SHMCTL_BOGUS_ADDR
+
+/*
+ * Starting with commit glibc-2.32~80, on every 32-bit architecture
+ * where 32-bit time_t support is enabled, glibc tries to retrieve
+ * the data provided in the third argument of shmctl call.
+ */
+#if GLIBC_PREREQ_GE(2, 32) && defined __TIMESIZE && __TIMESIZE != 64
+# define TEST_SHMCTL_BOGUS_ADDR 0
+#endif
+
+#ifndef TEST_SHMCTL_BOGUS_ADDR
+# define TEST_SHMCTL_BOGUS_ADDR 1
+#endif
+
static int id = -1;
static void
@@ -92,7 +107,9 @@ main(void)
static const key_t bogus_key = (key_t) 0xeca86420fdb97531ULL;
static const int bogus_id = 0xdefaced1;
static const int bogus_cmd = 0xdefaced2;
+#if TEST_SHMCTL_BOGUS_ADDR
static void * const bogus_addr = (void *) -1L;
+#endif
static const size_t bogus_size =
/*
* musl sets size to SIZE_MAX if size argument is greater than
@@ -160,10 +177,12 @@ main(void)
printf("shmctl\\(%d, (%s\\|)?%s, NULL\\) = %s\n",
bogus_id, str_ipc_64, str_bogus_cmd, sprintrc_grep(rc));
+#if TEST_SHMCTL_BOGUS_ADDR
rc = shmctl(bogus_id, IPC_STAT, bogus_addr);
printf("shmctl\\(%d, (%s\\|)?%s, %p\\) = %s\n",
bogus_id, str_ipc_64, str_ipc_stat, bogus_addr,
sprintrc_grep(rc));
+#endif
if (shmctl(id, IPC_STAT, &ds))
perror_msg_and_skip("shmctl IPC_STAT");
--
2.1.4

View File

@ -0,0 +1,280 @@
From 268b9341ef6397cc337f612563af88ccb5752ca7 Mon Sep 17 00:00:00 2001
From: "Dmitry V. Levin" <ldv@altlinux.org>
Date: Sun, 6 Dec 2020 08:00:00 +0000
Subject: [PATCH 161/162] tests: disable tests for invalid shmctl commands on
glibc >= 2.32
Starting with commit glibc-2.32.9000-207-g9ebaabeaac1a96b0d91f,
glibc skips shmctl syscall invocations and returns EINVAL
for invalid shmctl commands.
* tests/ipc_shm.c [GLIBC_PREREQ_GE(2, 32)] (TEST_SHMCTL_BOGUS_CMD):
Define to 0.
[!TEST_SHMCTL_BOGUS_CMD] (TEST_SHMCTL_BOGUS_CMD): Define to 1.
(main) [!TEST_SHMCTL_BOGUS_CMD] (bogus_cmd): Do not define and do not
use.
---
tests/ipc_shm.c | 49 ++++++++++++++++++++++++++++++++++---------------
1 file changed, 34 insertions(+), 15 deletions(-)
diff --git a/tests/ipc_shm.c b/tests/ipc_shm.c
index 695fd94..350bde5 100644
--- a/tests/ipc_shm.c
+++ b/tests/ipc_shm.c
@@ -29,6 +29,34 @@
# define SHM_NORESERVE 010000
#endif
+#undef TEST_SHMCTL_BOGUS_ADDR
+#undef TEST_SHMCTL_BOGUS_CMD
+
+/*
+ * Starting with commit glibc-2.32~80, on every 32-bit architecture
+ * where 32-bit time_t support is enabled, glibc tries to retrieve
+ * the data provided in the third argument of shmctl call.
+ */
+#if GLIBC_PREREQ_GE(2, 32) && defined __TIMESIZE && __TIMESIZE != 64
+# define TEST_SHMCTL_BOGUS_ADDR 0
+#endif
+
+/*
+ * Starting with commit glibc-2.32.9000-207-g9ebaabeaac1a96b0d91f,
+ * glibc skips shmctl syscall invocations and returns EINVAL
+ * for invalid shmctl commands.
+ */
+#if GLIBC_PREREQ_GE(2, 32)
+# define TEST_SHMCTL_BOGUS_CMD 0
+#endif
+
+#ifndef TEST_SHMCTL_BOGUS_ADDR
+# define TEST_SHMCTL_BOGUS_ADDR 1
+#endif
+#ifndef TEST_SHMCTL_BOGUS_CMD
+# define TEST_SHMCTL_BOGUS_CMD 1
+#endif
+
#include "xlat.h"
#include "xlat/shm_resource_flags.h"
@@ -73,21 +101,6 @@
# define str_bogus_cmd "0xdefaced2 /\\* SHM_\\?\\?\\? \\*/"
#endif
-#undef TEST_SHMCTL_BOGUS_ADDR
-
-/*
- * Starting with commit glibc-2.32~80, on every 32-bit architecture
- * where 32-bit time_t support is enabled, glibc tries to retrieve
- * the data provided in the third argument of shmctl call.
- */
-#if GLIBC_PREREQ_GE(2, 32) && defined __TIMESIZE && __TIMESIZE != 64
-# define TEST_SHMCTL_BOGUS_ADDR 0
-#endif
-
-#ifndef TEST_SHMCTL_BOGUS_ADDR
-# define TEST_SHMCTL_BOGUS_ADDR 1
-#endif
-
static int id = -1;
static void
@@ -105,8 +118,12 @@ main(void)
static const key_t private_key =
(key_t) (0xffffffff00000000ULL | IPC_PRIVATE);
static const key_t bogus_key = (key_t) 0xeca86420fdb97531ULL;
+#if TEST_SHMCTL_BOGUS_CMD || TEST_SHMCTL_BOGUS_ADDR
static const int bogus_id = 0xdefaced1;
+#endif
+#if TEST_SHMCTL_BOGUS_CMD
static const int bogus_cmd = 0xdefaced2;
+#endif
#if TEST_SHMCTL_BOGUS_ADDR
static void * const bogus_addr = (void *) -1L;
#endif
@@ -173,9 +190,11 @@ main(void)
printf("shmget\\(%s, 1, 0600\\) = %d\n", str_ipc_private, id);
atexit(cleanup);
+#if TEST_SHMCTL_BOGUS_CMD
rc = shmctl(bogus_id, bogus_cmd, NULL);
printf("shmctl\\(%d, (%s\\|)?%s, NULL\\) = %s\n",
bogus_id, str_ipc_64, str_bogus_cmd, sprintrc_grep(rc));
+#endif
#if TEST_SHMCTL_BOGUS_ADDR
rc = shmctl(bogus_id, IPC_STAT, bogus_addr);
diff --git a/tests-m32/ipc_shm.c b/tests-m32/ipc_shm.c
index 695fd94..350bde5 100644
--- a/tests-m32/ipc_shm.c
+++ b/tests-m32/ipc_shm.c
@@ -29,6 +29,34 @@
# define SHM_NORESERVE 010000
#endif
+#undef TEST_SHMCTL_BOGUS_ADDR
+#undef TEST_SHMCTL_BOGUS_CMD
+
+/*
+ * Starting with commit glibc-2.32~80, on every 32-bit architecture
+ * where 32-bit time_t support is enabled, glibc tries to retrieve
+ * the data provided in the third argument of shmctl call.
+ */
+#if GLIBC_PREREQ_GE(2, 32) && defined __TIMESIZE && __TIMESIZE != 64
+# define TEST_SHMCTL_BOGUS_ADDR 0
+#endif
+
+/*
+ * Starting with commit glibc-2.32.9000-207-g9ebaabeaac1a96b0d91f,
+ * glibc skips shmctl syscall invocations and returns EINVAL
+ * for invalid shmctl commands.
+ */
+#if GLIBC_PREREQ_GE(2, 32)
+# define TEST_SHMCTL_BOGUS_CMD 0
+#endif
+
+#ifndef TEST_SHMCTL_BOGUS_ADDR
+# define TEST_SHMCTL_BOGUS_ADDR 1
+#endif
+#ifndef TEST_SHMCTL_BOGUS_CMD
+# define TEST_SHMCTL_BOGUS_CMD 1
+#endif
+
#include "xlat.h"
#include "xlat/shm_resource_flags.h"
@@ -73,21 +101,6 @@
# define str_bogus_cmd "0xdefaced2 /\\* SHM_\\?\\?\\? \\*/"
#endif
-#undef TEST_SHMCTL_BOGUS_ADDR
-
-/*
- * Starting with commit glibc-2.32~80, on every 32-bit architecture
- * where 32-bit time_t support is enabled, glibc tries to retrieve
- * the data provided in the third argument of shmctl call.
- */
-#if GLIBC_PREREQ_GE(2, 32) && defined __TIMESIZE && __TIMESIZE != 64
-# define TEST_SHMCTL_BOGUS_ADDR 0
-#endif
-
-#ifndef TEST_SHMCTL_BOGUS_ADDR
-# define TEST_SHMCTL_BOGUS_ADDR 1
-#endif
-
static int id = -1;
static void
@@ -105,8 +118,12 @@ main(void)
static const key_t private_key =
(key_t) (0xffffffff00000000ULL | IPC_PRIVATE);
static const key_t bogus_key = (key_t) 0xeca86420fdb97531ULL;
+#if TEST_SHMCTL_BOGUS_CMD || TEST_SHMCTL_BOGUS_ADDR
static const int bogus_id = 0xdefaced1;
+#endif
+#if TEST_SHMCTL_BOGUS_CMD
static const int bogus_cmd = 0xdefaced2;
+#endif
#if TEST_SHMCTL_BOGUS_ADDR
static void * const bogus_addr = (void *) -1L;
#endif
@@ -173,9 +190,11 @@ main(void)
printf("shmget\\(%s, 1, 0600\\) = %d\n", str_ipc_private, id);
atexit(cleanup);
+#if TEST_SHMCTL_BOGUS_CMD
rc = shmctl(bogus_id, bogus_cmd, NULL);
printf("shmctl\\(%d, (%s\\|)?%s, NULL\\) = %s\n",
bogus_id, str_ipc_64, str_bogus_cmd, sprintrc_grep(rc));
+#endif
#if TEST_SHMCTL_BOGUS_ADDR
rc = shmctl(bogus_id, IPC_STAT, bogus_addr);
diff --git a/tests-mx32/ipc_shm.c b/tests-mx32/ipc_shm.c
index 695fd94..350bde5 100644
--- a/tests-mx32/ipc_shm.c
+++ b/tests-mx32/ipc_shm.c
@@ -29,6 +29,34 @@
# define SHM_NORESERVE 010000
#endif
+#undef TEST_SHMCTL_BOGUS_ADDR
+#undef TEST_SHMCTL_BOGUS_CMD
+
+/*
+ * Starting with commit glibc-2.32~80, on every 32-bit architecture
+ * where 32-bit time_t support is enabled, glibc tries to retrieve
+ * the data provided in the third argument of shmctl call.
+ */
+#if GLIBC_PREREQ_GE(2, 32) && defined __TIMESIZE && __TIMESIZE != 64
+# define TEST_SHMCTL_BOGUS_ADDR 0
+#endif
+
+/*
+ * Starting with commit glibc-2.32.9000-207-g9ebaabeaac1a96b0d91f,
+ * glibc skips shmctl syscall invocations and returns EINVAL
+ * for invalid shmctl commands.
+ */
+#if GLIBC_PREREQ_GE(2, 32)
+# define TEST_SHMCTL_BOGUS_CMD 0
+#endif
+
+#ifndef TEST_SHMCTL_BOGUS_ADDR
+# define TEST_SHMCTL_BOGUS_ADDR 1
+#endif
+#ifndef TEST_SHMCTL_BOGUS_CMD
+# define TEST_SHMCTL_BOGUS_CMD 1
+#endif
+
#include "xlat.h"
#include "xlat/shm_resource_flags.h"
@@ -73,21 +101,6 @@
# define str_bogus_cmd "0xdefaced2 /\\* SHM_\\?\\?\\? \\*/"
#endif
-#undef TEST_SHMCTL_BOGUS_ADDR
-
-/*
- * Starting with commit glibc-2.32~80, on every 32-bit architecture
- * where 32-bit time_t support is enabled, glibc tries to retrieve
- * the data provided in the third argument of shmctl call.
- */
-#if GLIBC_PREREQ_GE(2, 32) && defined __TIMESIZE && __TIMESIZE != 64
-# define TEST_SHMCTL_BOGUS_ADDR 0
-#endif
-
-#ifndef TEST_SHMCTL_BOGUS_ADDR
-# define TEST_SHMCTL_BOGUS_ADDR 1
-#endif
-
static int id = -1;
static void
@@ -105,8 +118,12 @@ main(void)
static const key_t private_key =
(key_t) (0xffffffff00000000ULL | IPC_PRIVATE);
static const key_t bogus_key = (key_t) 0xeca86420fdb97531ULL;
+#if TEST_SHMCTL_BOGUS_CMD || TEST_SHMCTL_BOGUS_ADDR
static const int bogus_id = 0xdefaced1;
+#endif
+#if TEST_SHMCTL_BOGUS_CMD
static const int bogus_cmd = 0xdefaced2;
+#endif
#if TEST_SHMCTL_BOGUS_ADDR
static void * const bogus_addr = (void *) -1L;
#endif
@@ -173,9 +190,11 @@ main(void)
printf("shmget\\(%s, 1, 0600\\) = %d\n", str_ipc_private, id);
atexit(cleanup);
+#if TEST_SHMCTL_BOGUS_CMD
rc = shmctl(bogus_id, bogus_cmd, NULL);
printf("shmctl\\(%d, (%s\\|)?%s, NULL\\) = %s\n",
bogus_id, str_ipc_64, str_bogus_cmd, sprintrc_grep(rc));
+#endif
#if TEST_SHMCTL_BOGUS_ADDR
rc = shmctl(bogus_id, IPC_STAT, bogus_addr);
--
2.1.4

View File

@ -0,0 +1,199 @@
From dd8d558394b2b8cb7f743a2a4bf763974d6c2dd9 Mon Sep 17 00:00:00 2001
From: "Dmitry V. Levin" <ldv@altlinux.org>
Date: Sun, 6 Dec 2020 08:00:00 +0000
Subject: [PATCH 162/162] tests: disable tests for invalid semctl commands on
glibc >= 2.32
Starting with commit glibc-2.32.9000-147-ga16d2abd496bd974a882,
glibc skips semctl syscall invocations and returns EINVAL
for invalid semctl commands.
* tests/ipc_sem.c [GLIBC_PREREQ_GE(2, 32)] (TEST_SEMCTL_BOGUS_CMD):
Define to 0.
[!TEST_SEMCTL_BOGUS_CMD] (TEST_SEMCTL_BOGUS_CMD): Define to 1.
(main) [!TEST_SEMCTL_BOGUS_CMD] (bogus_semid, bogus_semnum, bogus_cmd,
bogus_arg): Do not define and do not use.
---
tests/ipc_sem.c | 25 ++++++++++++++++++++++---
1 file changed, 22 insertions(+), 3 deletions(-)
diff --git a/tests/ipc_sem.c b/tests/ipc_sem.c
index 7341f72..0351e53 100644
--- a/tests/ipc_sem.c
+++ b/tests/ipc_sem.c
@@ -20,6 +20,21 @@
# define SEM_STAT_ANY 20
#endif
+#undef TEST_SEMCTL_BOGUS_CMD
+
+/*
+ * Starting with commit glibc-2.32.9000-147-ga16d2abd496bd974a882,
+ * glibc skips semctl syscall invocations and returns EINVAL
+ * for invalid semctl commands.
+ */
+#if GLIBC_PREREQ_GE(2, 32)
+# define TEST_SEMCTL_BOGUS_CMD 0
+#endif
+
+#ifndef TEST_SEMCTL_BOGUS_CMD
+# define TEST_SEMCTL_BOGUS_CMD 1
+#endif
+
#if XLAT_RAW
# define str_ipc_flags "0xface1e00"
# define str_ipc_private "0"
@@ -78,13 +93,15 @@ main(void)
static const key_t private_key =
(key_t) (0xffffffff00000000ULL | IPC_PRIVATE);
static const key_t bogus_key = (key_t) 0xeca86420fdb97531ULL;
- static const int bogus_semid = 0xfdb97531;
- static const int bogus_semnum = 0xeca86420;
static const int bogus_size = 0xdec0ded1;
static const int bogus_flags = 0xface1e55;
+#if TEST_SEMCTL_BOGUS_CMD
+ static const int bogus_semid = 0xfdb97531;
+ static const int bogus_semnum = 0xeca86420;
static const int bogus_cmd = 0xdeadbeef;
static const unsigned long bogus_arg =
(unsigned long) 0xbadc0dedfffffaceULL;
+#endif
int rc;
union semun un;
@@ -102,11 +119,13 @@ main(void)
printf("semget\\(%s, 1, 0600\\) = %d\n", str_ipc_private, id);
atexit(cleanup);
+#if TEST_SEMCTL_BOGUS_CMD
rc = semctl(bogus_semid, bogus_semnum, bogus_cmd, bogus_arg);
-#define SEMCTL_BOGUS_ARG_FMT "(%#lx|\\[(%#lx|NULL)\\]|NULL)"
+# define SEMCTL_BOGUS_ARG_FMT "(%#lx|\\[(%#lx|NULL)\\]|NULL)"
printf("semctl\\(%d, %d, (%s\\|)?%s, " SEMCTL_BOGUS_ARG_FMT "\\) = %s\n",
bogus_semid, bogus_semnum, str_ipc_64, str_bogus_cmd,
bogus_arg, bogus_arg, sprintrc_grep(rc));
+#endif
un.buf = &ds;
if (semctl(id, 0, IPC_STAT, un))
diff --git a/tests-m32/ipc_sem.c b/tests-m32/ipc_sem.c
index 7341f72..0351e53 100644
--- a/tests-m32/ipc_sem.c
+++ b/tests-m32/ipc_sem.c
@@ -20,6 +20,21 @@
# define SEM_STAT_ANY 20
#endif
+#undef TEST_SEMCTL_BOGUS_CMD
+
+/*
+ * Starting with commit glibc-2.32.9000-147-ga16d2abd496bd974a882,
+ * glibc skips semctl syscall invocations and returns EINVAL
+ * for invalid semctl commands.
+ */
+#if GLIBC_PREREQ_GE(2, 32)
+# define TEST_SEMCTL_BOGUS_CMD 0
+#endif
+
+#ifndef TEST_SEMCTL_BOGUS_CMD
+# define TEST_SEMCTL_BOGUS_CMD 1
+#endif
+
#if XLAT_RAW
# define str_ipc_flags "0xface1e00"
# define str_ipc_private "0"
@@ -78,13 +93,15 @@ main(void)
static const key_t private_key =
(key_t) (0xffffffff00000000ULL | IPC_PRIVATE);
static const key_t bogus_key = (key_t) 0xeca86420fdb97531ULL;
- static const int bogus_semid = 0xfdb97531;
- static const int bogus_semnum = 0xeca86420;
static const int bogus_size = 0xdec0ded1;
static const int bogus_flags = 0xface1e55;
+#if TEST_SEMCTL_BOGUS_CMD
+ static const int bogus_semid = 0xfdb97531;
+ static const int bogus_semnum = 0xeca86420;
static const int bogus_cmd = 0xdeadbeef;
static const unsigned long bogus_arg =
(unsigned long) 0xbadc0dedfffffaceULL;
+#endif
int rc;
union semun un;
@@ -102,11 +119,13 @@ main(void)
printf("semget\\(%s, 1, 0600\\) = %d\n", str_ipc_private, id);
atexit(cleanup);
+#if TEST_SEMCTL_BOGUS_CMD
rc = semctl(bogus_semid, bogus_semnum, bogus_cmd, bogus_arg);
-#define SEMCTL_BOGUS_ARG_FMT "(%#lx|\\[(%#lx|NULL)\\]|NULL)"
+# define SEMCTL_BOGUS_ARG_FMT "(%#lx|\\[(%#lx|NULL)\\]|NULL)"
printf("semctl\\(%d, %d, (%s\\|)?%s, " SEMCTL_BOGUS_ARG_FMT "\\) = %s\n",
bogus_semid, bogus_semnum, str_ipc_64, str_bogus_cmd,
bogus_arg, bogus_arg, sprintrc_grep(rc));
+#endif
un.buf = &ds;
if (semctl(id, 0, IPC_STAT, un))
diff --git a/tests-mx32/ipc_sem.c b/tests-mx32/ipc_sem.c
index 7341f72..0351e53 100644
--- a/tests-mx32/ipc_sem.c
+++ b/tests-mx32/ipc_sem.c
@@ -20,6 +20,21 @@
# define SEM_STAT_ANY 20
#endif
+#undef TEST_SEMCTL_BOGUS_CMD
+
+/*
+ * Starting with commit glibc-2.32.9000-147-ga16d2abd496bd974a882,
+ * glibc skips semctl syscall invocations and returns EINVAL
+ * for invalid semctl commands.
+ */
+#if GLIBC_PREREQ_GE(2, 32)
+# define TEST_SEMCTL_BOGUS_CMD 0
+#endif
+
+#ifndef TEST_SEMCTL_BOGUS_CMD
+# define TEST_SEMCTL_BOGUS_CMD 1
+#endif
+
#if XLAT_RAW
# define str_ipc_flags "0xface1e00"
# define str_ipc_private "0"
@@ -78,13 +93,15 @@ main(void)
static const key_t private_key =
(key_t) (0xffffffff00000000ULL | IPC_PRIVATE);
static const key_t bogus_key = (key_t) 0xeca86420fdb97531ULL;
- static const int bogus_semid = 0xfdb97531;
- static const int bogus_semnum = 0xeca86420;
static const int bogus_size = 0xdec0ded1;
static const int bogus_flags = 0xface1e55;
+#if TEST_SEMCTL_BOGUS_CMD
+ static const int bogus_semid = 0xfdb97531;
+ static const int bogus_semnum = 0xeca86420;
static const int bogus_cmd = 0xdeadbeef;
static const unsigned long bogus_arg =
(unsigned long) 0xbadc0dedfffffaceULL;
+#endif
int rc;
union semun un;
@@ -102,11 +119,13 @@ main(void)
printf("semget\\(%s, 1, 0600\\) = %d\n", str_ipc_private, id);
atexit(cleanup);
+#if TEST_SEMCTL_BOGUS_CMD
rc = semctl(bogus_semid, bogus_semnum, bogus_cmd, bogus_arg);
-#define SEMCTL_BOGUS_ARG_FMT "(%#lx|\\[(%#lx|NULL)\\]|NULL)"
+# define SEMCTL_BOGUS_ARG_FMT "(%#lx|\\[(%#lx|NULL)\\]|NULL)"
printf("semctl\\(%d, %d, (%s\\|)?%s, " SEMCTL_BOGUS_ARG_FMT "\\) = %s\n",
bogus_semid, bogus_semnum, str_ipc_64, str_bogus_cmd,
bogus_arg, bogus_arg, sprintrc_grep(rc));
+#endif
un.buf = &ds;
if (semctl(id, 0, IPC_STAT, un))
--
2.1.4

View File

@ -0,0 +1,135 @@
Index: strace-5.7/tests/ipc_msg.c
===================================================================
--- strace-5.7.orig/tests/ipc_msg.c 2021-08-24 21:39:53.102419769 +0200
+++ strace-5.7/tests/ipc_msg.c 2021-08-24 21:43:00.670841489 +0200
@@ -55,8 +55,9 @@
* Starting with commit glibc-2.32.9000-149-gbe9b0b9a012780a403a2,
* glibc skips msgctl syscall invocations and returns EINVAL
* for invalid msgctl commands.
+ * It has been backported into glic-2.28-153 in RHEL 8.5.
*/
-#if GLIBC_PREREQ_GE(2, 32)
+#if GLIBC_PREREQ_GE(2, 28)
# define TEST_MSGCTL_BOGUS_CMD 0
#endif
Index: strace-5.7/tests/ipc_shm.c
===================================================================
--- strace-5.7.orig/tests/ipc_shm.c 2021-08-24 21:39:53.124419583 +0200
+++ strace-5.7/tests/ipc_shm.c 2021-08-24 21:43:00.670841489 +0200
@@ -45,8 +45,9 @@
* Starting with commit glibc-2.32.9000-207-g9ebaabeaac1a96b0d91f,
* glibc skips shmctl syscall invocations and returns EINVAL
* for invalid shmctl commands.
+ * It has been backported into glic-2.28-153 in RHEL 8.5.
*/
-#if GLIBC_PREREQ_GE(2, 32)
+#if GLIBC_PREREQ_GE(2, 28)
# define TEST_SHMCTL_BOGUS_CMD 0
#endif
Index: strace-5.7/tests/ipc_sem.c
===================================================================
--- strace-5.7.orig/tests/ipc_sem.c 2021-08-24 21:39:53.135419490 +0200
+++ strace-5.7/tests/ipc_sem.c 2021-08-24 21:43:00.670841489 +0200
@@ -26,8 +26,9 @@
* Starting with commit glibc-2.32.9000-147-ga16d2abd496bd974a882,
* glibc skips semctl syscall invocations and returns EINVAL
* for invalid semctl commands.
+ * It has been backported into glic-2.28-153 in RHEL 8.5.
*/
-#if GLIBC_PREREQ_GE(2, 32)
+#if GLIBC_PREREQ_GE(2, 28)
# define TEST_SEMCTL_BOGUS_CMD 0
#endif
Index: strace-5.7/tests-m32/ipc_msg.c
===================================================================
--- strace-5.7.orig/tests-m32/ipc_msg.c 2021-08-24 21:39:53.102419769 +0200
+++ strace-5.7/tests-m32/ipc_msg.c 2021-08-24 21:43:00.670841489 +0200
@@ -55,8 +55,9 @@
* Starting with commit glibc-2.32.9000-149-gbe9b0b9a012780a403a2,
* glibc skips msgctl syscall invocations and returns EINVAL
* for invalid msgctl commands.
+ * It has been backported into glic-2.28-153 in RHEL 8.5.
*/
-#if GLIBC_PREREQ_GE(2, 32)
+#if GLIBC_PREREQ_GE(2, 28)
# define TEST_MSGCTL_BOGUS_CMD 0
#endif
Index: strace-5.7/tests-m32/ipc_shm.c
===================================================================
--- strace-5.7.orig/tests-m32/ipc_shm.c 2021-08-24 21:39:53.124419583 +0200
+++ strace-5.7/tests-m32/ipc_shm.c 2021-08-24 21:43:00.671841481 +0200
@@ -45,8 +45,9 @@
* Starting with commit glibc-2.32.9000-207-g9ebaabeaac1a96b0d91f,
* glibc skips shmctl syscall invocations and returns EINVAL
* for invalid shmctl commands.
+ * It has been backported into glic-2.28-153 in RHEL 8.5.
*/
-#if GLIBC_PREREQ_GE(2, 32)
+#if GLIBC_PREREQ_GE(2, 28)
# define TEST_SHMCTL_BOGUS_CMD 0
#endif
Index: strace-5.7/tests-m32/ipc_sem.c
===================================================================
--- strace-5.7.orig/tests-m32/ipc_sem.c 2021-08-24 21:39:53.135419490 +0200
+++ strace-5.7/tests-m32/ipc_sem.c 2021-08-24 21:43:00.671841481 +0200
@@ -26,8 +26,9 @@
* Starting with commit glibc-2.32.9000-147-ga16d2abd496bd974a882,
* glibc skips semctl syscall invocations and returns EINVAL
* for invalid semctl commands.
+ * It has been backported into glic-2.28-153 in RHEL 8.5.
*/
-#if GLIBC_PREREQ_GE(2, 32)
+#if GLIBC_PREREQ_GE(2, 28)
# define TEST_SEMCTL_BOGUS_CMD 0
#endif
Index: strace-5.7/tests-mx32/ipc_msg.c
===================================================================
--- strace-5.7.orig/tests-mx32/ipc_msg.c 2021-08-24 21:39:53.102419769 +0200
+++ strace-5.7/tests-mx32/ipc_msg.c 2021-08-24 21:43:00.671841481 +0200
@@ -55,8 +55,9 @@
* Starting with commit glibc-2.32.9000-149-gbe9b0b9a012780a403a2,
* glibc skips msgctl syscall invocations and returns EINVAL
* for invalid msgctl commands.
+ * It has been backported into glic-2.28-153 in RHEL 8.5.
*/
-#if GLIBC_PREREQ_GE(2, 32)
+#if GLIBC_PREREQ_GE(2, 28)
# define TEST_MSGCTL_BOGUS_CMD 0
#endif
Index: strace-5.7/tests-mx32/ipc_shm.c
===================================================================
--- strace-5.7.orig/tests-mx32/ipc_shm.c 2021-08-24 21:39:53.124419583 +0200
+++ strace-5.7/tests-mx32/ipc_shm.c 2021-08-24 21:43:00.671841481 +0200
@@ -45,8 +45,9 @@
* Starting with commit glibc-2.32.9000-207-g9ebaabeaac1a96b0d91f,
* glibc skips shmctl syscall invocations and returns EINVAL
* for invalid shmctl commands.
+ * It has been backported into glic-2.28-153 in RHEL 8.5.
*/
-#if GLIBC_PREREQ_GE(2, 32)
+#if GLIBC_PREREQ_GE(2, 28)
# define TEST_SHMCTL_BOGUS_CMD 0
#endif
Index: strace-5.7/tests-mx32/ipc_sem.c
===================================================================
--- strace-5.7.orig/tests-mx32/ipc_sem.c 2021-08-24 21:39:53.136419481 +0200
+++ strace-5.7/tests-mx32/ipc_sem.c 2021-08-24 21:43:00.672841472 +0200
@@ -26,8 +26,9 @@
* Starting with commit glibc-2.32.9000-147-ga16d2abd496bd974a882,
* glibc skips semctl syscall invocations and returns EINVAL
* for invalid semctl commands.
+ * It has been backported into glic-2.28-153 in RHEL 8.5.
*/
-#if GLIBC_PREREQ_GE(2, 32)
+#if GLIBC_PREREQ_GE(2, 28)
# define TEST_SEMCTL_BOGUS_CMD 0
#endif

View File

@ -1,7 +1,7 @@
Summary: Tracks and displays system calls associated with a running process
Name: strace
Version: 5.7
Release: 2%{?dist}
Release: 3%{?dist}
# The test suite is GPLv2+, all the rest is LGPLv2.1+.
License: LGPL-2.1+ and GPL-2.0+
Group: Development/Debuggers
@ -11,6 +11,7 @@ Source: https://strace.io/files/%{version}/%{name}-%{version}.tar.xz
BuildRequires: libacl-devel time gcc gzip
BuildRequires: pkgconfig(bluez)
BuildRequires: elfutils-devel binutils-devel
BuildRequires: libselinux-devel
## Reported by covscan
## v5.2-3-g7ada13f "evdev: avoid bit vector decoding on non-successful and 0 return codes"
@ -201,6 +202,40 @@ Patch137: 0137-Implement-testing-framework-for-pidns.patch
# v5.8-9-gf350ce0 "Add tests for PID namespace translation"
Patch138: 0138-Add-tests-for-PID-namespace-translation.patch
# v5.12~55 "tests: add fchmod-y test"
Patch142: 0142-tests-add-fchmod-y-test.patch
# v5.12~54 "tests: introduce create_and_enter_subdir and leave_and_remove_subdir"
Patch143: 0143-tests-introduce-create_and_enter_subdir-and-leave_an.patch
# v5.8~36 "tests: check decoding of faccessat syscall in -P, -y, and -yy modes"
Patch144: 0144-tests-check-decoding-of-faccessat-syscall-in-P-y-and.patch
# v5.12~97 "xmalloc: introduce xasprintf"
Patch145: 0145-xmalloc-introduce-xasprintf.patch
# v5.12~96 "tests: use xasprintf instead of asprintf"
Patch146: 0146-tests-use-xasprintf-instead-of-asprintf.patch
# v5.12~156 "file_handle: print f_handle as a hexadecimal string"
Patch147: 0147-file_handle-print-f_handle-as-a-hexadecimal-string.patch
# v5.10~47 "tests: fix execve test with fresh linux kernels"
Patch148: 0148-tests-fix-execve-test-with-fresh-linux-kernels.patch
# v5.12~49 "Implement --secontext[=full] option to display SELinux contexts"
Patch149: 0149-Implement-secontext-full-option-to-display-SELinux-c.patch
# v5.13-14-g9623154 "m4/mpers.m4: generate HAVE_*_SELINUX_RUNTIME config defines"
Patch155: 0155-m4-mpers.m4-generate-HAVE_-_SELINUX_RUNTIME-config-d.patch
# v5.9~28 "Introduce GLIBC_PREREQ_GE and GLIBC_PREREQ_LT macros"
Patch156: 0156-Introduce-GLIBC_PREREQ_GE-and-GLIBC_PREREQ_LT-macros.patch
# v5.9~27 "tests/ipc_msg.c: disable TEST_MSGCTL_BOGUS_ADDR on glibc >= 2.32"
Patch157: 0157-tests-ipc_msg.c-disable-TEST_MSGCTL_BOGUS_ADDR-on-gl.patch
# v5.10~46 "tests: disable TEST_MSGCTL_BOGUS_ADDR in ipc_msg test on glibc >= 2.31"
Patch158: 0158-tests-disable-TEST_MSGCTL_BOGUS_ADDR-in-ipc_msg-test.patch
# v5.10~22 "tests: disable tests for invalid msgctl commands on glibc >= 2.32"
Patch159: 0159-tests-disable-tests-for-invalid-msgctl-commands-on-g.patch
# v5.9~11 "tests: disable shmctl IPC_STAT test with a bogus address on glibc >= 2.32"
Patch160: 0160-tests-disable-shmctl-IPC_STAT-test-with-a-bogus-addr.patch
# v5.9~10 "tests: disable tests for invalid shmctl commands on glibc >= 2.32"
Patch161: 0161-tests-disable-tests-for-invalid-shmctl-commands-on-g.patch
# v5.9~12 "tests: disable tests for invalid semctl commands on glibc >= 2.32"
Patch162: 0162-tests-disable-tests-for-invalid-semctl-commands-on-g.patch
### Wire up rseq and kexec_file_load in order to avoid kexec_file_load
### test failure on aarch64. Addresses https://bugzilla.redhat.com/1676045
### ("strace: FTBFS in Fedora rawhide/f30").
@ -217,6 +252,10 @@ Patch2001: 2001-limit-qual_fault-scope-on-aarch64.patch
#Patch2002: 2002-disable-ksysent-on-8.2.patch
## RHEL-only: avoid ARRAY_SIZE macro re-definition in libiberty.h
Patch2003: 2003-undef-ARRAY_SIZE.patch
## RHEL-only: glibc-2.32.9000-147-ga16d2abd496bd974a882,
## glibc-2.32.9000-149-gbe9b0b9a012780a403a2 and
## glibc-2.32.9000-207-g9ebaabeaac1a96b0d91f have been backported in RHEL.
Patch2004: 2004-glibc-msgctl-semctl-shmctl-backport-workaround.patch
# We no longer need to build a separate strace32 binary, but we don't want
@ -319,6 +358,22 @@ received by a process.
%patch136 -p1
%patch137 -p1
%patch138 -p1
%patch142 -p1
%patch143 -p1
%patch144 -p1
%patch145 -p1
%patch146 -p1
%patch147 -p1
%patch148 -p1
%patch149 -p1
%patch155 -p1
%patch156 -p1
%patch157 -p1
%patch158 -p1
%patch159 -p1
%patch160 -p1
%patch161 -p1
%patch162 -p1
#%patch1000 -p1
#%patch1001 -p1
@ -327,6 +382,7 @@ received by a process.
%patch2001 -p1
#%patch2002 -p1
%patch2003 -p1
%patch2004 -p1
chmod a+x tests/*.test
@ -405,6 +461,9 @@ echo 'END OF TEST SUITE INFORMATION'
%{_mandir}/man1/*
%changelog
* Mon Aug 09 2021 Eugene Syromiatnikov <esyr@redhat.com> - 5.7-3
- Add SELnux context decoding support (#1946500).
* Mon Nov 09 2020 Eugene Syromiatnikov <esyr@redhat.com> - 5.7-2
- Add PID namespace translation support (#1725113).