diff --git a/SOURCES/0028-macros-add-ROUNDUP-macro.patch b/SOURCES/0028-macros-add-ROUNDUP-macro.patch new file mode 100644 index 0000000..41d0c08 --- /dev/null +++ b/SOURCES/0028-macros-add-ROUNDUP-macro.patch @@ -0,0 +1,25 @@ +From cbbf708b4d2f8a66b07cf805f82edbe892c0bbf7 Mon Sep 17 00:00:00 2001 +From: Eugene Syromyatnikov +Date: Sun, 2 Sep 2018 18:15:40 +0200 +Subject: [PATCH] macros: add ROUNDUP macro + +* macros.h (ROUNDUP): New macro. +--- + macros.h | 4 ++++ + 1 file changed, 4 insertions(+) + +Index: strace-4.24/macros.h +=================================================================== +--- strace-4.24.orig/macros.h 2019-08-01 18:40:47.322659137 +0200 ++++ strace-4.24/macros.h 2019-08-01 19:49:00.405972298 +0200 +@@ -28,6 +28,10 @@ + #endif + #define CLAMP(val, min, max) MIN(MAX(min, val), max) + ++#ifndef ROUNDUP ++# define ROUNDUP(val_, div_) ((((val_) + (div_) - 1) / (div_)) * (div_)) ++#endif ++ + #ifndef offsetofend + # define offsetofend(type_, member_) \ + (offsetof(type_, member_) + sizeof(((type_ *)0)->member_)) diff --git a/SOURCES/0029-util-update-dumpstr.patch b/SOURCES/0029-util-update-dumpstr.patch new file mode 100644 index 0000000..a4f38eb --- /dev/null +++ b/SOURCES/0029-util-update-dumpstr.patch @@ -0,0 +1,49 @@ +From 79acbcf2550f3a55108240558efb8b9c36eb8399 Mon Sep 17 00:00:00 2001 +From: Eugene Syromyatnikov +Date: Tue, 19 Feb 2019 03:10:11 +0100 +Subject: [PATCH] util: update dumpstr + +Use a buffer of a limited size, use proper type for dump amount, avoid +hard-coding of byte counts, calculate output buffer size more accurately +and minimise its rewriting, pad offset with zeros in accordance +with expected output amount. + +* defs.h (dumpstr): Change the type of len argument from int to +kernel_ulong_t. +* macros.h (ROUNDUP_DIV): New macro. +(ROUNDUP): Rewrite using ROUNDUP_DIV. +* util.c (ILOG2_ITER_): New macro. +(ilog2_64, ilog2_32): New functions. +(ilog2_klong): New macro, wrapper around ilog2_32/ilog2_64, so (potentially +more expensive) ilog2_64 is not used for ilog2 calculation +of a kernel_ulong_t-typed variable on architectures with 32-bit kernel long. +(dumpstr): Update. + +Co-Authored-by: Dmitry V. Levin +--- + defs.h | 2 +- + macros.h | 6 +- + util.c | 205 ++++++++++++++++++++++++++++++++++++++++++++++++++------------- + 3 files changed, 169 insertions(+), 44 deletions(-) + +diff --git a/macros.h b/macros.h +index 7f019480..61abf826 100644 +--- a/macros.h ++++ b/macros.h +@@ -28,8 +28,12 @@ + #endif + #define CLAMP(val, min, max) MIN(MAX(min, val), max) + ++#ifndef ROUNDUP_DIV ++# define ROUNDUP_DIV(val_, div_) (((val_) + (div_) - 1) / (div_)) ++#endif ++ + #ifndef ROUNDUP +-# define ROUNDUP(val_, div_) ((((val_) + (div_) - 1) / (div_)) * (div_)) ++# define ROUNDUP(val_, div_) (ROUNDUP_DIV((val_), (div_)) * (div_)) + #endif + + #ifndef offsetofend +-- +2.13.6 + diff --git a/SOURCES/0030-evdev-avoid-bit-vector-decoding-on-non-successful-an.patch b/SOURCES/0030-evdev-avoid-bit-vector-decoding-on-non-successful-an.patch new file mode 100644 index 0000000..3d21fae --- /dev/null +++ b/SOURCES/0030-evdev-avoid-bit-vector-decoding-on-non-successful-an.patch @@ -0,0 +1,42 @@ +From 7ada13f3a40e2f58aea335cf910666378e7dd99a Mon Sep 17 00:00:00 2001 +From: Eugene Syromyatnikov +Date: Fri, 12 Jul 2019 14:38:33 +0200 +Subject: [PATCH 1/3] evdev: avoid bit vector decoding on non-successful and 0 + return codes + +Reported by Clang. + + strace/evdev.c:157:3: note: The value 0 is assigned to 'size' + # size = tcp->u_rval * 8; + # ^~~~~~~~~~~~~~~~~~~~~~ + strace/evdev.c:158:2: warning: Declared variable-length array (VLA) + has zero size + # char decoded_arg[size]; + # ^ + +* evdev.c (decode_bitset_): Bail out before decoded_arg VLA definition. +--- + evdev.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +diff --git a/evdev.c b/evdev.c +index e402d26e..4b811cf8 100644 +--- a/evdev.c ++++ b/evdev.c +@@ -155,6 +155,13 @@ decode_bitset_(struct tcb *const tcp, const kernel_ulong_t arg, + size = max_nr; + else + size = tcp->u_rval * 8; ++ ++ if (syserror(tcp) || !size) { ++ printaddr(arg); ++ ++ return RVAL_IOCTL_DECODED; ++ } ++ + char decoded_arg[size]; + + if (umove_or_printaddr(tcp, arg, &decoded_arg)) +-- +2.13.6 + diff --git a/SOURCES/0031-avoid-zero-length-VLA-in-evdev_c.patch b/SOURCES/0031-avoid-zero-length-VLA-in-evdev_c.patch deleted file mode 100644 index a5141e7..0000000 --- a/SOURCES/0031-avoid-zero-length-VLA-in-evdev_c.patch +++ /dev/null @@ -1,62 +0,0 @@ -Index: strace-4.24/evdev.c -=================================================================== ---- strace-4.24.orig/evdev.c 2019-06-13 23:42:43.294304862 +0200 -+++ strace-4.24/evdev.c 2019-06-13 23:43:35.588294946 +0200 -@@ -143,6 +143,14 @@ - return RVAL_IOCTL_DECODED; - } - -+# ifndef ROUNDUP_DIV -+# define ROUNDUP_DIV(val_, div_) (((val_) + (div_) - 1) / (div_)) -+# endif -+ -+# ifndef ROUNDUP -+# define ROUNDUP(val_, div_) (ROUNDUP_DIV((val_), (div_)) * (div_)) -+# endif -+ - static int - decode_bitset_(struct tcb *const tcp, const kernel_ulong_t arg, - const struct xlat decode_nr[], const unsigned int max_nr, -@@ -151,25 +159,36 @@ - tprints(", "); - - unsigned int size; -- if ((kernel_ulong_t) tcp->u_rval > max_nr / 8) -- size = max_nr; -+ unsigned int size_bits; -+ -+ if ((kernel_ulong_t) tcp->u_rval > max_nr / CHAR_BIT) -+ size_bits = max_nr; - else -- size = tcp->u_rval * 8; -+ size_bits = tcp->u_rval * CHAR_BIT; -+ -+ size = ROUNDUP(ROUNDUP_DIV(size_bits, CHAR_BIT), current_wordsize); -+ -+ if (syserror(tcp) || !size) { -+ printaddr(arg); -+ -+ return RVAL_IOCTL_DECODED; -+ } -+ - char decoded_arg[size]; - -- if (umove_or_printaddr(tcp, arg, &decoded_arg)) -+ if (umoven_or_printaddr(tcp, arg, size, decoded_arg)) - return RVAL_IOCTL_DECODED; - - tprints("["); - - int bit_displayed = 0; -- int i = next_set_bit(decoded_arg, 0, size); -+ int i = next_set_bit(decoded_arg, 0, size_bits); - if (i < 0) { - tprints(" 0 "); - } else { - printxval_dispatch(decode_nr, decode_nr_size, i, dflt, xt); - -- while ((i = next_set_bit(decoded_arg, i + 1, size)) > 0) { -+ while ((i = next_set_bit(decoded_arg, i + 1, size_bits)) > 0) { - if (abbrev(tcp) && bit_displayed >= 3) { - tprints(", ..."); - break; diff --git a/SOURCES/0031-evdev-fix-array-size-calculation-in-decode_bitset_.patch b/SOURCES/0031-evdev-fix-array-size-calculation-in-decode_bitset_.patch new file mode 100644 index 0000000..18cf773 --- /dev/null +++ b/SOURCES/0031-evdev-fix-array-size-calculation-in-decode_bitset_.patch @@ -0,0 +1,57 @@ +From 96194ed74158f0b9976fae43a910ad14eaea141e Mon Sep 17 00:00:00 2001 +From: Eugene Syromyatnikov +Date: Fri, 12 Jul 2019 14:57:28 +0200 +Subject: [PATCH 2/3] evdev: fix array size calculation in decode_bitset_ + +max_nr is in bits (as it is a number of flags), result is in bytes, and +the array allocation has to be in personality words. + +There's still an open question, however, what to do on big-endian +architectures when a non-divisible-by-4 value is returned. + +* evdev.c (decode_bitset_): Declare size_bits, initialise it and use it +later instead of size; round up size by personality's word boundary. +--- + evdev.c | 12 ++++++++---- + 1 file changed, 8 insertions(+), 4 deletions(-) + +diff --git a/evdev.c b/evdev.c +index 4b811cf8..a3d9cb55 100644 +--- a/evdev.c ++++ b/evdev.c +@@ -151,10 +151,14 @@ decode_bitset_(struct tcb *const tcp, const kernel_ulong_t arg, + tprints(", "); + + unsigned int size; ++ unsigned int size_bits; ++ + if ((kernel_ulong_t) tcp->u_rval > max_nr / 8) +- size = max_nr; ++ size_bits = max_nr; + else +- size = tcp->u_rval * 8; ++ size_bits = tcp->u_rval * 8; ++ ++ size = ROUNDUP(ROUNDUP_DIV(size_bits, 8), current_wordsize); + + if (syserror(tcp) || !size) { + printaddr(arg); +@@ -170,13 +174,13 @@ decode_bitset_(struct tcb *const tcp, const kernel_ulong_t arg, + tprints("["); + + int bit_displayed = 0; +- int i = next_set_bit(decoded_arg, 0, size); ++ int i = next_set_bit(decoded_arg, 0, size_bits); + if (i < 0) { + tprints(" 0 "); + } else { + printxval_dispatch(decode_nr, decode_nr_size, i, dflt, xt); + +- while ((i = next_set_bit(decoded_arg, i + 1, size)) > 0) { ++ while ((i = next_set_bit(decoded_arg, i + 1, size_bits)) > 0) { + if (abbrev(tcp) && bit_displayed >= 3) { + tprints(", ..."); + break; +-- +2.13.6 + diff --git a/SOURCES/0032-tests-check-decoding-of-successful-evdev-ioctl.patch b/SOURCES/0032-tests-check-decoding-of-successful-evdev-ioctl.patch new file mode 100644 index 0000000..c2dfa8e --- /dev/null +++ b/SOURCES/0032-tests-check-decoding-of-successful-evdev-ioctl.patch @@ -0,0 +1,1047 @@ +From e286b9cbc0bd542bb441c5acb65fef5f58b71aef Mon Sep 17 00:00:00 2001 +From: Zhibin Li <08826794brmt@gmail.com> +Date: Wed, 1 Aug 2018 17:54:35 +0800 +Subject: [PATCH] tests: check decoding of successful evdev ioctl + +* tests/ioctl_evdev-success.c: New file. +* tests/ioctl_evdev-success-v.c: Likewise. +* tests/ioctl_evdev-success.test: New test. +* tests/ioctl_evdev-success-v.test: Likewise. +* tests/.gitignore: Add ioctl_evdev-success and ioctl_evdev-success-v. +* tests/Makefile.am (check_PROGRAMS): Likewise. +(DECODER_TESTS): Add the two tests mentioned above. + +Skipped files (not present in the tarball): + tests/.gitignore + +Additional changes: + tests/Makefile.in (generated from tests/Makefile.am) + tests-m32/Makefile.am (generated from tests/Makefile.am) + tests-m32/Makefile.in (generated from tests-m32/Makefile.am) + tests-m32/ioctl_evdev-success-v.c (copy of tests/ioctl_evdev-success-v.c) + tests-m32/ioctl_evdev-success-v.test (copy of tests/ioctl_evdev-success-v.test) + tests-m32/ioctl_evdev-success.c (copy of tests/ioctl_evdev-success.c) + tests-m32/ioctl_evdev-success.test (copy of tests/ioctl_evdev-success.test) + tests-mx32/Makefile.am (generated from tests/Makefile.am) + tests-mx32/Makefile.in (generated from tests-mx32/Makefile.am) + tests-mx32/ioctl_evdev-success-v.c (copy of tests/ioctl_evdev-success-v.c) + tests-mx32/ioctl_evdev-success-v.test (copy of tests/ioctl_evdev-success-v.test) + tests-mx32/ioctl_evdev-success.c (copy of tests/ioctl_evdev-success.c) + tests-mx32/ioctl_evdev-success.test (copy of tests/ioctl_evdev-success.test) +--- + tests/.gitignore | 2 + + tests/Makefile.am | 4 + + tests/ioctl_evdev-success-v.c | 2 + + tests/ioctl_evdev-success-v.test | 13 +++ + tests/ioctl_evdev-success.c | 232 +++++++++++++++++++++++++++++++++++++++ + tests/ioctl_evdev-success.test | 13 +++ + 6 files changed, 266 insertions(+) + create mode 100644 tests/ioctl_evdev-success-v.c + create mode 100755 tests/ioctl_evdev-success-v.test + create mode 100644 tests/ioctl_evdev-success.c + create mode 100755 tests/ioctl_evdev-success.test + +Index: strace-4.24/tests/Makefile.am +=================================================================== +--- strace-4.24.orig/tests/Makefile.am 2019-08-01 18:40:47.334658983 +0200 ++++ strace-4.24/tests/Makefile.am 2019-08-01 18:40:47.365658583 +0200 +@@ -98,6 +98,8 @@ + int_0x80 \ + ioctl_dm-v \ + ioctl_evdev-v \ ++ ioctl_evdev-success \ ++ ioctl_evdev-success-v \ + ioctl_loop-nv \ + ioctl_loop-v \ + ioctl_nsfs \ +@@ -231,6 +233,8 @@ + futex.test \ + getuid.test \ + ioctl.test \ ++ ioctl_evdev-success.test \ ++ ioctl_evdev-success-v.test \ + ioctl_perf-success.test \ + ipc_msgbuf.test \ + kern_features-fault.test \ +Index: strace-4.24/tests-m32/Makefile.am +=================================================================== +--- strace-4.24.orig/tests-m32/Makefile.am 2018-08-14 02:44:30.000000000 +0200 ++++ strace-4.24/tests-m32/Makefile.am 2019-08-01 18:40:47.365658583 +0200 +@@ -118,6 +118,8 @@ + int_0x80 \ + ioctl_dm-v \ + ioctl_evdev-v \ ++ ioctl_evdev-success \ ++ ioctl_evdev-success-v \ + ioctl_loop-nv \ + ioctl_loop-v \ + ioctl_nsfs \ +@@ -247,6 +249,8 @@ + futex.test \ + getuid.test \ + ioctl.test \ ++ ioctl_evdev-success.test \ ++ ioctl_evdev-success-v.test \ + ioctl_perf-success.test \ + ipc_msgbuf.test \ + kern_features-fault.test \ +Index: strace-4.24/tests-mx32/Makefile.am +=================================================================== +--- strace-4.24.orig/tests-mx32/Makefile.am 2018-08-14 02:44:30.000000000 +0200 ++++ strace-4.24/tests-mx32/Makefile.am 2019-08-01 18:40:47.366658571 +0200 +@@ -118,6 +118,8 @@ + int_0x80 \ + ioctl_dm-v \ + ioctl_evdev-v \ ++ ioctl_evdev-success \ ++ ioctl_evdev-success-v \ + ioctl_loop-nv \ + ioctl_loop-v \ + ioctl_nsfs \ +@@ -247,6 +249,8 @@ + futex.test \ + getuid.test \ + ioctl.test \ ++ ioctl_evdev-success.test \ ++ ioctl_evdev-success-v.test \ + ioctl_perf-success.test \ + ipc_msgbuf.test \ + kern_features-fault.test \ +Index: strace-4.24/tests/ioctl_evdev-success-v.c +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ strace-4.24/tests/ioctl_evdev-success-v.c 2019-08-01 18:40:47.366658571 +0200 +@@ -0,0 +1,2 @@ ++#define VERBOSE 1 ++#include "ioctl_evdev-success.c" +Index: strace-4.24/tests-m32/ioctl_evdev-success-v.c +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ strace-4.24/tests-m32/ioctl_evdev-success-v.c 2019-08-01 18:40:47.366658571 +0200 +@@ -0,0 +1,2 @@ ++#define VERBOSE 1 ++#include "ioctl_evdev-success.c" +Index: strace-4.24/tests-mx32/ioctl_evdev-success-v.c +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ strace-4.24/tests-mx32/ioctl_evdev-success-v.c 2019-08-01 18:40:47.366658571 +0200 +@@ -0,0 +1,2 @@ ++#define VERBOSE 1 ++#include "ioctl_evdev-success.c" +Index: strace-4.24/tests/ioctl_evdev-success-v.test +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ strace-4.24/tests/ioctl_evdev-success-v.test 2019-08-01 18:40:58.009521546 +0200 +@@ -0,0 +1,13 @@ ++#!/bin/sh -efu ++ ++. "${srcdir=.}/scno_tampering.sh" ++ ++: ${IOCTL_INJECT_START=256} ++: ${IOCTL_INJECT_RETVAL=8} ++ ++run_prog ++run_strace -a16 -v -e trace=ioctl \ ++ -e inject=ioctl:retval="${IOCTL_INJECT_RETVAL}":when="${IOCTL_INJECT_START}+" \ ++ ../ioctl_evdev-success-v "${IOCTL_INJECT_START}" "${IOCTL_INJECT_RETVAL}"> "$EXP" ++grep -v '^ioctl([012][,<]' < "$LOG" > "$OUT" ++match_diff "$OUT" "$EXP" +Index: strace-4.24/tests-m32/ioctl_evdev-success-v.test +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ strace-4.24/tests-m32/ioctl_evdev-success-v.test 2019-08-01 18:40:58.009521546 +0200 +@@ -0,0 +1,13 @@ ++#!/bin/sh -efu ++ ++. "${srcdir=.}/scno_tampering.sh" ++ ++: ${IOCTL_INJECT_START=256} ++: ${IOCTL_INJECT_RETVAL=8} ++ ++run_prog ++run_strace -a16 -v -e trace=ioctl \ ++ -e inject=ioctl:retval="${IOCTL_INJECT_RETVAL}":when="${IOCTL_INJECT_START}+" \ ++ ../ioctl_evdev-success-v "${IOCTL_INJECT_START}" "${IOCTL_INJECT_RETVAL}"> "$EXP" ++grep -v '^ioctl([012][,<]' < "$LOG" > "$OUT" ++match_diff "$OUT" "$EXP" +Index: strace-4.24/tests-mx32/ioctl_evdev-success-v.test +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ strace-4.24/tests-mx32/ioctl_evdev-success-v.test 2019-08-01 18:40:58.009521546 +0200 +@@ -0,0 +1,13 @@ ++#!/bin/sh -efu ++ ++. "${srcdir=.}/scno_tampering.sh" ++ ++: ${IOCTL_INJECT_START=256} ++: ${IOCTL_INJECT_RETVAL=8} ++ ++run_prog ++run_strace -a16 -v -e trace=ioctl \ ++ -e inject=ioctl:retval="${IOCTL_INJECT_RETVAL}":when="${IOCTL_INJECT_START}+" \ ++ ../ioctl_evdev-success-v "${IOCTL_INJECT_START}" "${IOCTL_INJECT_RETVAL}"> "$EXP" ++grep -v '^ioctl([012][,<]' < "$LOG" > "$OUT" ++match_diff "$OUT" "$EXP" +Index: strace-4.24/tests/ioctl_evdev-success.c +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ strace-4.24/tests/ioctl_evdev-success.c 2019-08-01 18:40:58.009521546 +0200 +@@ -0,0 +1,232 @@ ++#include "tests.h" ++ ++#ifdef HAVE_LINUX_INPUT_H ++ ++# include ++# include ++# include ++# include ++# include ++# include "print_fields.h" ++ ++static const char *errstr; ++ ++struct evdev_check { ++ unsigned long cmd; ++ const char *cmd_str; ++ void *arg_ptr; ++ void (*print_arg)(long rc, void *ptr, void *arg); ++}; ++ ++static long ++invoke_test_syscall(unsigned long cmd, void *p) ++{ ++ long rc = ioctl(-1, cmd, p); ++ errstr = sprintrc(rc); ++ static char inj_errstr[4096]; ++ ++ snprintf(inj_errstr, sizeof(inj_errstr), "%s (INJECTED)", errstr); ++ errstr = inj_errstr; ++ return rc; ++} ++ ++static void ++test_evdev(struct evdev_check *check, void *arg) ++{ ++ long rc = invoke_test_syscall(check->cmd, check->arg_ptr); ++ printf("ioctl(-1, %s, ", check->cmd_str); ++ if (check->print_arg) ++ check->print_arg(rc, check->arg_ptr, arg); ++ else ++ printf("%p", check->arg_ptr); ++ printf(") = %s\n", errstr); ++} ++ ++static void ++print_input_absinfo(long rc, void *ptr, void *arg) ++{ ++ struct input_absinfo *absinfo = ptr; ++ ++ if (rc < 0) { ++ printf("%p", absinfo); ++ return; ++ } ++ PRINT_FIELD_U("{", *absinfo, value); ++ PRINT_FIELD_U(", ", *absinfo, minimum); ++# if VERBOSE ++ PRINT_FIELD_U(", ", *absinfo, maximum); ++ PRINT_FIELD_U(", ", *absinfo, fuzz); ++ PRINT_FIELD_U(", ", *absinfo, flat); ++# ifdef HAVE_STRUCT_INPUT_ABSINFO_RESOLUTION ++ PRINT_FIELD_U(", ", *absinfo, resolution); ++# endif ++# else ++ printf(", ..."); ++# endif ++ printf("}"); ++} ++ ++static void ++print_input_id(long rc, void *ptr, void *arg) ++{ ++ struct input_id *id = ptr; ++ ++ if (rc < 0) { ++ printf("%p", id); ++ return; ++ } ++ printf("{ID_BUS=%" PRIu16 ++ ", ID_VENDOR=%" PRIu16 ++ ", ID_PRODUCT=%" PRIu16 ++ ", ID_VERSION=%" PRIu16 "}", ++ id->bustype, id->vendor, id->product, id->version); ++} ++ ++# ifdef EVIOCGMTSLOTS ++static void ++print_mtslots(long rc, void *ptr, void *arg) ++{ ++ int *buffer = ptr; ++ const char **str = arg; ++ int num = atoi(*(str + 1)); ++ ++ if (rc < 0) { ++ printf("%p", buffer); ++ return; ++ } ++ ++ printf("{code=%s", *str); ++ printf(", values=["); ++ for (unsigned int i = 1; i <= (unsigned) num; i++) ++ printf("%s%s", i > 1 ? ", " : "", *(str + i + 1)); ++ printf("]}"); ++} ++# endif ++ ++static void ++print_getbit(long rc, void *ptr, void *arg) ++{ ++ const char **str = arg; ++ int num = atoi(*str); ++ ++ if (rc < 0) { ++ printf("%p", ptr); ++ return; ++ } ++ ++ printf("["); ++ printf("%s", *(str + 1)); ++ for (unsigned int i = 2; i <= (unsigned) num; i++) { ++# if ! VERBOSE ++ if (i > 4) { ++ printf(", ..."); ++ break; ++ } ++# endif ++ printf(", "); ++ printf("%s", *(str + i)); ++ } ++ printf("]"); ++} ++ ++int ++main(int argc, char **argv) ++{ ++ unsigned long num_skip; ++ long inject_retval; ++ bool locked = false; ++ ++ if (argc == 1) ++ return 0; ++ ++ if (argc < 3) ++ error_msg_and_fail("Usage: %s NUM_SKIP INJECT_RETVAL", argv[0]); ++ ++ num_skip = strtoul(argv[1], NULL, 0); ++ inject_retval = strtol(argv[2], NULL, 0); ++ ++ if (inject_retval < 0) ++ error_msg_and_fail("Expected non-negative INJECT_RETVAL, " ++ "but got %ld", inject_retval); ++ ++ for (unsigned int i = 0; i < num_skip; i++) { ++ long rc = ioctl(-1, EVIOCGID, NULL); ++ printf("ioctl(-1, EVIOCGID, NULL) = %s%s\n", ++ sprintrc(rc), ++ rc == inject_retval ? " (INJECTED)" : ""); ++ ++ if (rc != inject_retval) ++ continue; ++ ++ locked = true; ++ break; ++ } ++ ++ if (!locked) ++ error_msg_and_fail("Hasn't locked on ioctl(-1" ++ ", EVIOCGID, NULL) returning %lu", ++ inject_retval); ++ ++ TAIL_ALLOC_OBJECT_CONST_PTR(struct input_id, id); ++ TAIL_ALLOC_OBJECT_CONST_PTR(struct input_absinfo, absinfo); ++ TAIL_ALLOC_OBJECT_CONST_PTR(int, bad_addr_slot); ++# ifdef EVIOCGMTSLOTS ++ int mtslots[] = { ABS_MT_SLOT, 1, 3 }; ++ /* we use the second element to indicate the number of values */ ++ /* mtslots_str[1] is "2" so the number of values is 2 */ ++ const char *mtslots_str[] = { "ABS_MT_SLOT", "2", "1", "3" }; ++ ++ /* invalid flag */ ++ int invalid_mtslot[] = { -1, 1 }; ++ char invalid_str[4096]; ++ snprintf(invalid_str, sizeof(invalid_str), "%#x /* ABS_MT_??? */", invalid_mtslot[0]); ++ const char *invalid_mtslot_str[] = { invalid_str, "1", "1" }; ++# endif ++ ++ /* set more than 4 bits */ ++ unsigned long ev_more[] = { 1 << EV_ABS | 1 << EV_MSC | 1 << EV_LED | 1 << EV_SND | 1 << EV_PWR }; ++ /* we use the first element to indicate the number of set bits */ ++ /* ev_more_str[0] is "5" so the number of set bits is 5 */ ++ const char *ev_more_str[] = { "5", "EV_ABS", "EV_MSC", "EV_LED", "EV_SND", "EV_PWR" }; ++ ++ /* set less than 4 bits */ ++ unsigned long ev_less[] = { 1 << EV_ABS | 1 << EV_MSC | 1 << EV_LED }; ++ const char *ev_less_str[] = { "3", "EV_ABS", "EV_MSC", "EV_LED" }; ++ ++ /* set zero bit */ ++ unsigned long ev_zero[] = { 0x0 }; ++ const char *ev_zero_str[] = { "0", " 0 " }; ++ ++ /* KEY_MAX is 0x2ff which is greater than retval * 8 */ ++ unsigned long key[] = { 1 << KEY_1 | 1 << KEY_2, 0 }; ++ const char *key_str[] = { "2", "KEY_1", "KEY_2" }; ++ ++ struct { ++ struct evdev_check check; ++ void *ptr; ++ } a[] = { ++ { { ARG_STR(EVIOCGID), id, print_input_id }, NULL }, ++ { { ARG_STR(EVIOCGABS(ABS_X)), absinfo, print_input_absinfo }, NULL }, ++ { { ARG_STR(EVIOCGABS(ABS_Y)), absinfo, print_input_absinfo }, NULL }, ++ { { ARG_STR(EVIOCGABS(ABS_Y)), absinfo, print_input_absinfo }, NULL }, ++ { { ARG_STR(EVIOCGBIT(0, 0)), ev_more, print_getbit }, &ev_more_str }, ++ { { ARG_STR(EVIOCGBIT(0, 0)), ev_less, print_getbit }, &ev_less_str }, ++ { { ARG_STR(EVIOCGBIT(0, 0)), ev_zero, print_getbit }, &ev_zero_str }, ++ { { ARG_STR(EVIOCGBIT(EV_KEY, 0)), key, print_getbit }, &key_str}, ++# ifdef EVIOCGMTSLOTS ++ { { ARG_STR(EVIOCGMTSLOTS(12)), mtslots, print_mtslots }, &mtslots_str }, ++ { { ARG_STR(EVIOCGMTSLOTS(8)), invalid_mtslot, print_mtslots }, &invalid_mtslot_str } ++# endif ++ }; ++ for (unsigned int i = 0; i < ARRAY_SIZE(a); i++) { ++ test_evdev(&a[i].check, a[i].ptr); ++ } ++ ++ puts("+++ exited with 0 +++"); ++ return 0; ++} ++#else ++ ++SKIP_MAIN_UNDEFINED("HAVE_LINUX_INPUT_H") ++ ++#endif +Index: strace-4.24/tests-m32/ioctl_evdev-success.c +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ strace-4.24/tests-m32/ioctl_evdev-success.c 2019-08-01 18:40:47.367658558 +0200 +@@ -0,0 +1,232 @@ ++#include "tests.h" ++ ++#ifdef HAVE_LINUX_INPUT_H ++ ++# include ++# include ++# include ++# include ++# include ++# include "print_fields.h" ++ ++static const char *errstr; ++ ++struct evdev_check { ++ unsigned long cmd; ++ const char *cmd_str; ++ void *arg_ptr; ++ void (*print_arg)(long rc, void *ptr, void *arg); ++}; ++ ++static long ++invoke_test_syscall(unsigned long cmd, void *p) ++{ ++ long rc = ioctl(-1, cmd, p); ++ errstr = sprintrc(rc); ++ static char inj_errstr[4096]; ++ ++ snprintf(inj_errstr, sizeof(inj_errstr), "%s (INJECTED)", errstr); ++ errstr = inj_errstr; ++ return rc; ++} ++ ++static void ++test_evdev(struct evdev_check *check, void *arg) ++{ ++ long rc = invoke_test_syscall(check->cmd, check->arg_ptr); ++ printf("ioctl(-1, %s, ", check->cmd_str); ++ if (check->print_arg) ++ check->print_arg(rc, check->arg_ptr, arg); ++ else ++ printf("%p", check->arg_ptr); ++ printf(") = %s\n", errstr); ++} ++ ++static void ++print_input_absinfo(long rc, void *ptr, void *arg) ++{ ++ struct input_absinfo *absinfo = ptr; ++ ++ if (rc < 0) { ++ printf("%p", absinfo); ++ return; ++ } ++ PRINT_FIELD_U("{", *absinfo, value); ++ PRINT_FIELD_U(", ", *absinfo, minimum); ++# if VERBOSE ++ PRINT_FIELD_U(", ", *absinfo, maximum); ++ PRINT_FIELD_U(", ", *absinfo, fuzz); ++ PRINT_FIELD_U(", ", *absinfo, flat); ++# ifdef HAVE_STRUCT_INPUT_ABSINFO_RESOLUTION ++ PRINT_FIELD_U(", ", *absinfo, resolution); ++# endif ++# else ++ printf(", ..."); ++# endif ++ printf("}"); ++} ++ ++static void ++print_input_id(long rc, void *ptr, void *arg) ++{ ++ struct input_id *id = ptr; ++ ++ if (rc < 0) { ++ printf("%p", id); ++ return; ++ } ++ printf("{ID_BUS=%" PRIu16 ++ ", ID_VENDOR=%" PRIu16 ++ ", ID_PRODUCT=%" PRIu16 ++ ", ID_VERSION=%" PRIu16 "}", ++ id->bustype, id->vendor, id->product, id->version); ++} ++ ++# ifdef EVIOCGMTSLOTS ++static void ++print_mtslots(long rc, void *ptr, void *arg) ++{ ++ int *buffer = ptr; ++ const char **str = arg; ++ int num = atoi(*(str + 1)); ++ ++ if (rc < 0) { ++ printf("%p", buffer); ++ return; ++ } ++ ++ printf("{code=%s", *str); ++ printf(", values=["); ++ for (unsigned int i = 1; i <= (unsigned) num; i++) ++ printf("%s%s", i > 1 ? ", " : "", *(str + i + 1)); ++ printf("]}"); ++} ++# endif ++ ++static void ++print_getbit(long rc, void *ptr, void *arg) ++{ ++ const char **str = arg; ++ int num = atoi(*str); ++ ++ if (rc < 0) { ++ printf("%p", ptr); ++ return; ++ } ++ ++ printf("["); ++ printf("%s", *(str + 1)); ++ for (unsigned int i = 2; i <= (unsigned) num; i++) { ++# if ! VERBOSE ++ if (i > 4) { ++ printf(", ..."); ++ break; ++ } ++# endif ++ printf(", "); ++ printf("%s", *(str + i)); ++ } ++ printf("]"); ++} ++ ++int ++main(int argc, char **argv) ++{ ++ unsigned long num_skip; ++ long inject_retval; ++ bool locked = false; ++ ++ if (argc == 1) ++ return 0; ++ ++ if (argc < 3) ++ error_msg_and_fail("Usage: %s NUM_SKIP INJECT_RETVAL", argv[0]); ++ ++ num_skip = strtoul(argv[1], NULL, 0); ++ inject_retval = strtol(argv[2], NULL, 0); ++ ++ if (inject_retval < 0) ++ error_msg_and_fail("Expected non-negative INJECT_RETVAL, " ++ "but got %ld", inject_retval); ++ ++ for (unsigned int i = 0; i < num_skip; i++) { ++ long rc = ioctl(-1, EVIOCGID, NULL); ++ printf("ioctl(-1, EVIOCGID, NULL) = %s%s\n", ++ sprintrc(rc), ++ rc == inject_retval ? " (INJECTED)" : ""); ++ ++ if (rc != inject_retval) ++ continue; ++ ++ locked = true; ++ break; ++ } ++ ++ if (!locked) ++ error_msg_and_fail("Hasn't locked on ioctl(-1" ++ ", EVIOCGID, NULL) returning %lu", ++ inject_retval); ++ ++ TAIL_ALLOC_OBJECT_CONST_PTR(struct input_id, id); ++ TAIL_ALLOC_OBJECT_CONST_PTR(struct input_absinfo, absinfo); ++ TAIL_ALLOC_OBJECT_CONST_PTR(int, bad_addr_slot); ++# ifdef EVIOCGMTSLOTS ++ int mtslots[] = { ABS_MT_SLOT, 1, 3 }; ++ /* we use the second element to indicate the number of values */ ++ /* mtslots_str[1] is "2" so the number of values is 2 */ ++ const char *mtslots_str[] = { "ABS_MT_SLOT", "2", "1", "3" }; ++ ++ /* invalid flag */ ++ int invalid_mtslot[] = { -1, 1 }; ++ char invalid_str[4096]; ++ snprintf(invalid_str, sizeof(invalid_str), "%#x /* ABS_MT_??? */", invalid_mtslot[0]); ++ const char *invalid_mtslot_str[] = { invalid_str, "1", "1" }; ++# endif ++ ++ /* set more than 4 bits */ ++ unsigned long ev_more[] = { 1 << EV_ABS | 1 << EV_MSC | 1 << EV_LED | 1 << EV_SND | 1 << EV_PWR }; ++ /* we use the first element to indicate the number of set bits */ ++ /* ev_more_str[0] is "5" so the number of set bits is 5 */ ++ const char *ev_more_str[] = { "5", "EV_ABS", "EV_MSC", "EV_LED", "EV_SND", "EV_PWR" }; ++ ++ /* set less than 4 bits */ ++ unsigned long ev_less[] = { 1 << EV_ABS | 1 << EV_MSC | 1 << EV_LED }; ++ const char *ev_less_str[] = { "3", "EV_ABS", "EV_MSC", "EV_LED" }; ++ ++ /* set zero bit */ ++ unsigned long ev_zero[] = { 0x0 }; ++ const char *ev_zero_str[] = { "0", " 0 " }; ++ ++ /* KEY_MAX is 0x2ff which is greater than retval * 8 */ ++ unsigned long key[] = { 1 << KEY_1 | 1 << KEY_2, 0 }; ++ const char *key_str[] = { "2", "KEY_1", "KEY_2" }; ++ ++ struct { ++ struct evdev_check check; ++ void *ptr; ++ } a[] = { ++ { { ARG_STR(EVIOCGID), id, print_input_id }, NULL }, ++ { { ARG_STR(EVIOCGABS(ABS_X)), absinfo, print_input_absinfo }, NULL }, ++ { { ARG_STR(EVIOCGABS(ABS_Y)), absinfo, print_input_absinfo }, NULL }, ++ { { ARG_STR(EVIOCGABS(ABS_Y)), absinfo, print_input_absinfo }, NULL }, ++ { { ARG_STR(EVIOCGBIT(0, 0)), ev_more, print_getbit }, &ev_more_str }, ++ { { ARG_STR(EVIOCGBIT(0, 0)), ev_less, print_getbit }, &ev_less_str }, ++ { { ARG_STR(EVIOCGBIT(0, 0)), ev_zero, print_getbit }, &ev_zero_str }, ++ { { ARG_STR(EVIOCGBIT(EV_KEY, 0)), key, print_getbit }, &key_str}, ++# ifdef EVIOCGMTSLOTS ++ { { ARG_STR(EVIOCGMTSLOTS(12)), mtslots, print_mtslots }, &mtslots_str }, ++ { { ARG_STR(EVIOCGMTSLOTS(8)), invalid_mtslot, print_mtslots }, &invalid_mtslot_str } ++# endif ++ }; ++ for (unsigned int i = 0; i < ARRAY_SIZE(a); i++) { ++ test_evdev(&a[i].check, a[i].ptr); ++ } ++ ++ puts("+++ exited with 0 +++"); ++ return 0; ++} ++#else ++ ++SKIP_MAIN_UNDEFINED("HAVE_LINUX_INPUT_H") ++ ++#endif +Index: strace-4.24/tests-mx32/ioctl_evdev-success.c +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ strace-4.24/tests-mx32/ioctl_evdev-success.c 2019-08-01 18:40:47.367658558 +0200 +@@ -0,0 +1,232 @@ ++#include "tests.h" ++ ++#ifdef HAVE_LINUX_INPUT_H ++ ++# include ++# include ++# include ++# include ++# include ++# include "print_fields.h" ++ ++static const char *errstr; ++ ++struct evdev_check { ++ unsigned long cmd; ++ const char *cmd_str; ++ void *arg_ptr; ++ void (*print_arg)(long rc, void *ptr, void *arg); ++}; ++ ++static long ++invoke_test_syscall(unsigned long cmd, void *p) ++{ ++ long rc = ioctl(-1, cmd, p); ++ errstr = sprintrc(rc); ++ static char inj_errstr[4096]; ++ ++ snprintf(inj_errstr, sizeof(inj_errstr), "%s (INJECTED)", errstr); ++ errstr = inj_errstr; ++ return rc; ++} ++ ++static void ++test_evdev(struct evdev_check *check, void *arg) ++{ ++ long rc = invoke_test_syscall(check->cmd, check->arg_ptr); ++ printf("ioctl(-1, %s, ", check->cmd_str); ++ if (check->print_arg) ++ check->print_arg(rc, check->arg_ptr, arg); ++ else ++ printf("%p", check->arg_ptr); ++ printf(") = %s\n", errstr); ++} ++ ++static void ++print_input_absinfo(long rc, void *ptr, void *arg) ++{ ++ struct input_absinfo *absinfo = ptr; ++ ++ if (rc < 0) { ++ printf("%p", absinfo); ++ return; ++ } ++ PRINT_FIELD_U("{", *absinfo, value); ++ PRINT_FIELD_U(", ", *absinfo, minimum); ++# if VERBOSE ++ PRINT_FIELD_U(", ", *absinfo, maximum); ++ PRINT_FIELD_U(", ", *absinfo, fuzz); ++ PRINT_FIELD_U(", ", *absinfo, flat); ++# ifdef HAVE_STRUCT_INPUT_ABSINFO_RESOLUTION ++ PRINT_FIELD_U(", ", *absinfo, resolution); ++# endif ++# else ++ printf(", ..."); ++# endif ++ printf("}"); ++} ++ ++static void ++print_input_id(long rc, void *ptr, void *arg) ++{ ++ struct input_id *id = ptr; ++ ++ if (rc < 0) { ++ printf("%p", id); ++ return; ++ } ++ printf("{ID_BUS=%" PRIu16 ++ ", ID_VENDOR=%" PRIu16 ++ ", ID_PRODUCT=%" PRIu16 ++ ", ID_VERSION=%" PRIu16 "}", ++ id->bustype, id->vendor, id->product, id->version); ++} ++ ++# ifdef EVIOCGMTSLOTS ++static void ++print_mtslots(long rc, void *ptr, void *arg) ++{ ++ int *buffer = ptr; ++ const char **str = arg; ++ int num = atoi(*(str + 1)); ++ ++ if (rc < 0) { ++ printf("%p", buffer); ++ return; ++ } ++ ++ printf("{code=%s", *str); ++ printf(", values=["); ++ for (unsigned int i = 1; i <= (unsigned) num; i++) ++ printf("%s%s", i > 1 ? ", " : "", *(str + i + 1)); ++ printf("]}"); ++} ++# endif ++ ++static void ++print_getbit(long rc, void *ptr, void *arg) ++{ ++ const char **str = arg; ++ int num = atoi(*str); ++ ++ if (rc < 0) { ++ printf("%p", ptr); ++ return; ++ } ++ ++ printf("["); ++ printf("%s", *(str + 1)); ++ for (unsigned int i = 2; i <= (unsigned) num; i++) { ++# if ! VERBOSE ++ if (i > 4) { ++ printf(", ..."); ++ break; ++ } ++# endif ++ printf(", "); ++ printf("%s", *(str + i)); ++ } ++ printf("]"); ++} ++ ++int ++main(int argc, char **argv) ++{ ++ unsigned long num_skip; ++ long inject_retval; ++ bool locked = false; ++ ++ if (argc == 1) ++ return 0; ++ ++ if (argc < 3) ++ error_msg_and_fail("Usage: %s NUM_SKIP INJECT_RETVAL", argv[0]); ++ ++ num_skip = strtoul(argv[1], NULL, 0); ++ inject_retval = strtol(argv[2], NULL, 0); ++ ++ if (inject_retval < 0) ++ error_msg_and_fail("Expected non-negative INJECT_RETVAL, " ++ "but got %ld", inject_retval); ++ ++ for (unsigned int i = 0; i < num_skip; i++) { ++ long rc = ioctl(-1, EVIOCGID, NULL); ++ printf("ioctl(-1, EVIOCGID, NULL) = %s%s\n", ++ sprintrc(rc), ++ rc == inject_retval ? " (INJECTED)" : ""); ++ ++ if (rc != inject_retval) ++ continue; ++ ++ locked = true; ++ break; ++ } ++ ++ if (!locked) ++ error_msg_and_fail("Hasn't locked on ioctl(-1" ++ ", EVIOCGID, NULL) returning %lu", ++ inject_retval); ++ ++ TAIL_ALLOC_OBJECT_CONST_PTR(struct input_id, id); ++ TAIL_ALLOC_OBJECT_CONST_PTR(struct input_absinfo, absinfo); ++ TAIL_ALLOC_OBJECT_CONST_PTR(int, bad_addr_slot); ++# ifdef EVIOCGMTSLOTS ++ int mtslots[] = { ABS_MT_SLOT, 1, 3 }; ++ /* we use the second element to indicate the number of values */ ++ /* mtslots_str[1] is "2" so the number of values is 2 */ ++ const char *mtslots_str[] = { "ABS_MT_SLOT", "2", "1", "3" }; ++ ++ /* invalid flag */ ++ int invalid_mtslot[] = { -1, 1 }; ++ char invalid_str[4096]; ++ snprintf(invalid_str, sizeof(invalid_str), "%#x /* ABS_MT_??? */", invalid_mtslot[0]); ++ const char *invalid_mtslot_str[] = { invalid_str, "1", "1" }; ++# endif ++ ++ /* set more than 4 bits */ ++ unsigned long ev_more[] = { 1 << EV_ABS | 1 << EV_MSC | 1 << EV_LED | 1 << EV_SND | 1 << EV_PWR }; ++ /* we use the first element to indicate the number of set bits */ ++ /* ev_more_str[0] is "5" so the number of set bits is 5 */ ++ const char *ev_more_str[] = { "5", "EV_ABS", "EV_MSC", "EV_LED", "EV_SND", "EV_PWR" }; ++ ++ /* set less than 4 bits */ ++ unsigned long ev_less[] = { 1 << EV_ABS | 1 << EV_MSC | 1 << EV_LED }; ++ const char *ev_less_str[] = { "3", "EV_ABS", "EV_MSC", "EV_LED" }; ++ ++ /* set zero bit */ ++ unsigned long ev_zero[] = { 0x0 }; ++ const char *ev_zero_str[] = { "0", " 0 " }; ++ ++ /* KEY_MAX is 0x2ff which is greater than retval * 8 */ ++ unsigned long key[] = { 1 << KEY_1 | 1 << KEY_2, 0 }; ++ const char *key_str[] = { "2", "KEY_1", "KEY_2" }; ++ ++ struct { ++ struct evdev_check check; ++ void *ptr; ++ } a[] = { ++ { { ARG_STR(EVIOCGID), id, print_input_id }, NULL }, ++ { { ARG_STR(EVIOCGABS(ABS_X)), absinfo, print_input_absinfo }, NULL }, ++ { { ARG_STR(EVIOCGABS(ABS_Y)), absinfo, print_input_absinfo }, NULL }, ++ { { ARG_STR(EVIOCGABS(ABS_Y)), absinfo, print_input_absinfo }, NULL }, ++ { { ARG_STR(EVIOCGBIT(0, 0)), ev_more, print_getbit }, &ev_more_str }, ++ { { ARG_STR(EVIOCGBIT(0, 0)), ev_less, print_getbit }, &ev_less_str }, ++ { { ARG_STR(EVIOCGBIT(0, 0)), ev_zero, print_getbit }, &ev_zero_str }, ++ { { ARG_STR(EVIOCGBIT(EV_KEY, 0)), key, print_getbit }, &key_str}, ++# ifdef EVIOCGMTSLOTS ++ { { ARG_STR(EVIOCGMTSLOTS(12)), mtslots, print_mtslots }, &mtslots_str }, ++ { { ARG_STR(EVIOCGMTSLOTS(8)), invalid_mtslot, print_mtslots }, &invalid_mtslot_str } ++# endif ++ }; ++ for (unsigned int i = 0; i < ARRAY_SIZE(a); i++) { ++ test_evdev(&a[i].check, a[i].ptr); ++ } ++ ++ puts("+++ exited with 0 +++"); ++ return 0; ++} ++#else ++ ++SKIP_MAIN_UNDEFINED("HAVE_LINUX_INPUT_H") ++ ++#endif +Index: strace-4.24/tests/ioctl_evdev-success.test +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ strace-4.24/tests/ioctl_evdev-success.test 2019-08-01 18:40:58.009521546 +0200 +@@ -0,0 +1,13 @@ ++#!/bin/sh -efu ++ ++. "${srcdir=.}/scno_tampering.sh" ++ ++: ${IOCTL_INJECT_START=256} ++: ${IOCTL_INJECT_RETVAL=8} ++ ++run_prog ++run_strace -a16 -e trace=ioctl \ ++ -e inject=ioctl:retval="${IOCTL_INJECT_RETVAL}":when="${IOCTL_INJECT_START}+" \ ++ ../ioctl_evdev-success "${IOCTL_INJECT_START}" "${IOCTL_INJECT_RETVAL}"> "$EXP" ++grep -v '^ioctl([012][,<]' < "$LOG" > "$OUT" ++match_diff "$OUT" "$EXP" +Index: strace-4.24/tests-m32/ioctl_evdev-success.test +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ strace-4.24/tests-m32/ioctl_evdev-success.test 2019-08-01 18:40:58.009521546 +0200 +@@ -0,0 +1,13 @@ ++#!/bin/sh -efu ++ ++. "${srcdir=.}/scno_tampering.sh" ++ ++: ${IOCTL_INJECT_START=256} ++: ${IOCTL_INJECT_RETVAL=8} ++ ++run_prog ++run_strace -a16 -e trace=ioctl \ ++ -e inject=ioctl:retval="${IOCTL_INJECT_RETVAL}":when="${IOCTL_INJECT_START}+" \ ++ ../ioctl_evdev-success "${IOCTL_INJECT_START}" "${IOCTL_INJECT_RETVAL}"> "$EXP" ++grep -v '^ioctl([012][,<]' < "$LOG" > "$OUT" ++match_diff "$OUT" "$EXP" +Index: strace-4.24/tests-mx32/ioctl_evdev-success.test +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ strace-4.24/tests-mx32/ioctl_evdev-success.test 2019-08-01 18:40:58.009521546 +0200 +@@ -0,0 +1,13 @@ ++#!/bin/sh -efu ++ ++. "${srcdir=.}/scno_tampering.sh" ++ ++: ${IOCTL_INJECT_START=256} ++: ${IOCTL_INJECT_RETVAL=8} ++ ++run_prog ++run_strace -a16 -e trace=ioctl \ ++ -e inject=ioctl:retval="${IOCTL_INJECT_RETVAL}":when="${IOCTL_INJECT_START}+" \ ++ ../ioctl_evdev-success "${IOCTL_INJECT_START}" "${IOCTL_INJECT_RETVAL}"> "$EXP" ++grep -v '^ioctl([012][,<]' < "$LOG" > "$OUT" ++match_diff "$OUT" "$EXP" +Index: strace-4.24/tests/Makefile.in +=================================================================== +--- strace-4.24.orig/tests/Makefile.in 2019-08-01 18:40:47.308659317 +0200 ++++ strace-4.24/tests/Makefile.in 2019-08-01 19:16:24.800947844 +0200 +@@ -150,7 +150,8 @@ + filter-unavailable$(EXEEXT) fork-f$(EXEEXT) fsync-y$(EXEEXT) \ + getpid$(EXEEXT) getppid$(EXEEXT) gettid$(EXEEXT) \ + inject-nf$(EXEEXT) int_0x80$(EXEEXT) ioctl_dm-v$(EXEEXT) \ +- ioctl_evdev-v$(EXEEXT) ioctl_loop-nv$(EXEEXT) \ ++ ioctl_evdev-v$(EXEEXT) ioctl_evdev-success$(EXEEXT) \ ++ ioctl_evdev-success-v$(EXEEXT) ioctl_loop-nv$(EXEEXT) \ + ioctl_loop-v$(EXEEXT) ioctl_nsfs$(EXEEXT) \ + ioctl_perf-success$(EXEEXT) ioctl_rtc-v$(EXEEXT) \ + is_linux_mips_n64$(EXEEXT) kill_child$(EXEEXT) \ +@@ -974,6 +975,14 @@ + ioctl_evdev_OBJECTS = ioctl_evdev.$(OBJEXT) + ioctl_evdev_LDADD = $(LDADD) + ioctl_evdev_DEPENDENCIES = libtests.a ++ioctl_evdev_success_SOURCES = ioctl_evdev-success.c ++ioctl_evdev_success_OBJECTS = ioctl_evdev-success.$(OBJEXT) ++ioctl_evdev_success_LDADD = $(LDADD) ++ioctl_evdev_success_DEPENDENCIES = libtests.a ++ioctl_evdev_success_v_SOURCES = ioctl_evdev-success-v.c ++ioctl_evdev_success_v_OBJECTS = ioctl_evdev-success-v.$(OBJEXT) ++ioctl_evdev_success_v_LDADD = $(LDADD) ++ioctl_evdev_success_v_DEPENDENCIES = libtests.a + ioctl_evdev_v_SOURCES = ioctl_evdev-v.c + ioctl_evdev_v_OBJECTS = ioctl_evdev-v.$(OBJEXT) + ioctl_evdev_v_LDADD = $(LDADD) +@@ -2740,11 +2749,12 @@ + getuid.c getuid32.c getxxid.c group_req.c inet-cmsg.c \ + init_module.c inject-nf.c inotify.c inotify_init1.c int_0x80.c \ + ioctl.c ioctl_block.c ioctl_dm.c ioctl_dm-v.c ioctl_evdev.c \ +- ioctl_evdev-v.c ioctl_inotify.c ioctl_kvm_run.c \ +- ioctl_kvm_run-v.c ioctl_kvm_run_auxstr_vcpu.c ioctl_loop.c \ +- ioctl_loop-nv.c ioctl_loop-v.c ioctl_mtd.c ioctl_nsfs.c \ +- ioctl_perf.c ioctl_perf-success.c ioctl_ptp.c ioctl_rtc.c \ +- ioctl_rtc-v.c ioctl_scsi.c ioctl_sg_io_v3.c ioctl_sg_io_v4.c \ ++ ioctl_evdev-success.c ioctl_evdev-success-v.c ioctl_evdev-v.c \ ++ ioctl_inotify.c ioctl_kvm_run.c ioctl_kvm_run-v.c \ ++ ioctl_kvm_run_auxstr_vcpu.c ioctl_loop.c ioctl_loop-nv.c \ ++ ioctl_loop-v.c ioctl_mtd.c ioctl_nsfs.c ioctl_perf.c \ ++ ioctl_perf-success.c ioctl_ptp.c ioctl_rtc.c ioctl_rtc-v.c \ ++ ioctl_scsi.c ioctl_sg_io_v3.c ioctl_sg_io_v4.c \ + ioctl_sock_gifconf.c ioctl_uffdio.c ioctl_v4l2.c ioperm.c \ + iopl.c ioprio.c ip_mreq.c ipc.c ipc_msg.c ipc_msg-Xabbrev.c \ + ipc_msg-Xraw.c ipc_msg-Xverbose.c ipc_msgbuf.c \ +@@ -2887,11 +2897,12 @@ + getuid.c getuid32.c getxxid.c group_req.c inet-cmsg.c \ + init_module.c inject-nf.c inotify.c inotify_init1.c int_0x80.c \ + ioctl.c ioctl_block.c ioctl_dm.c ioctl_dm-v.c ioctl_evdev.c \ +- ioctl_evdev-v.c ioctl_inotify.c ioctl_kvm_run.c \ +- ioctl_kvm_run-v.c ioctl_kvm_run_auxstr_vcpu.c ioctl_loop.c \ +- ioctl_loop-nv.c ioctl_loop-v.c ioctl_mtd.c ioctl_nsfs.c \ +- ioctl_perf.c ioctl_perf-success.c ioctl_ptp.c ioctl_rtc.c \ +- ioctl_rtc-v.c ioctl_scsi.c ioctl_sg_io_v3.c ioctl_sg_io_v4.c \ ++ ioctl_evdev-success.c ioctl_evdev-success-v.c ioctl_evdev-v.c \ ++ ioctl_inotify.c ioctl_kvm_run.c ioctl_kvm_run-v.c \ ++ ioctl_kvm_run_auxstr_vcpu.c ioctl_loop.c ioctl_loop-nv.c \ ++ ioctl_loop-v.c ioctl_mtd.c ioctl_nsfs.c ioctl_perf.c \ ++ ioctl_perf-success.c ioctl_ptp.c ioctl_rtc.c ioctl_rtc-v.c \ ++ ioctl_scsi.c ioctl_sg_io_v3.c ioctl_sg_io_v4.c \ + ioctl_sock_gifconf.c ioctl_uffdio.c ioctl_v4l2.c ioperm.c \ + iopl.c ioprio.c ip_mreq.c ipc.c ipc_msg.c ipc_msg-Xabbrev.c \ + ipc_msg-Xraw.c ipc_msg-Xverbose.c ipc_msgbuf.c \ +@@ -4173,6 +4184,8 @@ + futex.test \ + getuid.test \ + ioctl.test \ ++ ioctl_evdev-success.test \ ++ ioctl_evdev-success-v.test \ + ioctl_perf-success.test \ + ipc_msgbuf.test \ + kern_features-fault.test \ +@@ -4998,6 +5011,14 @@ + @rm -f ioctl_evdev$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(ioctl_evdev_OBJECTS) $(ioctl_evdev_LDADD) $(LIBS) + ++ioctl_evdev-success$(EXEEXT): $(ioctl_evdev_success_OBJECTS) $(ioctl_evdev_success_DEPENDENCIES) $(EXTRA_ioctl_evdev_success_DEPENDENCIES) ++ @rm -f ioctl_evdev-success$(EXEEXT) ++ $(AM_V_CCLD)$(LINK) $(ioctl_evdev_success_OBJECTS) $(ioctl_evdev_success_LDADD) $(LIBS) ++ ++ioctl_evdev-success-v$(EXEEXT): $(ioctl_evdev_success_v_OBJECTS) $(ioctl_evdev_success_v_DEPENDENCIES) $(EXTRA_ioctl_evdev_success_v_DEPENDENCIES) ++ @rm -f ioctl_evdev-success-v$(EXEEXT) ++ $(AM_V_CCLD)$(LINK) $(ioctl_evdev_success_v_OBJECTS) $(ioctl_evdev_success_v_LDADD) $(LIBS) ++ + ioctl_evdev-v$(EXEEXT): $(ioctl_evdev_v_OBJECTS) $(ioctl_evdev_v_DEPENDENCIES) $(EXTRA_ioctl_evdev_v_DEPENDENCIES) + @rm -f ioctl_evdev-v$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(ioctl_evdev_v_OBJECTS) $(ioctl_evdev_v_LDADD) $(LIBS) +@@ -6833,6 +6854,8 @@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ioctl_block.Po@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ioctl_dm-v.Po@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ioctl_dm.Po@am__quote@ ++@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ioctl_evdev-success-v.Po@am__quote@ ++@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ioctl_evdev-success.Po@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ioctl_evdev-v.Po@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ioctl_evdev.Po@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ioctl_inotify.Po@am__quote@ diff --git a/SOURCES/0033-tests-test-evdev-bitset-decoding-more-thoroughly.patch b/SOURCES/0033-tests-test-evdev-bitset-decoding-more-thoroughly.patch new file mode 100644 index 0000000..e2abf52 --- /dev/null +++ b/SOURCES/0033-tests-test-evdev-bitset-decoding-more-thoroughly.patch @@ -0,0 +1,795 @@ +From cdd8206af74fcb961f0179e21eacf5d55d23f0ac Mon Sep 17 00:00:00 2001 +From: Eugene Syromyatnikov +Date: Fri, 12 Jul 2019 14:31:44 +0200 +Subject: [PATCH 3/3] tests: test evdev bitset decoding more thoroughly + +* tests/ioctl_evdev-success-v.test: Inject various values. +* tests/ioctl_evdev-success.test: Likewise. +* tests/ioctl_evdev-success.c (NUM_WORDS): New macro. +(struct evdev_check): Constify arg_ptr and print_arg args. +(invoke_test_syscall, test_evdev, print_input_absinfo, print_input_id, +print_mtslots): Add const qualifiers. +(print_getbit): Add const qualifiers, rewrite to expect trailing NULL +in the string array instead of leading string count. +(main): Set size for ev_more, ev_less, ev_zero arrays; replace leading +count element in ev_more_str, ev_less_str, ev_zero_str with trailing +NULL; replace ev_more_str and ev_less_str with ev_more_str_2/ev_less_str_2 +and ev_more_str_3/ev_less_str_3 that differ by presence of flags that reside +beyond first two bytes; add static and const qualifiers where possible; +add key/key_sts_8/key_str_16 values; update a to provide either ev_more_str_2 +or ev_more_str_3 and either key_str_8 or key_str_16 depending on inject_retval +value. +--- + tests/ioctl_evdev-success-v.test | 15 +++--- + tests/ioctl_evdev-success.c | 100 ++++++++++++++++++++++++++------------- + tests/ioctl_evdev-success.test | 15 +++--- + 3 files changed, 84 insertions(+), 46 deletions(-) + +Index: strace-4.24/tests/ioctl_evdev-success-v.test +=================================================================== +--- strace-4.24.orig/tests/ioctl_evdev-success-v.test 2019-08-01 18:40:58.009521546 +0200 ++++ strace-4.24/tests/ioctl_evdev-success-v.test 2019-08-01 19:21:32.297062218 +0200 +@@ -3,11 +3,14 @@ + . "${srcdir=.}/scno_tampering.sh" + + : ${IOCTL_INJECT_START=256} +-: ${IOCTL_INJECT_RETVAL=8} + + run_prog +-run_strace -a16 -v -e trace=ioctl \ +- -e inject=ioctl:retval="${IOCTL_INJECT_RETVAL}":when="${IOCTL_INJECT_START}+" \ +- ../ioctl_evdev-success-v "${IOCTL_INJECT_START}" "${IOCTL_INJECT_RETVAL}"> "$EXP" +-grep -v '^ioctl([012][,<]' < "$LOG" > "$OUT" +-match_diff "$OUT" "$EXP" ++ ++for ret in 0 2 8 15 16; do ++ run_strace -a16 -v -e trace=ioctl \ ++ -e inject=ioctl:retval="${ret}":when="${IOCTL_INJECT_START}+" \ ++ ../ioctl_evdev-success-v \ ++ "${IOCTL_INJECT_START}" "${ret}"> "$EXP.$ret" ++ grep -v '^ioctl([012][,<]' < "$LOG" > "$OUT.$ret" ++ match_diff "$OUT.$ret" "$EXP.$ret" ++done +Index: strace-4.24/tests/ioctl_evdev-success.c +=================================================================== +--- strace-4.24.orig/tests/ioctl_evdev-success.c 2019-08-01 18:40:58.009521546 +0200 ++++ strace-4.24/tests/ioctl_evdev-success.c 2019-08-01 19:21:32.297062218 +0200 +@@ -2,6 +2,7 @@ + + #ifdef HAVE_LINUX_INPUT_H + ++# include + # include + # include + # include +@@ -9,17 +10,19 @@ + # include + # include "print_fields.h" + ++# define NUM_WORDS 4 ++ + static const char *errstr; + + struct evdev_check { + unsigned long cmd; + const char *cmd_str; +- void *arg_ptr; +- void (*print_arg)(long rc, void *ptr, void *arg); ++ const void *arg_ptr; ++ void (*print_arg)(long rc, const void *ptr, const void *arg); + }; + + static long +-invoke_test_syscall(unsigned long cmd, void *p) ++invoke_test_syscall(unsigned long cmd, const void *p) + { + long rc = ioctl(-1, cmd, p); + errstr = sprintrc(rc); +@@ -31,7 +34,7 @@ + } + + static void +-test_evdev(struct evdev_check *check, void *arg) ++test_evdev(struct evdev_check *check, const void *arg) + { + long rc = invoke_test_syscall(check->cmd, check->arg_ptr); + printf("ioctl(-1, %s, ", check->cmd_str); +@@ -43,9 +46,9 @@ + } + + static void +-print_input_absinfo(long rc, void *ptr, void *arg) ++print_input_absinfo(long rc, const void *ptr, const void *arg) + { +- struct input_absinfo *absinfo = ptr; ++ const struct input_absinfo *absinfo = ptr; + + if (rc < 0) { + printf("%p", absinfo); +@@ -67,9 +70,9 @@ + } + + static void +-print_input_id(long rc, void *ptr, void *arg) ++print_input_id(long rc, const void *ptr, const void *arg) + { +- struct input_id *id = ptr; ++ const struct input_id *id = ptr; + + if (rc < 0) { + printf("%p", id); +@@ -84,10 +87,10 @@ + + # ifdef EVIOCGMTSLOTS + static void +-print_mtslots(long rc, void *ptr, void *arg) ++print_mtslots(long rc, const void *ptr, const void *arg) + { +- int *buffer = ptr; +- const char **str = arg; ++ const int *buffer = ptr; ++ const char * const * str = arg; + int num = atoi(*(str + 1)); + + if (rc < 0) { +@@ -104,27 +107,26 @@ + # endif + + static void +-print_getbit(long rc, void *ptr, void *arg) ++print_getbit(long rc, const void *ptr, const void *arg) + { +- const char **str = arg; +- int num = atoi(*str); ++ const char * const *str = arg; + +- if (rc < 0) { ++ if (rc <= 0) { + printf("%p", ptr); + return; + } + + printf("["); +- printf("%s", *(str + 1)); +- for (unsigned int i = 2; i <= (unsigned) num; i++) { ++ for (unsigned long i = 0; str[i]; i++) { + # if ! VERBOSE +- if (i > 4) { ++ if (i >= 4) { + printf(", ..."); + break; + } + # endif +- printf(", "); +- printf("%s", *(str + i)); ++ if (i) ++ printf(", "); ++ printf("%s", str[i]); + } + printf("]"); + } +@@ -170,6 +172,7 @@ + TAIL_ALLOC_OBJECT_CONST_PTR(struct input_id, id); + TAIL_ALLOC_OBJECT_CONST_PTR(struct input_absinfo, absinfo); + TAIL_ALLOC_OBJECT_CONST_PTR(int, bad_addr_slot); ++ + # ifdef EVIOCGMTSLOTS + int mtslots[] = { ABS_MT_SLOT, 1, 3 }; + /* we use the second element to indicate the number of values */ +@@ -183,36 +186,65 @@ + const char *invalid_mtslot_str[] = { invalid_str, "1", "1" }; + # endif + ++ enum { ULONG_BIT = sizeof(unsigned long) * 8 }; ++ + /* set more than 4 bits */ +- unsigned long ev_more[] = { 1 << EV_ABS | 1 << EV_MSC | 1 << EV_LED | 1 << EV_SND | 1 << EV_PWR }; +- /* we use the first element to indicate the number of set bits */ +- /* ev_more_str[0] is "5" so the number of set bits is 5 */ +- const char *ev_more_str[] = { "5", "EV_ABS", "EV_MSC", "EV_LED", "EV_SND", "EV_PWR" }; ++ static const unsigned long ev_more[NUM_WORDS] = { ++ 1 << EV_ABS | 1 << EV_MSC | 1 << EV_LED | 1 << EV_SND ++ | 1 << EV_PWR }; ++ static const char * const ev_more_str_2[] = { ++ "EV_ABS", "EV_MSC", NULL }; ++ static const char * const ev_more_str_3[] = { ++ "EV_ABS", "EV_MSC", "EV_LED", "EV_SND", "EV_PWR", NULL }; + + /* set less than 4 bits */ +- unsigned long ev_less[] = { 1 << EV_ABS | 1 << EV_MSC | 1 << EV_LED }; +- const char *ev_less_str[] = { "3", "EV_ABS", "EV_MSC", "EV_LED" }; ++ static const unsigned long ev_less[NUM_WORDS] = { ++ 1 << EV_ABS | 1 << EV_MSC | 1 << EV_LED }; ++ static const char * const ev_less_str_2[] = { ++ "EV_ABS", "EV_MSC", NULL }; ++ static const char * const ev_less_str_3[] = { ++ "EV_ABS", "EV_MSC", "EV_LED", NULL }; + + /* set zero bit */ +- unsigned long ev_zero[] = { 0x0 }; +- const char *ev_zero_str[] = { "0", " 0 " }; ++ static const unsigned long ev_zero[NUM_WORDS] = { 0x0 }; ++ static const char * const ev_zero_str[] = { " 0 ", NULL }; + + /* KEY_MAX is 0x2ff which is greater than retval * 8 */ +- unsigned long key[] = { 1 << KEY_1 | 1 << KEY_2, 0 }; +- const char *key_str[] = { "2", "KEY_1", "KEY_2" }; ++ static const unsigned long key[NUM_WORDS] = { ++ 1 << KEY_1 | 1 << KEY_2, ++ [ KEY_F12 / ULONG_BIT ] = 1 << (KEY_F12 % ULONG_BIT) }; ++ ++ static const char * const key_str_8[] = { ++ "KEY_1", "KEY_2", NULL }; ++ static const char * const key_str_16[] = { ++ "KEY_1", "KEY_2", "KEY_F12", NULL }; ++ ++ assert(sizeof(ev_more) >= (unsigned long) inject_retval); ++ assert(sizeof(ev_less) >= (unsigned long) inject_retval); ++ assert(sizeof(ev_zero) >= (unsigned long) inject_retval); ++ assert(sizeof(key) >= (unsigned long) inject_retval); + + struct { + struct evdev_check check; +- void *ptr; ++ const void *ptr; + } a[] = { + { { ARG_STR(EVIOCGID), id, print_input_id }, NULL }, + { { ARG_STR(EVIOCGABS(ABS_X)), absinfo, print_input_absinfo }, NULL }, + { { ARG_STR(EVIOCGABS(ABS_Y)), absinfo, print_input_absinfo }, NULL }, + { { ARG_STR(EVIOCGABS(ABS_Y)), absinfo, print_input_absinfo }, NULL }, +- { { ARG_STR(EVIOCGBIT(0, 0)), ev_more, print_getbit }, &ev_more_str }, +- { { ARG_STR(EVIOCGBIT(0, 0)), ev_less, print_getbit }, &ev_less_str }, ++ { { ARG_STR(EVIOCGBIT(0, 0)), ev_more, print_getbit }, ++ inject_retval * 8 <= EV_LED ++ ? (const void *) &ev_more_str_2 ++ : (const void *) &ev_more_str_3 }, ++ { { ARG_STR(EVIOCGBIT(0, 0)), ev_less, print_getbit }, ++ inject_retval * 8 <= EV_LED ++ ? (const void *) &ev_less_str_2 ++ : (const void *) &ev_less_str_3 }, + { { ARG_STR(EVIOCGBIT(0, 0)), ev_zero, print_getbit }, &ev_zero_str }, +- { { ARG_STR(EVIOCGBIT(EV_KEY, 0)), key, print_getbit }, &key_str}, ++ { { ARG_STR(EVIOCGBIT(EV_KEY, 0)), key, print_getbit }, ++ inject_retval * 8 <= KEY_F12 ++ ? (const void *) &key_str_8 ++ : (const void *) &key_str_16 }, + # ifdef EVIOCGMTSLOTS + { { ARG_STR(EVIOCGMTSLOTS(12)), mtslots, print_mtslots }, &mtslots_str }, + { { ARG_STR(EVIOCGMTSLOTS(8)), invalid_mtslot, print_mtslots }, &invalid_mtslot_str } +Index: strace-4.24/tests/ioctl_evdev-success.test +=================================================================== +--- strace-4.24.orig/tests/ioctl_evdev-success.test 2019-08-01 18:40:58.009521546 +0200 ++++ strace-4.24/tests/ioctl_evdev-success.test 2019-08-01 19:21:32.298062205 +0200 +@@ -3,11 +3,14 @@ + . "${srcdir=.}/scno_tampering.sh" + + : ${IOCTL_INJECT_START=256} +-: ${IOCTL_INJECT_RETVAL=8} + + run_prog +-run_strace -a16 -e trace=ioctl \ +- -e inject=ioctl:retval="${IOCTL_INJECT_RETVAL}":when="${IOCTL_INJECT_START}+" \ +- ../ioctl_evdev-success "${IOCTL_INJECT_START}" "${IOCTL_INJECT_RETVAL}"> "$EXP" +-grep -v '^ioctl([012][,<]' < "$LOG" > "$OUT" +-match_diff "$OUT" "$EXP" ++ ++for ret in 0 2 8 15 16; do ++ run_strace -a16 -e trace=ioctl \ ++ -e inject=ioctl:retval="${ret}":when="${IOCTL_INJECT_START}+" \ ++ ../ioctl_evdev-success \ ++ "${IOCTL_INJECT_START}" "${ret}"> "$EXP.${ret}" ++ grep -v '^ioctl([012][,<]' < "$LOG" > "$OUT.$ret" ++ match_diff "$OUT.$ret" "$EXP.$ret" ++done +Index: strace-4.24/tests-m32/ioctl_evdev-success-v.test +=================================================================== +--- strace-4.24.orig/tests-m32/ioctl_evdev-success-v.test 2019-08-01 18:40:58.009521546 +0200 ++++ strace-4.24/tests-m32/ioctl_evdev-success-v.test 2019-08-01 19:21:32.298062205 +0200 +@@ -3,11 +3,14 @@ + . "${srcdir=.}/scno_tampering.sh" + + : ${IOCTL_INJECT_START=256} +-: ${IOCTL_INJECT_RETVAL=8} + + run_prog +-run_strace -a16 -v -e trace=ioctl \ +- -e inject=ioctl:retval="${IOCTL_INJECT_RETVAL}":when="${IOCTL_INJECT_START}+" \ +- ../ioctl_evdev-success-v "${IOCTL_INJECT_START}" "${IOCTL_INJECT_RETVAL}"> "$EXP" +-grep -v '^ioctl([012][,<]' < "$LOG" > "$OUT" +-match_diff "$OUT" "$EXP" ++ ++for ret in 0 2 8 15 16; do ++ run_strace -a16 -v -e trace=ioctl \ ++ -e inject=ioctl:retval="${ret}":when="${IOCTL_INJECT_START}+" \ ++ ../ioctl_evdev-success-v \ ++ "${IOCTL_INJECT_START}" "${ret}"> "$EXP.$ret" ++ grep -v '^ioctl([012][,<]' < "$LOG" > "$OUT.$ret" ++ match_diff "$OUT.$ret" "$EXP.$ret" ++done +Index: strace-4.24/tests-m32/ioctl_evdev-success.test +=================================================================== +--- strace-4.24.orig/tests-m32/ioctl_evdev-success.test 2019-08-01 18:40:58.009521546 +0200 ++++ strace-4.24/tests-m32/ioctl_evdev-success.test 2019-08-01 19:21:32.298062205 +0200 +@@ -3,11 +3,14 @@ + . "${srcdir=.}/scno_tampering.sh" + + : ${IOCTL_INJECT_START=256} +-: ${IOCTL_INJECT_RETVAL=8} + + run_prog +-run_strace -a16 -e trace=ioctl \ +- -e inject=ioctl:retval="${IOCTL_INJECT_RETVAL}":when="${IOCTL_INJECT_START}+" \ +- ../ioctl_evdev-success "${IOCTL_INJECT_START}" "${IOCTL_INJECT_RETVAL}"> "$EXP" +-grep -v '^ioctl([012][,<]' < "$LOG" > "$OUT" +-match_diff "$OUT" "$EXP" ++ ++for ret in 0 2 8 15 16; do ++ run_strace -a16 -e trace=ioctl \ ++ -e inject=ioctl:retval="${ret}":when="${IOCTL_INJECT_START}+" \ ++ ../ioctl_evdev-success \ ++ "${IOCTL_INJECT_START}" "${ret}"> "$EXP.${ret}" ++ grep -v '^ioctl([012][,<]' < "$LOG" > "$OUT.$ret" ++ match_diff "$OUT.$ret" "$EXP.$ret" ++done +Index: strace-4.24/tests-mx32/ioctl_evdev-success-v.test +=================================================================== +--- strace-4.24.orig/tests-mx32/ioctl_evdev-success-v.test 2019-08-01 18:40:58.009521546 +0200 ++++ strace-4.24/tests-mx32/ioctl_evdev-success-v.test 2019-08-01 19:21:32.298062205 +0200 +@@ -3,11 +3,14 @@ + . "${srcdir=.}/scno_tampering.sh" + + : ${IOCTL_INJECT_START=256} +-: ${IOCTL_INJECT_RETVAL=8} + + run_prog +-run_strace -a16 -v -e trace=ioctl \ +- -e inject=ioctl:retval="${IOCTL_INJECT_RETVAL}":when="${IOCTL_INJECT_START}+" \ +- ../ioctl_evdev-success-v "${IOCTL_INJECT_START}" "${IOCTL_INJECT_RETVAL}"> "$EXP" +-grep -v '^ioctl([012][,<]' < "$LOG" > "$OUT" +-match_diff "$OUT" "$EXP" ++ ++for ret in 0 2 8 15 16; do ++ run_strace -a16 -v -e trace=ioctl \ ++ -e inject=ioctl:retval="${ret}":when="${IOCTL_INJECT_START}+" \ ++ ../ioctl_evdev-success-v \ ++ "${IOCTL_INJECT_START}" "${ret}"> "$EXP.$ret" ++ grep -v '^ioctl([012][,<]' < "$LOG" > "$OUT.$ret" ++ match_diff "$OUT.$ret" "$EXP.$ret" ++done +Index: strace-4.24/tests-mx32/ioctl_evdev-success.test +=================================================================== +--- strace-4.24.orig/tests-mx32/ioctl_evdev-success.test 2019-08-01 18:40:58.009521546 +0200 ++++ strace-4.24/tests-mx32/ioctl_evdev-success.test 2019-08-01 19:21:32.299062192 +0200 +@@ -3,11 +3,14 @@ + . "${srcdir=.}/scno_tampering.sh" + + : ${IOCTL_INJECT_START=256} +-: ${IOCTL_INJECT_RETVAL=8} + + run_prog +-run_strace -a16 -e trace=ioctl \ +- -e inject=ioctl:retval="${IOCTL_INJECT_RETVAL}":when="${IOCTL_INJECT_START}+" \ +- ../ioctl_evdev-success "${IOCTL_INJECT_START}" "${IOCTL_INJECT_RETVAL}"> "$EXP" +-grep -v '^ioctl([012][,<]' < "$LOG" > "$OUT" +-match_diff "$OUT" "$EXP" ++ ++for ret in 0 2 8 15 16; do ++ run_strace -a16 -e trace=ioctl \ ++ -e inject=ioctl:retval="${ret}":when="${IOCTL_INJECT_START}+" \ ++ ../ioctl_evdev-success \ ++ "${IOCTL_INJECT_START}" "${ret}"> "$EXP.${ret}" ++ grep -v '^ioctl([012][,<]' < "$LOG" > "$OUT.$ret" ++ match_diff "$OUT.$ret" "$EXP.$ret" ++done +Index: strace-4.24/tests-m32/ioctl_evdev-success.c +=================================================================== +--- strace-4.24.orig/tests-m32/ioctl_evdev-success.c 2019-08-01 18:40:58.009521546 +0200 ++++ strace-4.24/tests-m32/ioctl_evdev-success.c 2019-08-29 12:09:27.898700830 +0200 +@@ -2,6 +2,7 @@ + + #ifdef HAVE_LINUX_INPUT_H + ++# include + # include + # include + # include +@@ -9,17 +10,19 @@ + # include + # include "print_fields.h" + ++# define NUM_WORDS 4 ++ + static const char *errstr; + + struct evdev_check { + unsigned long cmd; + const char *cmd_str; +- void *arg_ptr; +- void (*print_arg)(long rc, void *ptr, void *arg); ++ const void *arg_ptr; ++ void (*print_arg)(long rc, const void *ptr, const void *arg); + }; + + static long +-invoke_test_syscall(unsigned long cmd, void *p) ++invoke_test_syscall(unsigned long cmd, const void *p) + { + long rc = ioctl(-1, cmd, p); + errstr = sprintrc(rc); +@@ -31,7 +34,7 @@ + } + + static void +-test_evdev(struct evdev_check *check, void *arg) ++test_evdev(struct evdev_check *check, const void *arg) + { + long rc = invoke_test_syscall(check->cmd, check->arg_ptr); + printf("ioctl(-1, %s, ", check->cmd_str); +@@ -43,9 +46,9 @@ + } + + static void +-print_input_absinfo(long rc, void *ptr, void *arg) ++print_input_absinfo(long rc, const void *ptr, const void *arg) + { +- struct input_absinfo *absinfo = ptr; ++ const struct input_absinfo *absinfo = ptr; + + if (rc < 0) { + printf("%p", absinfo); +@@ -67,9 +70,9 @@ + } + + static void +-print_input_id(long rc, void *ptr, void *arg) ++print_input_id(long rc, const void *ptr, const void *arg) + { +- struct input_id *id = ptr; ++ const struct input_id *id = ptr; + + if (rc < 0) { + printf("%p", id); +@@ -84,10 +87,10 @@ + + # ifdef EVIOCGMTSLOTS + static void +-print_mtslots(long rc, void *ptr, void *arg) ++print_mtslots(long rc, const void *ptr, const void *arg) + { +- int *buffer = ptr; +- const char **str = arg; ++ const int *buffer = ptr; ++ const char * const * str = arg; + int num = atoi(*(str + 1)); + + if (rc < 0) { +@@ -104,27 +107,26 @@ + # endif + + static void +-print_getbit(long rc, void *ptr, void *arg) ++print_getbit(long rc, const void *ptr, const void *arg) + { +- const char **str = arg; +- int num = atoi(*str); ++ const char * const *str = arg; + +- if (rc < 0) { ++ if (rc <= 0) { + printf("%p", ptr); + return; + } + + printf("["); +- printf("%s", *(str + 1)); +- for (unsigned int i = 2; i <= (unsigned) num; i++) { ++ for (unsigned long i = 0; str[i]; i++) { + # if ! VERBOSE +- if (i > 4) { ++ if (i >= 4) { + printf(", ..."); + break; + } + # endif +- printf(", "); +- printf("%s", *(str + i)); ++ if (i) ++ printf(", "); ++ printf("%s", str[i]); + } + printf("]"); + } +@@ -170,6 +172,7 @@ + TAIL_ALLOC_OBJECT_CONST_PTR(struct input_id, id); + TAIL_ALLOC_OBJECT_CONST_PTR(struct input_absinfo, absinfo); + TAIL_ALLOC_OBJECT_CONST_PTR(int, bad_addr_slot); ++ + # ifdef EVIOCGMTSLOTS + int mtslots[] = { ABS_MT_SLOT, 1, 3 }; + /* we use the second element to indicate the number of values */ +@@ -183,36 +186,65 @@ + const char *invalid_mtslot_str[] = { invalid_str, "1", "1" }; + # endif + ++ enum { ULONG_BIT = sizeof(unsigned long) * 8 }; ++ + /* set more than 4 bits */ +- unsigned long ev_more[] = { 1 << EV_ABS | 1 << EV_MSC | 1 << EV_LED | 1 << EV_SND | 1 << EV_PWR }; +- /* we use the first element to indicate the number of set bits */ +- /* ev_more_str[0] is "5" so the number of set bits is 5 */ +- const char *ev_more_str[] = { "5", "EV_ABS", "EV_MSC", "EV_LED", "EV_SND", "EV_PWR" }; ++ static const unsigned long ev_more[NUM_WORDS] = { ++ 1 << EV_ABS | 1 << EV_MSC | 1 << EV_LED | 1 << EV_SND ++ | 1 << EV_PWR }; ++ static const char * const ev_more_str_2[] = { ++ "EV_ABS", "EV_MSC", NULL }; ++ static const char * const ev_more_str_3[] = { ++ "EV_ABS", "EV_MSC", "EV_LED", "EV_SND", "EV_PWR", NULL }; + + /* set less than 4 bits */ +- unsigned long ev_less[] = { 1 << EV_ABS | 1 << EV_MSC | 1 << EV_LED }; +- const char *ev_less_str[] = { "3", "EV_ABS", "EV_MSC", "EV_LED" }; ++ static const unsigned long ev_less[NUM_WORDS] = { ++ 1 << EV_ABS | 1 << EV_MSC | 1 << EV_LED }; ++ static const char * const ev_less_str_2[] = { ++ "EV_ABS", "EV_MSC", NULL }; ++ static const char * const ev_less_str_3[] = { ++ "EV_ABS", "EV_MSC", "EV_LED", NULL }; + + /* set zero bit */ +- unsigned long ev_zero[] = { 0x0 }; +- const char *ev_zero_str[] = { "0", " 0 " }; ++ static const unsigned long ev_zero[NUM_WORDS] = { 0x0 }; ++ static const char * const ev_zero_str[] = { " 0 ", NULL }; + + /* KEY_MAX is 0x2ff which is greater than retval * 8 */ +- unsigned long key[] = { 1 << KEY_1 | 1 << KEY_2, 0 }; +- const char *key_str[] = { "2", "KEY_1", "KEY_2" }; ++ static const unsigned long key[NUM_WORDS] = { ++ 1 << KEY_1 | 1 << KEY_2, ++ [ KEY_F12 / ULONG_BIT ] = 1 << (KEY_F12 % ULONG_BIT) }; ++ ++ static const char * const key_str_8[] = { ++ "KEY_1", "KEY_2", NULL }; ++ static const char * const key_str_16[] = { ++ "KEY_1", "KEY_2", "KEY_F12", NULL }; ++ ++ assert(sizeof(ev_more) >= (unsigned long) inject_retval); ++ assert(sizeof(ev_less) >= (unsigned long) inject_retval); ++ assert(sizeof(ev_zero) >= (unsigned long) inject_retval); ++ assert(sizeof(key) >= (unsigned long) inject_retval); + + struct { + struct evdev_check check; +- void *ptr; ++ const void *ptr; + } a[] = { + { { ARG_STR(EVIOCGID), id, print_input_id }, NULL }, + { { ARG_STR(EVIOCGABS(ABS_X)), absinfo, print_input_absinfo }, NULL }, + { { ARG_STR(EVIOCGABS(ABS_Y)), absinfo, print_input_absinfo }, NULL }, + { { ARG_STR(EVIOCGABS(ABS_Y)), absinfo, print_input_absinfo }, NULL }, +- { { ARG_STR(EVIOCGBIT(0, 0)), ev_more, print_getbit }, &ev_more_str }, +- { { ARG_STR(EVIOCGBIT(0, 0)), ev_less, print_getbit }, &ev_less_str }, ++ { { ARG_STR(EVIOCGBIT(0, 0)), ev_more, print_getbit }, ++ inject_retval * 8 <= EV_LED ++ ? (const void *) &ev_more_str_2 ++ : (const void *) &ev_more_str_3 }, ++ { { ARG_STR(EVIOCGBIT(0, 0)), ev_less, print_getbit }, ++ inject_retval * 8 <= EV_LED ++ ? (const void *) &ev_less_str_2 ++ : (const void *) &ev_less_str_3 }, + { { ARG_STR(EVIOCGBIT(0, 0)), ev_zero, print_getbit }, &ev_zero_str }, +- { { ARG_STR(EVIOCGBIT(EV_KEY, 0)), key, print_getbit }, &key_str}, ++ { { ARG_STR(EVIOCGBIT(EV_KEY, 0)), key, print_getbit }, ++ inject_retval * 8 <= KEY_F12 ++ ? (const void *) &key_str_8 ++ : (const void *) &key_str_16 }, + # ifdef EVIOCGMTSLOTS + { { ARG_STR(EVIOCGMTSLOTS(12)), mtslots, print_mtslots }, &mtslots_str }, + { { ARG_STR(EVIOCGMTSLOTS(8)), invalid_mtslot, print_mtslots }, &invalid_mtslot_str } +Index: strace-4.24/tests-mx32/ioctl_evdev-success.c +=================================================================== +--- strace-4.24.orig/tests-mx32/ioctl_evdev-success.c 2019-08-01 18:40:58.009521546 +0200 ++++ strace-4.24/tests-mx32/ioctl_evdev-success.c 2019-08-29 12:09:30.350669261 +0200 +@@ -2,6 +2,7 @@ + + #ifdef HAVE_LINUX_INPUT_H + ++# include + # include + # include + # include +@@ -9,17 +10,19 @@ + # include + # include "print_fields.h" + ++# define NUM_WORDS 4 ++ + static const char *errstr; + + struct evdev_check { + unsigned long cmd; + const char *cmd_str; +- void *arg_ptr; +- void (*print_arg)(long rc, void *ptr, void *arg); ++ const void *arg_ptr; ++ void (*print_arg)(long rc, const void *ptr, const void *arg); + }; + + static long +-invoke_test_syscall(unsigned long cmd, void *p) ++invoke_test_syscall(unsigned long cmd, const void *p) + { + long rc = ioctl(-1, cmd, p); + errstr = sprintrc(rc); +@@ -31,7 +34,7 @@ + } + + static void +-test_evdev(struct evdev_check *check, void *arg) ++test_evdev(struct evdev_check *check, const void *arg) + { + long rc = invoke_test_syscall(check->cmd, check->arg_ptr); + printf("ioctl(-1, %s, ", check->cmd_str); +@@ -43,9 +46,9 @@ + } + + static void +-print_input_absinfo(long rc, void *ptr, void *arg) ++print_input_absinfo(long rc, const void *ptr, const void *arg) + { +- struct input_absinfo *absinfo = ptr; ++ const struct input_absinfo *absinfo = ptr; + + if (rc < 0) { + printf("%p", absinfo); +@@ -67,9 +70,9 @@ + } + + static void +-print_input_id(long rc, void *ptr, void *arg) ++print_input_id(long rc, const void *ptr, const void *arg) + { +- struct input_id *id = ptr; ++ const struct input_id *id = ptr; + + if (rc < 0) { + printf("%p", id); +@@ -84,10 +87,10 @@ + + # ifdef EVIOCGMTSLOTS + static void +-print_mtslots(long rc, void *ptr, void *arg) ++print_mtslots(long rc, const void *ptr, const void *arg) + { +- int *buffer = ptr; +- const char **str = arg; ++ const int *buffer = ptr; ++ const char * const * str = arg; + int num = atoi(*(str + 1)); + + if (rc < 0) { +@@ -104,27 +107,26 @@ + # endif + + static void +-print_getbit(long rc, void *ptr, void *arg) ++print_getbit(long rc, const void *ptr, const void *arg) + { +- const char **str = arg; +- int num = atoi(*str); ++ const char * const *str = arg; + +- if (rc < 0) { ++ if (rc <= 0) { + printf("%p", ptr); + return; + } + + printf("["); +- printf("%s", *(str + 1)); +- for (unsigned int i = 2; i <= (unsigned) num; i++) { ++ for (unsigned long i = 0; str[i]; i++) { + # if ! VERBOSE +- if (i > 4) { ++ if (i >= 4) { + printf(", ..."); + break; + } + # endif +- printf(", "); +- printf("%s", *(str + i)); ++ if (i) ++ printf(", "); ++ printf("%s", str[i]); + } + printf("]"); + } +@@ -170,6 +172,7 @@ + TAIL_ALLOC_OBJECT_CONST_PTR(struct input_id, id); + TAIL_ALLOC_OBJECT_CONST_PTR(struct input_absinfo, absinfo); + TAIL_ALLOC_OBJECT_CONST_PTR(int, bad_addr_slot); ++ + # ifdef EVIOCGMTSLOTS + int mtslots[] = { ABS_MT_SLOT, 1, 3 }; + /* we use the second element to indicate the number of values */ +@@ -183,36 +186,65 @@ + const char *invalid_mtslot_str[] = { invalid_str, "1", "1" }; + # endif + ++ enum { ULONG_BIT = sizeof(unsigned long) * 8 }; ++ + /* set more than 4 bits */ +- unsigned long ev_more[] = { 1 << EV_ABS | 1 << EV_MSC | 1 << EV_LED | 1 << EV_SND | 1 << EV_PWR }; +- /* we use the first element to indicate the number of set bits */ +- /* ev_more_str[0] is "5" so the number of set bits is 5 */ +- const char *ev_more_str[] = { "5", "EV_ABS", "EV_MSC", "EV_LED", "EV_SND", "EV_PWR" }; ++ static const unsigned long ev_more[NUM_WORDS] = { ++ 1 << EV_ABS | 1 << EV_MSC | 1 << EV_LED | 1 << EV_SND ++ | 1 << EV_PWR }; ++ static const char * const ev_more_str_2[] = { ++ "EV_ABS", "EV_MSC", NULL }; ++ static const char * const ev_more_str_3[] = { ++ "EV_ABS", "EV_MSC", "EV_LED", "EV_SND", "EV_PWR", NULL }; + + /* set less than 4 bits */ +- unsigned long ev_less[] = { 1 << EV_ABS | 1 << EV_MSC | 1 << EV_LED }; +- const char *ev_less_str[] = { "3", "EV_ABS", "EV_MSC", "EV_LED" }; ++ static const unsigned long ev_less[NUM_WORDS] = { ++ 1 << EV_ABS | 1 << EV_MSC | 1 << EV_LED }; ++ static const char * const ev_less_str_2[] = { ++ "EV_ABS", "EV_MSC", NULL }; ++ static const char * const ev_less_str_3[] = { ++ "EV_ABS", "EV_MSC", "EV_LED", NULL }; + + /* set zero bit */ +- unsigned long ev_zero[] = { 0x0 }; +- const char *ev_zero_str[] = { "0", " 0 " }; ++ static const unsigned long ev_zero[NUM_WORDS] = { 0x0 }; ++ static const char * const ev_zero_str[] = { " 0 ", NULL }; + + /* KEY_MAX is 0x2ff which is greater than retval * 8 */ +- unsigned long key[] = { 1 << KEY_1 | 1 << KEY_2, 0 }; +- const char *key_str[] = { "2", "KEY_1", "KEY_2" }; ++ static const unsigned long key[NUM_WORDS] = { ++ 1 << KEY_1 | 1 << KEY_2, ++ [ KEY_F12 / ULONG_BIT ] = 1 << (KEY_F12 % ULONG_BIT) }; ++ ++ static const char * const key_str_8[] = { ++ "KEY_1", "KEY_2", NULL }; ++ static const char * const key_str_16[] = { ++ "KEY_1", "KEY_2", "KEY_F12", NULL }; ++ ++ assert(sizeof(ev_more) >= (unsigned long) inject_retval); ++ assert(sizeof(ev_less) >= (unsigned long) inject_retval); ++ assert(sizeof(ev_zero) >= (unsigned long) inject_retval); ++ assert(sizeof(key) >= (unsigned long) inject_retval); + + struct { + struct evdev_check check; +- void *ptr; ++ const void *ptr; + } a[] = { + { { ARG_STR(EVIOCGID), id, print_input_id }, NULL }, + { { ARG_STR(EVIOCGABS(ABS_X)), absinfo, print_input_absinfo }, NULL }, + { { ARG_STR(EVIOCGABS(ABS_Y)), absinfo, print_input_absinfo }, NULL }, + { { ARG_STR(EVIOCGABS(ABS_Y)), absinfo, print_input_absinfo }, NULL }, +- { { ARG_STR(EVIOCGBIT(0, 0)), ev_more, print_getbit }, &ev_more_str }, +- { { ARG_STR(EVIOCGBIT(0, 0)), ev_less, print_getbit }, &ev_less_str }, ++ { { ARG_STR(EVIOCGBIT(0, 0)), ev_more, print_getbit }, ++ inject_retval * 8 <= EV_LED ++ ? (const void *) &ev_more_str_2 ++ : (const void *) &ev_more_str_3 }, ++ { { ARG_STR(EVIOCGBIT(0, 0)), ev_less, print_getbit }, ++ inject_retval * 8 <= EV_LED ++ ? (const void *) &ev_less_str_2 ++ : (const void *) &ev_less_str_3 }, + { { ARG_STR(EVIOCGBIT(0, 0)), ev_zero, print_getbit }, &ev_zero_str }, +- { { ARG_STR(EVIOCGBIT(EV_KEY, 0)), key, print_getbit }, &key_str}, ++ { { ARG_STR(EVIOCGBIT(EV_KEY, 0)), key, print_getbit }, ++ inject_retval * 8 <= KEY_F12 ++ ? (const void *) &key_str_8 ++ : (const void *) &key_str_16 }, + # ifdef EVIOCGMTSLOTS + { { ARG_STR(EVIOCGMTSLOTS(12)), mtslots, print_mtslots }, &mtslots_str }, + { { ARG_STR(EVIOCGMTSLOTS(8)), invalid_mtslot, print_mtslots }, &invalid_mtslot_str } diff --git a/SOURCES/0034-s390x-beautify-sthyi-data-tail-prints.patch b/SOURCES/0034-s390x-beautify-sthyi-data-tail-prints.patch new file mode 100644 index 0000000..a0aff24 --- /dev/null +++ b/SOURCES/0034-s390x-beautify-sthyi-data-tail-prints.patch @@ -0,0 +1,37 @@ +From f476724ea13d6fae08219aba75a7669eb3e836b3 Mon Sep 17 00:00:00 2001 +From: Janosch Frank +Date: Fri, 30 Nov 2018 16:41:39 +0100 +Subject: [PATCH] s390x: beautify sthyi data tail prints + +The test already expects a ", " before the print of struct +padding. Let's add it to s390.c to make the output look a bit nicer and +fix test runs on z/VM that have padding at the end of the STHYI structs. + +* s390.c (decode_ebcdic): Add missing comma. + +Signed-off-by: Janosch Frank +--- + s390.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/s390.c b/s390.c +index 422c08d..a00c274 100644 +--- a/s390.c ++++ b/s390.c +@@ -472,10 +472,12 @@ decode_ebcdic(const char *ebcdic, char *ascii, size_t size) + do { \ + if ((size_) > sizeof(*(hdr_)) && \ + !is_filled((char *) ((hdr_) + 1), '\0', \ +- (size_) - sizeof(*(hdr_)))) \ ++ (size_) - sizeof(*(hdr_)))) { \ ++ tprints(", "); \ + print_quoted_string((char *) ((hdr_) + 1), \ + (size_) - sizeof(*(hdr_)), \ + QUOTE_FORCE_HEX); \ ++ } \ + } while (0) + + static void +-- +2.1.4 + diff --git a/SOURCES/0035-v4l2-avoid-shifting-left-a-signed-number-by-31-bit.patch b/SOURCES/0035-v4l2-avoid-shifting-left-a-signed-number-by-31-bit.patch new file mode 100644 index 0000000..a2c85f9 --- /dev/null +++ b/SOURCES/0035-v4l2-avoid-shifting-left-a-signed-number-by-31-bit.patch @@ -0,0 +1,32 @@ +From 91281fec7823f1cd3df3374fbcbd14af52a3fa1b Mon Sep 17 00:00:00 2001 +From: Eugene Syromyatnikov +Date: Wed, 14 Aug 2019 17:15:47 +0200 +Subject: [PATCH] v4l2: avoid shifting left a signed number by 31 bit + +cppcheck warns about it with the following diagnostics: + + error[shiftTooManyBitsSigned]: Shifting signed 32-bit value by 31 bits is + undefined behaviour + +* v4l2.c [!v4l2_fourcc_be] (v4l2_fourcc_be): Shift left 1U and not 1 in +order to get 0x80000000. +--- + v4l2.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/v4l2.c b/v4l2.c +index 5da457c..505e7b8 100644 +--- a/v4l2.c ++++ b/v4l2.c +@@ -47,7 +47,7 @@ typedef struct v4l2_standard struct_v4l2_standard; + + /* v4l2_fourcc_be was added by Linux commit v3.18-rc1~101^2^2~127 */ + #ifndef v4l2_fourcc_be +-# define v4l2_fourcc_be(a, b, c, d) (v4l2_fourcc(a, b, c, d) | (1 << 31)) ++# define v4l2_fourcc_be(a, b, c, d) (v4l2_fourcc(a, b, c, d) | (1U << 31)) + #endif + + #define FMT_FRACT "%u/%u" +-- +2.1.4 + diff --git a/SOURCES/0036-syscall.c-avoid-infinite-loop-in-subcalls-parsing.patch b/SOURCES/0036-syscall.c-avoid-infinite-loop-in-subcalls-parsing.patch new file mode 100644 index 0000000..9144dc1 --- /dev/null +++ b/SOURCES/0036-syscall.c-avoid-infinite-loop-in-subcalls-parsing.patch @@ -0,0 +1,55 @@ +From 522ad3a0e73148dadd2480cd9cec84d9112b2e57 Mon Sep 17 00:00:00 2001 +From: Eugene Syromyatnikov +Date: Tue, 4 Sep 2018 14:48:13 +0200 +Subject: [PATCH] syscall.c: avoid infinite loop in subcalls parsing + +clang complains about it, so it might be a good reason to refactor it +into something more linear. + +* syscall.c (syscall_entering_decode): Put syscall subcall decoding +before ipc/socket subcall decoding, remove the loop. +--- + syscall.c | 19 ++++++------------- + 1 file changed, 6 insertions(+), 13 deletions(-) + +diff --git a/syscall.c b/syscall.c +index bae7343..a67d744 100644 +--- a/syscall.c ++++ b/syscall.c +@@ -579,11 +579,13 @@ syscall_entering_decode(struct tcb *tcp) + return res; + } + ++# ifdef SYS_syscall_subcall ++ if (tcp_sysent(tcp)->sen == SEN_syscall) ++ decode_syscall_subcall(tcp); ++# endif + #if defined SYS_ipc_subcall \ +- || defined SYS_socket_subcall \ +- || defined SYS_syscall_subcall +- for (;;) { +- switch (tcp_sysent(tcp)->sen) { ++ || defined SYS_socket_subcall ++ switch (tcp_sysent(tcp)->sen) { + # ifdef SYS_ipc_subcall + case SEN_ipc: + decode_ipc_subcall(tcp); +@@ -594,15 +596,6 @@ syscall_entering_decode(struct tcb *tcp) + decode_socket_subcall(tcp); + break; + # endif +-# ifdef SYS_syscall_subcall +- case SEN_syscall: +- decode_syscall_subcall(tcp); +- if (tcp_sysent(tcp)->sen != SEN_syscall) +- continue; +- break; +-# endif +- } +- break; + } + #endif + +-- +2.1.4 + diff --git a/SOURCES/0037-kvm-avoid-bogus-vcpu_info-assignment-in-vcpu_registe.patch b/SOURCES/0037-kvm-avoid-bogus-vcpu_info-assignment-in-vcpu_registe.patch new file mode 100644 index 0000000..7531868 --- /dev/null +++ b/SOURCES/0037-kvm-avoid-bogus-vcpu_info-assignment-in-vcpu_registe.patch @@ -0,0 +1,36 @@ +From 9446038e9face3313373ca5f7539476789fd4660 Mon Sep 17 00:00:00 2001 +From: Eugene Syromyatnikov +Date: Tue, 18 Dec 2018 05:37:30 +0100 +Subject: [PATCH] kvm: avoid bogus vcpu_info assignment in vcpu_register + +Also reformat code a bit to make nesting a bit clearer. + +Reported by Clang. + +* kvm.c (vcpu_register): Do not assign vcpu_alloc result to vcpu_info +as this value is not used afterwards in the function. +--- + kvm.c | 7 +++---- + 1 file changed, 3 insertions(+), 4 deletions(-) + +diff --git a/kvm.c b/kvm.c +index 984a75e..8bdf1cc 100644 +--- a/kvm.c ++++ b/kvm.c +@@ -76,10 +76,9 @@ vcpu_register(struct tcb *const tcp, int fd, int cpuid) + + struct vcpu_info *vcpu_info = vcpu_find(tcp, fd); + +- if (!vcpu_info) +- vcpu_info = vcpu_alloc(tcp, fd, cpuid); +- else if (vcpu_info->cpuid != cpuid) +- { ++ if (!vcpu_info) { ++ vcpu_alloc(tcp, fd, cpuid); ++ } else if (vcpu_info->cpuid != cpuid) { + vcpu_info->cpuid = cpuid; + vcpu_info->resolved = false; + } +-- +2.1.4 + diff --git a/SOURCES/0038-xlat-use-unsgined-type-for-mount_flags-fallback-valu.patch b/SOURCES/0038-xlat-use-unsgined-type-for-mount_flags-fallback-valu.patch new file mode 100644 index 0000000..5bc3768 --- /dev/null +++ b/SOURCES/0038-xlat-use-unsgined-type-for-mount_flags-fallback-valu.patch @@ -0,0 +1,365 @@ +From c26541c73c3b4be2977e719d77287255eb346cdf Mon Sep 17 00:00:00 2001 +From: Eugene Syromyatnikov +Date: Thu, 17 Oct 2019 13:13:45 +0200 +Subject: [PATCH] xlat: use unsgined type for mount_flags fallback values + +Reported by cppcheck: + + strace/xlat/mount_flags.h:256: error[shiftTooManyBitsSigned]: + Shifting signed 32-bit value by 31 bits is undefined behaviour + # 254| XLAT(MS_BORN), + # 255| XLAT(MS_ACTIVE), + # 256|-> XLAT(MS_NOUSER), + # 257| XLAT_END + # 258| }; + +* xlat/mount_flags.in: Use 1U instead of 1 as a bit shifting operand. + +References: https://bugzilla.redhat.com/show_bug.cgi?id=1747524 +--- + xlat/mount_flags.in | 60 ++++++++++++++++++++++++++--------------------------- + 1 file changed, 30 insertions(+), 30 deletions(-) + +Index: strace-4.24/xlat/mount_flags.in +=================================================================== +--- strace-4.24.orig/xlat/mount_flags.in 2018-04-24 02:35:27.000000000 +0200 ++++ strace-4.24/xlat/mount_flags.in 2019-12-02 18:37:39.403710911 +0100 +@@ -1,30 +1,30 @@ +-MS_RDONLY 1 +-MS_NOSUID 2 +-MS_NODEV 4 +-MS_NOEXEC 8 +-MS_SYNCHRONOUS 16 +-MS_REMOUNT 32 +-MS_MANDLOCK 64 +-MS_DIRSYNC 128 +-MS_NOATIME 1024 +-MS_NODIRATIME 2048 +-MS_BIND 4096 +-MS_MOVE 8192 +-MS_REC 16384 +-MS_SILENT 32768 +-MS_POSIXACL (1<<16) +-MS_UNBINDABLE (1<<17) +-MS_PRIVATE (1<<18) +-MS_SLAVE (1<<19) +-MS_SHARED (1<<20) +-MS_RELATIME (1<<21) +-MS_KERNMOUNT (1<<22) +-MS_I_VERSION (1<<23) +-MS_STRICTATIME (1<<24) +-MS_LAZYTIME (1<<25) +-MS_SUBMOUNT (1<<26) +-MS_NOREMOTELOCK (1<<27) +-MS_NOSEC (1<<28) +-MS_BORN (1<<29) +-MS_ACTIVE (1<<30) +-MS_NOUSER (1<<31) ++MS_RDONLY (1U<<0) ++MS_NOSUID (1U<<1) ++MS_NODEV (1U<<2) ++MS_NOEXEC (1U<<3) ++MS_SYNCHRONOUS (1U<<4) ++MS_REMOUNT (1U<<5) ++MS_MANDLOCK (1U<<6) ++MS_DIRSYNC (1U<<7) ++MS_NOATIME (1U<<10) ++MS_NODIRATIME (1U<<11) ++MS_BIND (1U<<12) ++MS_MOVE (1U<<13) ++MS_REC (1U<<14) ++MS_SILENT (1U<<15) ++MS_POSIXACL (1U<<16) ++MS_UNBINDABLE (1U<<17) ++MS_PRIVATE (1U<<18) ++MS_SLAVE (1U<<19) ++MS_SHARED (1U<<20) ++MS_RELATIME (1U<<21) ++MS_KERNMOUNT (1U<<22) ++MS_I_VERSION (1U<<23) ++MS_STRICTATIME (1U<<24) ++MS_LAZYTIME (1U<<25) ++MS_SUBMOUNT (1U<<26) ++MS_NOREMOTELOCK (1U<<27) ++MS_NOSEC (1U<<28) ++MS_BORN (1U<<29) ++MS_ACTIVE (1U<<30) ++MS_NOUSER (1U<<31) +Index: strace-4.24/xlat/mount_flags.h +=================================================================== +--- strace-4.24.orig/xlat/mount_flags.h 2018-08-14 02:44:19.000000000 +0200 ++++ strace-4.24/xlat/mount_flags.h 2019-12-02 18:38:36.102900164 +0100 +@@ -5,213 +5,213 @@ + + #if defined(MS_RDONLY) || (defined(HAVE_DECL_MS_RDONLY) && HAVE_DECL_MS_RDONLY) + DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE +-static_assert((MS_RDONLY) == (1), "MS_RDONLY != 1"); ++static_assert((MS_RDONLY) == ((1U<<0)), "MS_RDONLY != (1U<<0)"); + DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE + #else +-# define MS_RDONLY 1 ++# define MS_RDONLY (1U<<0) + #endif + #if defined(MS_NOSUID) || (defined(HAVE_DECL_MS_NOSUID) && HAVE_DECL_MS_NOSUID) + DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE +-static_assert((MS_NOSUID) == (2), "MS_NOSUID != 2"); ++static_assert((MS_NOSUID) == ((1U<<1)), "MS_NOSUID != (1U<<1)"); + DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE + #else +-# define MS_NOSUID 2 ++# define MS_NOSUID (1U<<1) + #endif + #if defined(MS_NODEV) || (defined(HAVE_DECL_MS_NODEV) && HAVE_DECL_MS_NODEV) + DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE +-static_assert((MS_NODEV) == (4), "MS_NODEV != 4"); ++static_assert((MS_NODEV) == ((1U<<2)), "MS_NODEV != (1U<<2)"); + DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE + #else +-# define MS_NODEV 4 ++# define MS_NODEV (1U<<2) + #endif + #if defined(MS_NOEXEC) || (defined(HAVE_DECL_MS_NOEXEC) && HAVE_DECL_MS_NOEXEC) + DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE +-static_assert((MS_NOEXEC) == (8), "MS_NOEXEC != 8"); ++static_assert((MS_NOEXEC) == ((1U<<3)), "MS_NOEXEC != (1U<<3)"); + DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE + #else +-# define MS_NOEXEC 8 ++# define MS_NOEXEC (1U<<3) + #endif + #if defined(MS_SYNCHRONOUS) || (defined(HAVE_DECL_MS_SYNCHRONOUS) && HAVE_DECL_MS_SYNCHRONOUS) + DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE +-static_assert((MS_SYNCHRONOUS) == (16), "MS_SYNCHRONOUS != 16"); ++static_assert((MS_SYNCHRONOUS) == ((1U<<4)), "MS_SYNCHRONOUS != (1U<<4)"); + DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE + #else +-# define MS_SYNCHRONOUS 16 ++# define MS_SYNCHRONOUS (1U<<4) + #endif + #if defined(MS_REMOUNT) || (defined(HAVE_DECL_MS_REMOUNT) && HAVE_DECL_MS_REMOUNT) + DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE +-static_assert((MS_REMOUNT) == (32), "MS_REMOUNT != 32"); ++static_assert((MS_REMOUNT) == ((1U<<5)), "MS_REMOUNT != (1U<<5)"); + DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE + #else +-# define MS_REMOUNT 32 ++# define MS_REMOUNT (1U<<5) + #endif + #if defined(MS_MANDLOCK) || (defined(HAVE_DECL_MS_MANDLOCK) && HAVE_DECL_MS_MANDLOCK) + DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE +-static_assert((MS_MANDLOCK) == (64), "MS_MANDLOCK != 64"); ++static_assert((MS_MANDLOCK) == ((1U<<6)), "MS_MANDLOCK != (1U<<6)"); + DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE + #else +-# define MS_MANDLOCK 64 ++# define MS_MANDLOCK (1U<<6) + #endif + #if defined(MS_DIRSYNC) || (defined(HAVE_DECL_MS_DIRSYNC) && HAVE_DECL_MS_DIRSYNC) + DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE +-static_assert((MS_DIRSYNC) == (128), "MS_DIRSYNC != 128"); ++static_assert((MS_DIRSYNC) == ((1U<<7)), "MS_DIRSYNC != (1U<<7)"); + DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE + #else +-# define MS_DIRSYNC 128 ++# define MS_DIRSYNC (1U<<7) + #endif + #if defined(MS_NOATIME) || (defined(HAVE_DECL_MS_NOATIME) && HAVE_DECL_MS_NOATIME) + DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE +-static_assert((MS_NOATIME) == (1024), "MS_NOATIME != 1024"); ++static_assert((MS_NOATIME) == ((1U<<10)), "MS_NOATIME != (1U<<10)"); + DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE + #else +-# define MS_NOATIME 1024 ++# define MS_NOATIME (1U<<10) + #endif + #if defined(MS_NODIRATIME) || (defined(HAVE_DECL_MS_NODIRATIME) && HAVE_DECL_MS_NODIRATIME) + DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE +-static_assert((MS_NODIRATIME) == (2048), "MS_NODIRATIME != 2048"); ++static_assert((MS_NODIRATIME) == ((1U<<11)), "MS_NODIRATIME != (1U<<11)"); + DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE + #else +-# define MS_NODIRATIME 2048 ++# define MS_NODIRATIME (1U<<11) + #endif + #if defined(MS_BIND) || (defined(HAVE_DECL_MS_BIND) && HAVE_DECL_MS_BIND) + DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE +-static_assert((MS_BIND) == (4096), "MS_BIND != 4096"); ++static_assert((MS_BIND) == ((1U<<12)), "MS_BIND != (1U<<12)"); + DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE + #else +-# define MS_BIND 4096 ++# define MS_BIND (1U<<12) + #endif + #if defined(MS_MOVE) || (defined(HAVE_DECL_MS_MOVE) && HAVE_DECL_MS_MOVE) + DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE +-static_assert((MS_MOVE) == (8192), "MS_MOVE != 8192"); ++static_assert((MS_MOVE) == ((1U<<13)), "MS_MOVE != (1U<<13)"); + DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE + #else +-# define MS_MOVE 8192 ++# define MS_MOVE (1U<<13) + #endif + #if defined(MS_REC) || (defined(HAVE_DECL_MS_REC) && HAVE_DECL_MS_REC) + DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE +-static_assert((MS_REC) == (16384), "MS_REC != 16384"); ++static_assert((MS_REC) == ((1U<<14)), "MS_REC != (1U<<14)"); + DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE + #else +-# define MS_REC 16384 ++# define MS_REC (1U<<14) + #endif + #if defined(MS_SILENT) || (defined(HAVE_DECL_MS_SILENT) && HAVE_DECL_MS_SILENT) + DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE +-static_assert((MS_SILENT) == (32768), "MS_SILENT != 32768"); ++static_assert((MS_SILENT) == ((1U<<15)), "MS_SILENT != (1U<<15)"); + DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE + #else +-# define MS_SILENT 32768 ++# define MS_SILENT (1U<<15) + #endif + #if defined(MS_POSIXACL) || (defined(HAVE_DECL_MS_POSIXACL) && HAVE_DECL_MS_POSIXACL) + DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE +-static_assert((MS_POSIXACL) == ((1<<16)), "MS_POSIXACL != (1<<16)"); ++static_assert((MS_POSIXACL) == ((1U<<16)), "MS_POSIXACL != (1U<<16)"); + DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE + #else +-# define MS_POSIXACL (1<<16) ++# define MS_POSIXACL (1U<<16) + #endif + #if defined(MS_UNBINDABLE) || (defined(HAVE_DECL_MS_UNBINDABLE) && HAVE_DECL_MS_UNBINDABLE) + DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE +-static_assert((MS_UNBINDABLE) == ((1<<17)), "MS_UNBINDABLE != (1<<17)"); ++static_assert((MS_UNBINDABLE) == ((1U<<17)), "MS_UNBINDABLE != (1U<<17)"); + DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE + #else +-# define MS_UNBINDABLE (1<<17) ++# define MS_UNBINDABLE (1U<<17) + #endif + #if defined(MS_PRIVATE) || (defined(HAVE_DECL_MS_PRIVATE) && HAVE_DECL_MS_PRIVATE) + DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE +-static_assert((MS_PRIVATE) == ((1<<18)), "MS_PRIVATE != (1<<18)"); ++static_assert((MS_PRIVATE) == ((1U<<18)), "MS_PRIVATE != (1U<<18)"); + DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE + #else +-# define MS_PRIVATE (1<<18) ++# define MS_PRIVATE (1U<<18) + #endif + #if defined(MS_SLAVE) || (defined(HAVE_DECL_MS_SLAVE) && HAVE_DECL_MS_SLAVE) + DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE +-static_assert((MS_SLAVE) == ((1<<19)), "MS_SLAVE != (1<<19)"); ++static_assert((MS_SLAVE) == ((1U<<19)), "MS_SLAVE != (1U<<19)"); + DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE + #else +-# define MS_SLAVE (1<<19) ++# define MS_SLAVE (1U<<19) + #endif + #if defined(MS_SHARED) || (defined(HAVE_DECL_MS_SHARED) && HAVE_DECL_MS_SHARED) + DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE +-static_assert((MS_SHARED) == ((1<<20)), "MS_SHARED != (1<<20)"); ++static_assert((MS_SHARED) == ((1U<<20)), "MS_SHARED != (1U<<20)"); + DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE + #else +-# define MS_SHARED (1<<20) ++# define MS_SHARED (1U<<20) + #endif + #if defined(MS_RELATIME) || (defined(HAVE_DECL_MS_RELATIME) && HAVE_DECL_MS_RELATIME) + DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE +-static_assert((MS_RELATIME) == ((1<<21)), "MS_RELATIME != (1<<21)"); ++static_assert((MS_RELATIME) == ((1U<<21)), "MS_RELATIME != (1U<<21)"); + DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE + #else +-# define MS_RELATIME (1<<21) ++# define MS_RELATIME (1U<<21) + #endif + #if defined(MS_KERNMOUNT) || (defined(HAVE_DECL_MS_KERNMOUNT) && HAVE_DECL_MS_KERNMOUNT) + DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE +-static_assert((MS_KERNMOUNT) == ((1<<22)), "MS_KERNMOUNT != (1<<22)"); ++static_assert((MS_KERNMOUNT) == ((1U<<22)), "MS_KERNMOUNT != (1U<<22)"); + DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE + #else +-# define MS_KERNMOUNT (1<<22) ++# define MS_KERNMOUNT (1U<<22) + #endif + #if defined(MS_I_VERSION) || (defined(HAVE_DECL_MS_I_VERSION) && HAVE_DECL_MS_I_VERSION) + DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE +-static_assert((MS_I_VERSION) == ((1<<23)), "MS_I_VERSION != (1<<23)"); ++static_assert((MS_I_VERSION) == ((1U<<23)), "MS_I_VERSION != (1U<<23)"); + DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE + #else +-# define MS_I_VERSION (1<<23) ++# define MS_I_VERSION (1U<<23) + #endif + #if defined(MS_STRICTATIME) || (defined(HAVE_DECL_MS_STRICTATIME) && HAVE_DECL_MS_STRICTATIME) + DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE +-static_assert((MS_STRICTATIME) == ((1<<24)), "MS_STRICTATIME != (1<<24)"); ++static_assert((MS_STRICTATIME) == ((1U<<24)), "MS_STRICTATIME != (1U<<24)"); + DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE + #else +-# define MS_STRICTATIME (1<<24) ++# define MS_STRICTATIME (1U<<24) + #endif + #if defined(MS_LAZYTIME) || (defined(HAVE_DECL_MS_LAZYTIME) && HAVE_DECL_MS_LAZYTIME) + DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE +-static_assert((MS_LAZYTIME) == ((1<<25)), "MS_LAZYTIME != (1<<25)"); ++static_assert((MS_LAZYTIME) == ((1U<<25)), "MS_LAZYTIME != (1U<<25)"); + DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE + #else +-# define MS_LAZYTIME (1<<25) ++# define MS_LAZYTIME (1U<<25) + #endif + #if defined(MS_SUBMOUNT) || (defined(HAVE_DECL_MS_SUBMOUNT) && HAVE_DECL_MS_SUBMOUNT) + DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE +-static_assert((MS_SUBMOUNT) == ((1<<26)), "MS_SUBMOUNT != (1<<26)"); ++static_assert((MS_SUBMOUNT) == ((1U<<26)), "MS_SUBMOUNT != (1U<<26)"); + DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE + #else +-# define MS_SUBMOUNT (1<<26) ++# define MS_SUBMOUNT (1U<<26) + #endif + #if defined(MS_NOREMOTELOCK) || (defined(HAVE_DECL_MS_NOREMOTELOCK) && HAVE_DECL_MS_NOREMOTELOCK) + DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE +-static_assert((MS_NOREMOTELOCK) == ((1<<27)), "MS_NOREMOTELOCK != (1<<27)"); ++static_assert((MS_NOREMOTELOCK) == ((1U<<27)), "MS_NOREMOTELOCK != (1U<<27)"); + DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE + #else +-# define MS_NOREMOTELOCK (1<<27) ++# define MS_NOREMOTELOCK (1U<<27) + #endif + #if defined(MS_NOSEC) || (defined(HAVE_DECL_MS_NOSEC) && HAVE_DECL_MS_NOSEC) + DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE +-static_assert((MS_NOSEC) == ((1<<28)), "MS_NOSEC != (1<<28)"); ++static_assert((MS_NOSEC) == ((1U<<28)), "MS_NOSEC != (1U<<28)"); + DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE + #else +-# define MS_NOSEC (1<<28) ++# define MS_NOSEC (1U<<28) + #endif + #if defined(MS_BORN) || (defined(HAVE_DECL_MS_BORN) && HAVE_DECL_MS_BORN) + DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE +-static_assert((MS_BORN) == ((1<<29)), "MS_BORN != (1<<29)"); ++static_assert((MS_BORN) == ((1U<<29)), "MS_BORN != (1U<<29)"); + DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE + #else +-# define MS_BORN (1<<29) ++# define MS_BORN (1U<<29) + #endif + #if defined(MS_ACTIVE) || (defined(HAVE_DECL_MS_ACTIVE) && HAVE_DECL_MS_ACTIVE) + DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE +-static_assert((MS_ACTIVE) == ((1<<30)), "MS_ACTIVE != (1<<30)"); ++static_assert((MS_ACTIVE) == ((1U<<30)), "MS_ACTIVE != (1U<<30)"); + DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE + #else +-# define MS_ACTIVE (1<<30) ++# define MS_ACTIVE (1U<<30) + #endif + #if defined(MS_NOUSER) || (defined(HAVE_DECL_MS_NOUSER) && HAVE_DECL_MS_NOUSER) + DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE +-static_assert((MS_NOUSER) == ((1<<31)), "MS_NOUSER != (1<<31)"); ++static_assert((MS_NOUSER) == ((1U<<31)), "MS_NOUSER != (1U<<31)"); + DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE + #else +-# define MS_NOUSER (1<<31) ++# define MS_NOUSER (1U<<31) + #endif + + #ifndef XLAT_MACROS_ONLY diff --git a/SOURCES/0028-Wire-up-rseq-syscall-on-architectures-that-use-gener.patch b/SOURCES/0100-Wire-up-rseq-syscall-on-architectures-that-use-gener.patch similarity index 100% rename from SOURCES/0028-Wire-up-rseq-syscall-on-architectures-that-use-gener.patch rename to SOURCES/0100-Wire-up-rseq-syscall-on-architectures-that-use-gener.patch diff --git a/SOURCES/0029-Wire-up-kexec_file_load-syscall-on-architectures-tha.patch b/SOURCES/0101-Wire-up-kexec_file_load-syscall-on-architectures-tha.patch similarity index 100% rename from SOURCES/0029-Wire-up-kexec_file_load-syscall-on-architectures-tha.patch rename to SOURCES/0101-Wire-up-kexec_file_load-syscall-on-architectures-tha.patch diff --git a/SOURCES/0030-limit-qual_fault-test-on-aarch64.patch b/SOURCES/0201-limit-qual_fault-scope-on-aarch64.patch similarity index 100% rename from SOURCES/0030-limit-qual_fault-test-on-aarch64.patch rename to SOURCES/0201-limit-qual_fault-scope-on-aarch64.patch diff --git a/SOURCES/0202-disable-ksysent-on-8.2.patch b/SOURCES/0202-disable-ksysent-on-8.2.patch new file mode 100644 index 0000000..102f151 --- /dev/null +++ b/SOURCES/0202-disable-ksysent-on-8.2.patch @@ -0,0 +1,76 @@ +Unfortunately, strace 5.1 rebase didn't make it into RHEL 8.2. +As a result, ksystent tests now fails due to presence of new io_uring* syscalls. +Disable it for 8.2 in anticipation of a rebase in 8.3 timeframe. + +Index: strace-4.24/tests-m32/Makefile.am +=================================================================== +--- strace-4.24.orig/tests-m32/Makefile.am 2019-12-02 18:36:41.156516491 +0100 ++++ strace-4.24/tests-m32/Makefile.am 2019-12-02 20:32:00.744610221 +0100 +@@ -323,7 +323,6 @@ + get_regs.test \ + inject-nf.test \ + interactive_block.test \ +- ksysent.test \ + localtime.test \ + opipe.test \ + options-syntax.test \ +Index: strace-4.24/tests-m32/Makefile.in +=================================================================== +--- strace-4.24.orig/tests-m32/Makefile.in 2019-12-02 18:36:41.079516234 +0100 ++++ strace-4.24/tests-m32/Makefile.in 2019-12-02 20:32:07.676582952 +0100 +@@ -4246,7 +4246,6 @@ + inject-nf.test \ + interactive_block.test \ + kill_child.test \ +- ksysent.test \ + localtime.test \ + looping_threads.test \ + opipe.test \ +Index: strace-4.24/tests-mx32/Makefile.am +=================================================================== +--- strace-4.24.orig/tests-mx32/Makefile.am 2019-12-02 18:36:41.156516491 +0100 ++++ strace-4.24/tests-mx32/Makefile.am 2019-12-02 20:32:33.983479462 +0100 +@@ -323,7 +323,6 @@ + get_regs.test \ + inject-nf.test \ + interactive_block.test \ +- ksysent.test \ + localtime.test \ + opipe.test \ + options-syntax.test \ +Index: strace-4.24/tests-mx32/Makefile.in +=================================================================== +--- strace-4.24.orig/tests-mx32/Makefile.in 2019-12-02 18:36:41.080516237 +0100 ++++ strace-4.24/tests-mx32/Makefile.in 2019-12-02 20:32:29.375497590 +0100 +@@ -4246,7 +4246,6 @@ + inject-nf.test \ + interactive_block.test \ + kill_child.test \ +- ksysent.test \ + localtime.test \ + looping_threads.test \ + opipe.test \ +Index: strace-4.24/tests/Makefile.am +=================================================================== +--- strace-4.24.orig/tests/Makefile.am 2019-12-02 18:36:41.156516491 +0100 ++++ strace-4.24/tests/Makefile.am 2019-12-02 20:31:29.951731358 +0100 +@@ -308,7 +308,6 @@ + inject-nf.test \ + interactive_block.test \ + kill_child.test \ +- ksysent.test \ + localtime.test \ + looping_threads.test \ + opipe.test \ +Index: strace-4.24/tests/Makefile.in +=================================================================== +--- strace-4.24.orig/tests/Makefile.in 2019-12-02 18:36:41.160516504 +0100 ++++ strace-4.24/tests/Makefile.in 2019-12-02 20:31:49.786653329 +0100 +@@ -4259,7 +4259,6 @@ + inject-nf.test \ + interactive_block.test \ + kill_child.test \ +- ksysent.test \ + localtime.test \ + looping_threads.test \ + opipe.test \ diff --git a/SPECS/strace.spec b/SPECS/strace.spec index e788db6..dd722dd 100644 --- a/SPECS/strace.spec +++ b/SPECS/strace.spec @@ -1,79 +1,148 @@ Summary: Tracks and displays system calls associated with a running process Name: strace Version: 4.24 -Release: 5%{?dist} +Release: 6%{?dist} +# The test suite is GPLv2+, all the rest is LGPLv2.1+. License: LGPL-2.1+ and GPL-2.0+ Group: Development/Debuggers -URL: https://strace.io -Source: https://strace.io/files/%{version}/strace-%{version}.tar.xz +URL: https://strace.io/ +Source: https://strace.io/files/%{version}/%{name}-%{version}.tar.xz + BuildRequires: libacl-devel time gcc gzip BuildRequires: pkgconfig(bluez) BuildRequires: elfutils-devel binutils-devel -# General bug fixes +## General bug fixes +# v4.25~91 "evdev: fix decoding of bit sets" Patch1: 0001-evdev-fix-decoding-of-bit-sets.patch +# v4.25~90 "evdev: fix decoding of EVIOCGBIT(0, ...)" Patch2: 0002-evdev-fix-decoding-of-EVIOCGBIT-0.patch +# v4.25~83 "xlat: fix typo in smc_protocols.in" Patch3: 0003-xlat-fix-typo-in-smc_protocols.in.patch -# Pre-requisite for the queueing patch +## Pre-requisite for the queueing patch +# v4.25~82 "strace.c: introduce struct tcb_wait_data" Patch4: 0004-strace.c-introduce-struct-tcb_wait_data.patch -# Documentation +## Documentation +# v4.26~83 "Document -X option in strace -h output" Patch5: 0005-Document-X-option-in-strace-h-output.patch -# Addresses https://bugzilla.redhat.com/1660759 ("strace prints "xlat_idx: -# Unexpected xlat value 0 at index 4" messages") +## Addresses https://bugzilla.redhat.com/1660759 ("strace prints "xlat_idx: +## Unexpected xlat value 0 at index 4" messages") +# v4.26~36 "evdev: fix off-by-one error in decode_bitset" Patch6: 0006-evdev-fix-off-by-one-error-in-decode_bitset.patch +# v4.26~35 "nlattr: fix off-by-one error in indexed xlat lookup" Patch7: 0007-nlattr-fix-off-by-one-error-in-indexed-xlat-lookup.patch +# v4.26~34 "aio: fix off-by-one error in indexed xlat lookup" Patch8: 0008-aio-fix-off-by-one-error-in-indexed-xlat-lookup.patch +# v4.26~31 "rtnl_link: fix off-by-one errors in indexed and sorted xlat lookups" Patch9: 0009-rtnl_link-fix-off-by-one-errors-in-indexed-and-sorte.patch +# v4.26~30 "rtnl_link: fix off-by-one errors in indexed and sorted xlat lookups" Patch10: 0010-xlat_idx-do-not-issue-warnings-for-holes-in-indices.patch -# man page updates +## man page updates +# v4.26~27 "strace.1.in: print names of entities in bold, provide man page sections" Patch11: 0011-strace.1.in-print-names-of-entities-in-bold-provide-.patch +# v4.26~26 "strace.1.in: consistently use CTRL-combinations" Patch12: 0012-strace.1.in-consistently-use-CTRL-combinations.patch -# License change +## License change +# v4.26~53 "tests: change the license to GPL-2.0-or-later" Patch13: 0013-tests-change-the-license-to-GPL-2.0-or-later.patch +# v4.26~52 "Change the license of strace to LGPL-2.1-or-later" Patch14: 0014-Change-the-license-of-strace-to-LGPL-2.1-or-later.patch -# Tests fixes +## Tests fixes, can be hit on newer kernels +# v5.0~95 "tests: use tail_alloc instead of calloc in bpf-obj_get_info_by_fd-prog*" Patch15: 0015-tests-use-tail_alloc-instead-of-calloc-in-bpf-obj_ge.patch +# v5.0~94 "tests: fix prog_info initialization in bpf-obj_get_info_by_fd-prog*" Patch16: 0016-tests-fix-prog_info-initialization-in-bpf-obj_get_in.patch -# General bug fixes +## General bug fixes +# v5.0~71 "Merge "<... resumed>" printing" Patch17: 0017-Merge-.-resumed-printing.patch +# v5.0~69 "Use accessors for tcp->s_ent, return a stub struct if it is NULL" Patch18: 0018-Use-accessors-for-tcp-s_ent-return-a-stub-struct-if-.patch +# v5.0~66 "syscall.c: set MEMORY_MAPPING_CHANGE in stub sysent" Patch19: 0019-syscall.c-set-MEMORY_MAPPING_CHANGE-in-stub-sysent.patch -# Addresses https://bugzilla.redhat.com/1662936 ("strace reports -# 'ptrace(SYSCALL): No such process' on multi-threaded testcase on RHEL-8") +## Addresses https://bugzilla.redhat.com/1662936 ("strace reports +## 'ptrace(SYSCALL): No such process' on multi-threaded testcase on RHEL-8") +# v5.0~67 "Make inline message on failed restart attempt more verbose" Patch20: 0020-Make-inline-message-on-failed-restart-attempt-more-v.patch +# v5.0~64 "ptrace_restart: do not print diagnostics when ptrace returns ESRCH" Patch21: 0021-ptrace_restart-do-not-print-diagnostics-when-ptrace-.patch -# Pre-requisites for the queueing patch +## Pre-requisites for the queueing patch +# v5.0~60 "tests: add kill_child test" Patch22: 0022-tests-add-kill_child-test.patch +# v5.0~30 "tests: move PTRACE_SEIZE check to a separate file" Patch23: 0023-tests-move-PTRACE_SEIZE-check-to-a-separate-file.patch +# v5.0~29 "tests: check tracing of orphaned process group" Patch24: 0024-tests-check-tracing-of-orphaned-process-group.patch +# v5.0~27 "tests: check tracing of looping threads" Patch25: 0025-tests-check-tracing-of-looping-threads.patch -# Implementation of tcp queueing -# Addresses https://bugzilla.redhat.com/1609318 ("Some threads are not created -# when strace with -f option is executed") and all previous its incarnations -# (478419, 526740, 851457, 1610774). +## Implementation of tcp queueing +## Addresses https://bugzilla.redhat.com/1609318 ("Some threads are not created +## when strace with -f option is executed") and all previous its incarnations +## (478419, 526740, 851457, 1610774). +# v5.0~26 "Add a generic list implementation" Patch26: 0026-Add-a-generic-list-implementation.patch +# v5.0~25 "Implement queueing of threads before dispatching them" Patch27: 0027-Implement-queueing-of-threads-before-dispatching-the.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"). -Patch28: 0028-Wire-up-rseq-syscall-on-architectures-that-use-gener.patch -Patch29: 0029-Wire-up-kexec_file_load-syscall-on-architectures-tha.patch +## Pre-requisites for "evdev: fix array size calculation in decode_bitset_" +# v4.25~30 "macros: add ROUNDUP macro" +Patch28: 0028-macros-add-ROUNDUP-macro.patch +# v5.0~45 "util: update dumpstr" (only macros.h change) +Patch29: 0029-util-update-dumpstr.patch -# Limit scope of qual_fault.test in order to avoid test timeout on aarch64 -Patch30: 0030-limit-qual_fault-test-on-aarch64.patch +## Reported by covscan +# v5.2-3-g7ada13f "evdev: avoid bit vector decoding on non-successful and 0 return codes" +Patch30: 0030-evdev-avoid-bit-vector-decoding-on-non-successful-an.patch +# v5.2-4-g96194ed "evdev: fix array size calculation in decode_bitset_" +Patch31: 0031-evdev-fix-array-size-calculation-in-decode_bitset_.patch -Patch31: 0031-avoid-zero-length-VLA-in-evdev_c.patch +## Pre-requisite for "tests: test evdev bitset decoding more thoroughly" +# v4.25~89 "tests: check decoding of successful evdev ioctl" +Patch32: 0032-tests-check-decoding-of-successful-evdev-ioctl.patch + +## Test for patches "evdev: avoid bit vector decoding on non-successful and 0 +## return codes" and "evdev: fix array size calculation in decode_bitset_" +# v5.2-5-gcdd8206 "tests: test evdev bitset decoding more thoroughly" +Patch33: 0033-tests-test-evdev-bitset-decoding-more-thoroughly.patch + +## https://bugzilla.redhat.com/1747475 https://bugzilla.redhat.com/1747514 +# v4.26~65 "s390x: beautify sthyi data tail prints" +Patch34: 0034-s390x-beautify-sthyi-data-tail-prints.patch + +## Reported by covscan (https://bugzilla.redhat.com/1747524 +## https://bugzilla.redhat.com/1747526 https://bugzilla.redhat.com/1747530) +# v5.2-84-g91281fec "v4l2: avoid shifting left a signed number by 31 bit" +Patch35: 0035-v4l2-avoid-shifting-left-a-signed-number-by-31-bit.patch +# v5.2~21 "syscall.c: avoid infinite loop in subcalls parsing" +Patch36: 0036-syscall.c-avoid-infinite-loop-in-subcalls-parsing.patch +# v5.2~19 "kvm: avoid bogus vcpu_info assignment in vcpu_register" +Patch37: 0037-kvm-avoid-bogus-vcpu_info-assignment-in-vcpu_registe.patch +# v5.4~97 "xlat: use unsgined type for mount_flags fallback values" +Patch38: 0038-xlat-use-unsgined-type-for-mount_flags-fallback-valu.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"). +# v5.0~62 "Wire up rseq syscall on architectures that use generic unistd.h" +Patch100: 0100-Wire-up-rseq-syscall-on-architectures-that-use-gener.patch +# v5.0~61 "Wire up kexec_file_load syscall on architectures that use generic unistd.h" +Patch101: 0101-Wire-up-kexec_file_load-syscall-on-architectures-tha.patch + +### RHEL7-only: headers on some builders do not provide O_TMPFILE +#Patch200: 0200-strace-provide-O_TMPFILE-fallback-definition.patch +## RHEL-only: aarch64 brew builders are extremely slow on qual_fault.test +Patch201: 0201-limit-qual_fault-scope-on-aarch64.patch +## RHEL8.2-only: disable ksysent test due to missing rebase +Patch202: 0202-disable-ksysent-on-8.2.patch # We no longer need to build a separate strace32 binary, but we don't want # to break existing strace32 users' workflows. @@ -130,12 +199,25 @@ received by a process. %patch29 -p1 %patch30 -p1 %patch31 -p1 +%patch32 -p1 +%patch33 -p1 +%patch34 -p1 +%patch35 -p1 +%patch36 -p1 +%patch37 -p1 +%patch38 -p1 -chmod a+x tests/*.test +%patch100 -p1 +%patch101 -p1 + +#%patch200 -p1 +%patch201 -p1 +%patch202 -p1 echo -n %version-%release > .tarball-version echo -n 2019 > .year -echo -n 2019-06-12 > .strace.1.in.date +echo -n 2019-12-02 > .strace.1.in.date + %build echo 'BEGIN OF BUILD ENVIRONMENT INFORMATION' @@ -149,6 +231,16 @@ kver="$(printf '%%s\n%%s\n' '#include ' 'LINUX_VERSION_CODE' | printf 'kernel-headers %%s.%%s.%%s\n' $(($kver/65536)) $(($kver/256%%256)) $(($kver%%256)) echo 'END OF BUILD ENVIRONMENT INFORMATION' +CFLAGS=" $RPM_OPT_FLAGS $LDFLAGS " +# Removing explicit -m64 as it breaks mpers +[ "x${CFLAGS#* -m64 }" = "x${CFLAGS}" ] || CFLAGS=$(echo "$CFLAGS" | sed 's/ -m64 / /g') +export CFLAGS + +CPPFLAGS=" -I%{_includedir} %{optflags} " +# Removing explicit -m64 as it breaks mpers +[ "x${CPPFLAGS#* -m64 }" = "x${CPPFLAGS}" ] || CPPFLAGS=$(echo "$CPPFLAGS" | sed 's/ -m64 / /g') +export CPPFLAGS + CFLAGS_FOR_BUILD="$RPM_OPT_FLAGS"; export CFLAGS_FOR_BUILD # Commit v4.26-50-gb1a2db9 is needed for enforcing libiberty usage with # --with-libiberty @@ -168,7 +260,7 @@ rm -f %{buildroot}%{_bindir}/strace-graph # some say uncompressed changelog files are too big for f in ChangeLog ChangeLog-CVS; do - gzip -9n < "$f" > "$f".gz & + gzip -9n < "$f" > "$f".gz & done wait @@ -176,7 +268,8 @@ wait # This is needed since patch does not set x bit to the newly created files # (0022-tests-add-kill_child-test.patch, # 0024-tests-check-tracing-of-orphaned-process-group.patch, -# 0025-tests-check-tracing-of-looping-threads.patch) +# 0025-tests-check-tracing-of-looping-threads.patch, +# 0032-tests-check-decoding-of-successful-evdev-ioctl.patch) chmod u+x tests/*.test tests-m32/*.test tests-mx32/*.test %{buildroot}%{_bindir}/strace -V @@ -185,7 +278,8 @@ chmod u+x tests/*.test tests-m32/*.test tests-mx32/*.test # start to fail if the reported time is way too off from the expected one. make -j2 -k check VERBOSE=1 V=1 TIMEOUT_DURATION=5400 echo 'BEGIN OF TEST SUITE INFORMATION' -tail -n 99999 -- tests*/test-suite.log tests*/ksysent.log +tail -n 99999 -- tests*/test-suite.log +tail -n 99999 -- tests*/ksysent.log ||: find tests* -type f -name '*.log' -print0 | xargs -r0 grep -H '^KERNEL BUG:' -- ||: echo 'END OF TEST SUITE INFORMATION' @@ -201,6 +295,15 @@ echo 'END OF TEST SUITE INFORMATION' %{_mandir}/man1/* %changelog +* Mon Dec 02 2019 Eugene Syromiatnikov - 4.24-6 +- Pull upstream fix for ioctl evdev bitset decoding, fix the tests (#1747214). +- Include commit v4.26~65 "s390x: beautify sthyi data tail prints" (#1747514). +- Include upstream patches that fix issues reported by covscan (#1747526): + 91281fec "v4l2: avoid shifting left a signed number by 31 bit", + 522ad3a0 "syscall.c: avoid infinite loop in subcalls parsing", + 9446038e "kvm: avoid bogus vcpu_info assignment in vcpu_register", and + 2b64854e "xlat: use unsgined type for mount_flags fallback values". + * Fri Jun 14 2019 Eugene Syromiatnikov - 4.24-5 - Use SPDX abbreviations for licenses.