import strace-4.24-6.el8

This commit is contained in:
CentOS Sources 2020-01-21 16:51:39 -05:00 committed by Stepan Oksanichenko
parent deb006fbd9
commit cae1e73f10
17 changed files with 2751 additions and 94 deletions

View File

@ -0,0 +1,25 @@
From cbbf708b4d2f8a66b07cf805f82edbe892c0bbf7 Mon Sep 17 00:00:00 2001
From: Eugene Syromyatnikov <evgsyr@gmail.com>
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_))

View File

@ -0,0 +1,49 @@
From 79acbcf2550f3a55108240558efb8b9c36eb8399 Mon Sep 17 00:00:00 2001
From: Eugene Syromyatnikov <evgsyr@gmail.com>
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 <ldv@altlinux.org>
---
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

View File

@ -0,0 +1,42 @@
From 7ada13f3a40e2f58aea335cf910666378e7dd99a Mon Sep 17 00:00:00 2001
From: Eugene Syromyatnikov <evgsyr@gmail.com>
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

View File

@ -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;

View File

@ -0,0 +1,57 @@
From 96194ed74158f0b9976fae43a910ad14eaea141e Mon Sep 17 00:00:00 2001
From: Eugene Syromyatnikov <evgsyr@gmail.com>
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

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,795 @@
From cdd8206af74fcb961f0179e21eacf5d55d23f0ac Mon Sep 17 00:00:00 2001
From: Eugene Syromyatnikov <evgsyr@gmail.com>
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 <assert.h>
# include <inttypes.h>
# include <stdio.h>
# include <stdlib.h>
@@ -9,17 +10,19 @@
# include <linux/input.h>
# 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 <assert.h>
# include <inttypes.h>
# include <stdio.h>
# include <stdlib.h>
@@ -9,17 +10,19 @@
# include <linux/input.h>
# 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 <assert.h>
# include <inttypes.h>
# include <stdio.h>
# include <stdlib.h>
@@ -9,17 +10,19 @@
# include <linux/input.h>
# 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 }

View File

@ -0,0 +1,37 @@
From f476724ea13d6fae08219aba75a7669eb3e836b3 Mon Sep 17 00:00:00 2001
From: Janosch Frank <frankja@linux.ibm.com>
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 <frankja@linux.ibm.com>
---
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

View File

@ -0,0 +1,32 @@
From 91281fec7823f1cd3df3374fbcbd14af52a3fa1b Mon Sep 17 00:00:00 2001
From: Eugene Syromyatnikov <evgsyr@gmail.com>
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

View File

@ -0,0 +1,55 @@
From 522ad3a0e73148dadd2480cd9cec84d9112b2e57 Mon Sep 17 00:00:00 2001
From: Eugene Syromyatnikov <evgsyr@gmail.com>
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

View File

@ -0,0 +1,36 @@
From 9446038e9face3313373ca5f7539476789fd4660 Mon Sep 17 00:00:00 2001
From: Eugene Syromyatnikov <evgsyr@gmail.com>
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

View File

@ -0,0 +1,365 @@
From c26541c73c3b4be2977e719d77287255eb346cdf Mon Sep 17 00:00:00 2001
From: Eugene Syromyatnikov <evgsyr@gmail.com>
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

View File

@ -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 \

View File

@ -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.h>' '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 <esyr@redhat.com> - 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 <esyr@redhat.com> - 4.24-5
- Use SPDX abbreviations for licenses.