Dmitry V. Levin [Thu, 9 Feb 2017 22:26:14 +0000 (22:26 +0000)]
tests: check signal injection along with fault injection
* tests/qual_inject-error-signal.c: New file.
* tests/qual_inject-error-signal.expected: Likewise.
* tests/qual_inject-error-signal.test: New test.
* tests/.gitignore: Add qual_inject-error-signal.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(MISC_TESTS): Add qual_inject-error-signal.test.
(EXTRA_DIST): Add qual_inject-error-signal.expected.
Dmitry V. Levin [Thu, 9 Feb 2017 22:26:14 +0000 (22:26 +0000)]
tests: simplify qual_inject-signal.test
* tests/qual_inject-signal.test: Use $NAME instead of qual_inject-signal.
Dmitry V. Levin [Thu, 9 Feb 2017 14:38:08 +0000 (14:38 +0000)]
Make symbolic errno values match case-insensitive
Follow the example of case-insensitive symbolic signal values in signal
and inject expressions and make symbolic errno values in inject
expressions case-insensitive.
* qualify.c (find_errno_by_name): Use strcasecmp instead of strcmp
to match symbolic errno values.
* tests/qual_fault.c (main): Likewise.
* tests/qual_fault.test: Test case-insensitive symbolic errno match.
Dmitry V. Levin [Thu, 9 Feb 2017 14:38:08 +0000 (14:38 +0000)]
tests: check case-insensitive symbolic signal match
* tests/qual_signal.test: Test case-insensitive symbolic signal match.
Eugene Syromyatnikov [Wed, 8 Feb 2017 18:47:45 +0000 (19:47 +0100)]
Update NEWS
Dmitry V. Levin [Wed, 8 Feb 2017 17:22:02 +0000 (17:22 +0000)]
Update NEWS
Dmitry V. Levin [Wed, 8 Feb 2017 16:36:57 +0000 (16:36 +0000)]
strace.spec.in: fix dist version checks
* strace.spec.in: Fix libunwind availability check.
Reported-by: Eugene Syromyatnikov <evgsyr@gmail.com>
Dmitry V. Levin [Wed, 8 Feb 2017 15:54:35 +0000 (15:54 +0000)]
tests: update ipc_sem.test for new glibc
Starting with commit
glibc-2.24-553-g40c0a78, glibc may pass NULL
address to semctl like other libcs.
* tests/ipc_sem.c (main) [__GLIBC__]: Remove.
Dmitry V. Levin [Wed, 8 Feb 2017 15:12:40 +0000 (15:12 +0000)]
tests: fix typo in bpf.test
* tests/bpf.c (main): Add missing semicolon.
Fixes: ad427721 ("tests: rewrite bpf.test from match_grep to match_diff")
Dmitry V. Levin [Wed, 8 Feb 2017 13:51:33 +0000 (13:51 +0000)]
tests: check signal injection
* tests/qual_inject-signal.c: New file.
* tests/qual_inject-signal.expected: Likewise.
* tests/qual_inject-signal.test: New test.
* tests/.gitignore: Add qual_inject-signal.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(MISC_TESTS): Add qual_inject-signal.test.
(EXTRA_DIST): Add qual_inject-signal.expected.
Dmitry V. Levin [Wed, 8 Feb 2017 09:28:38 +0000 (09:28 +0000)]
Implement -e inject= option
Introduce -e inject= as a general injection option,
limit -e fault= option to syscall fault injection.
Change default return code of syscall fault injection to ENOSYS.
* qualify.c (parse_inject_token): Add fault_tokens_only argument,
do not accept retval= and signal= tokens when fault_tokens_only
is set to true.
(parse_inject_expression): Add fault_tokens_only argument,
forward it to parse_inject_token.
(qualify_inject_common): New function.
(qualify_fault): Use it.
(qualify_inject): New function.
(qual_options): New entry.
* strace.1: Describe -e inject= option.
* NEWS: Mention -e inject= option.
* tests/qual_fault-syntax.test: Test that -e fault= option does not
support retval=, signal=, and multiple error= tokens.
* tests/qual_fault.c (DEFAULT_ERRNO): Set to ENOSYS unconditionally.
* tests/qual_inject-retval.test: Replace -e fault= option
with -e inject= option.
* tests/qual_inject-syntax.test: New test.
* tests/Makefile.am (MISC_TESTS): Add it.
Dmitry V. Levin [Wed, 8 Feb 2017 09:28:30 +0000 (09:28 +0000)]
tests: prepare for introduction of -e inject= option
Rename files related to fault injection to avoid further confusion.
* tests/fault_injection-exit_group.expected: Rename
to tests/qual_fault-exit_group.expected.
* tests/fault_injection-exit_group.test: Rename
to tests/qual_fault-exit_group.test.
* tests/fault_syntax.test: Rename to tests/qual_fault-syntax.test.
* tests/fault_injection.c: Rename to tests/qual_fault.c.
* tests/fault_injection.test: Rename to tests/qual_fault.test.
* tests/fault_injection-retval.c: Rename to tests/qual_inject-retval.c.
* tests/fault_injection-retval.test: Rename
to tests/qual_inject-retval.test.
* tests/fault_injection.sh: Rename to tests/scno_tampering.sh.
* tests/.gitignore: Update.
* tests/Makefile.am (check_PROGRAMS, DECODER_TESTS, MISC_TESTS,
EXTRA_DIST): Update.
Dmitry V. Levin [Wed, 8 Feb 2017 09:28:07 +0000 (09:28 +0000)]
Prepare for introduction of -e inject= option
As -e fault= injection syntax has been extended to configure various
kinds of injections besides fault injection, the original option name
bacame too narrow.
This change renames internal constants, types, and functions from
"fault" to more generic inject/tamper ones.
* defs.h (fault_opts): Rename to inject_opts.
(FAULT_OPTS_RVAL_DEFAULT): Rename to INJECT_OPTS_RVAL_DEFAULT.
(FAULT_OPTS_RVAL_DISABLE): Rename to INJECT_OPTS_RVAL_DISABLE.
(struct tcb): Rename fault_vec field to inject_vec.
(TCB_FAULT_INJ): Rename to TCB_TAMPERED.
(QUAL_FAULT): Rename to QUAL_INJECT.
(fault_vec): Rename to inject_vec.
All users changed.
* qualify.c (fault_set): Rename to inject_set.
(parse_fault_token): Rename to parse_inject_token.
(parse_fault_expression): Rename to parse_inject_expression.
All callers changed.
* syscall.c (fault_vec): Rename to inject_vec.
(tcb_fault_opts): Rename to tcb_inject_opts.
(inject_syscall_fault_entering): Rename to tamper_with_syscall_entering.
(update_syscall_fault_exiting): Rename to tamper_with_syscall_exiting.
(syscall_fault_injected): Rename to syscall_tampered.
All callers changed.
Dmitry V. Levin [Tue, 7 Feb 2017 16:11:05 +0000 (16:11 +0000)]
tests: make Makefile.am lists sorted in C locale
* tests/Makefile.am (check_PROGRAMS, DECODER_TESTS, MISC_TESTS,
EXTRA_DIST): Make sorted in C locale.
Dmitry V. Levin [Tue, 7 Feb 2017 15:25:41 +0000 (15:25 +0000)]
tests: use ARG_STR in msg_control.test
Drop local VAL_STR macro in favour of ARG_STR macro from tests/tests.h.
* tests/msg_control.c (VAL_STR): Remove.
(test_sol_socket, test_sol_ip): Replace VAL_STR with ARG_STR.
Dmitry V. Levin [Tue, 7 Feb 2017 14:58:30 +0000 (14:58 +0000)]
powerpc, powerpc64: wire up new syscalls
* linux/powerpc/syscallent.h [382]: Add kexec_file_load entry.
* linux/powerpc64/syscallent.h [382]: Likewise.
Dmitry V. Levin [Tue, 7 Feb 2017 14:58:30 +0000 (14:58 +0000)]
microblaze: wire up new syscalls
* linux/microblaze/syscallent.h [392..397]: New entries.
Dmitry V. Levin [Tue, 7 Feb 2017 14:58:30 +0000 (14:58 +0000)]
avr32: wire up new syscalls
* linux/avr32/syscallent.h [328..330]: New entries.
Dmitry V. Levin [Mon, 6 Feb 2017 22:13:20 +0000 (22:13 +0000)]
Update IPV6_* constants
* xlat/sockipv6options.in: Add IPV6_RECVFRAGSIZE introduced
by linux kernel commit v4.10-rc1~202^2~340^2~1.
Dmitry V. Levin [Mon, 6 Feb 2017 22:13:20 +0000 (22:13 +0000)]
Update IP_* constants
* xlat/sockipoptions.in: Add IP_RECVFRAGSIZE introduced
by linux kernel commit v4.10-rc1~202^2~340^2~2.
Jacob Goense [Mon, 6 Feb 2017 13:00:34 +0000 (14:00 +0100)]
or1k: fix build
This fixes a typo in the arch_set_success for the or1k architecture.
* linux/or1k/set_error.c (arch_setsuccess): Rename to arch_set_success.
Fixes: 41d647c ("Implement success injection")
Closes: https://github.com/strace/strace/pull/6
Gleb Fotengauer-Malinovskiy [Thu, 2 Feb 2017 16:08:09 +0000 (19:08 +0300)]
Update ioctl entries from linux 4.10
* linux/32/ioctls_inc_align16.h: Update from linux v4.10 using ioctls_gen.sh.
* linux/32/ioctls_inc_align32.h: Likewise.
* linux/32/ioctls_inc_align64.h: Likewise.
* linux/64/ioctls_inc.h: Likewise.
* linux/x32/ioctls_inc0.h: Likewise.
* NEWS: Mention this.
Gleb Fotengauer-Malinovskiy [Fri, 3 Feb 2017 08:23:10 +0000 (11:23 +0300)]
maint: update for linux 4.10
* maint/ioctls_sym.sh: Update workaround for linux/if_pppox.h file.
Gleb Fotengauer-Malinovskiy [Thu, 2 Feb 2017 16:06:29 +0000 (19:06 +0300)]
maint: add workaround for m68k
* maint/ioctls_sym.sh: Skip asm/amigayle.h.
Dmitry V. Levin [Tue, 31 Jan 2017 19:38:45 +0000 (19:38 +0000)]
tests: check decoding of bpf corner cases
* tests/bpf.c (bogus_bpf): New function.
(BOGUS_BPF): New macro.
(main): Use them.
* tests/bpf.test: Add -a option.
Dmitry V. Levin [Sun, 29 Jan 2017 23:12:07 +0000 (23:12 +0000)]
tests: rewrite bpf.test from match_grep to match_diff
* tests/bpf.c (errstr): New variable.
(sys_bpf): New function.
(map_create, map_any, prog_load, obj_manage, prog_cgroup): Use it.
(main): Update expected output.
* tests/bpf.test: Use run_strace_match_diff.
Dmitry V. Levin [Sat, 28 Jan 2017 22:11:20 +0000 (22:11 +0000)]
bpf: move common code to a separate function
* bpf.c (bpf_prog_attach_detach): New function.
(bpf_prog_attach, bpf_prog_detach): Use it.
Quentin Monnet [Thu, 26 Jan 2017 14:36:56 +0000 (15:36 +0100)]
Update bpf syscall decoding
Implement decoding of BPF_OBJ_PIN, BPF_OBJ_GET, BPF_PROG_ATTACH,
and BPF_PROG_DETACH commands.
* bpf.c: Include "xlat/bpf_attach_type.h".
(bpf_obj_manage, bpf_prog_attach, bpf_prog_detach): New functions.
(SYS_FUNC(bpf)): Use them.
* configure.ac: Check for union bpf_attr.bpf_fd and union
bpf_attr.attach_type.
* xlat/bpf_attach_type.in: New file.
* xlat/bpf_commands.in: Update list of BPF_* command constants.
* xlat/bpf_map_types.in: Update list of BPF_MAP_TYPE_* constants.
* xlat/bpf_prog_types.in: Update list of BPF_PROG_TYPE_* constants.
* tests/bpf.c [HAVE_UNION_BPF_ATTR_BPF_FD] (obj_manage): New function.
[HAVE_UNION_BPF_ATTR_ATTACH_TYPE] (prog_cgroup): Likewise.
(main): Use them.
Elvira Khabirova [Tue, 24 Jan 2017 23:59:33 +0000 (02:59 +0300)]
tests: check success injection
* tests/fault_injection-retval.c: New file.
* tests/fault_injection-retval.test: New test.
* tests/.gitignore: Add fault_injection-retval.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(MISC_TESTS): Add fault_injection-retval.test.
Elvira Khabirova [Tue, 24 Jan 2017 23:59:16 +0000 (02:59 +0300)]
Implement success injection
This extends fault injection syntax with :retval= option.
When :retval=VALUE is specified, the syscall number is replaced by -1
and a bogus success VALUE is returned to the callee.
* defs.h (fault_opts): Remove err field, add rval field.
(MAX_ERRNO_VALUE, FAULT_OPTS_RVAL_DEFAULT, FAULT_OPTS_RVAL_DISABLE):
New macros.
* qualify.c (parse_fault_token): Handle retval= token.
(qualify_fault): Update fault_opts initialization after the move
from struct fault_opts.err to struct fault_opts.rval.
* syscall.c (arch_set_success): New prototype.
(inject_syscall_fault_entering): Check opts->rval instead of opts->err.
(update_syscall_fault_exiting): Implement retval injection.
* strace.1: Update the section on fault injection.
* NEWS: Mention retval= option.
* linux/aarch64/set_error.c (arch_set_success): New function.
* linux/alpha/set_error.c: Likewise.
* linux/arc/set_error.c: Likewise.
* linux/arm/set_error.c: Likewise.
* linux/avr32/set_error.c: Likewise.
* linux/bfin/set_error.c: Likewise.
* linux/crisv10/set_error.c: Likewise.
* linux/hppa/set_error.c: Likewise.
* linux/i386/set_error.c: Likewise.
* linux/ia64/set_error.c: Likewise.
* linux/m68k/set_error.c: Likewise.
* linux/metag/set_error.c: Likewise.
* linux/microblaze/set_error.c: Likewise.
* linux/mips/set_error.c: Likewise.
* linux/nios2/set_error.c: Likewise.
* linux/or1k/set_error.c: Likewise.
* linux/powerpc/set_error.c: Likewise.
* linux/riscv/set_error.c: Likewise.
* linux/s390/set_error.c: Likewise.
* linux/sh/set_error.c: Likewise.
* linux/sh64/set_error.c: Likewise.
* linux/sparc/set_error.c: Likewise.
* linux/sparc64/set_error.c: Likewise.
* linux/tile/set_error.c: Likewise.
* linux/x86_64/set_error.c: Likewise.
* linux/xtensa/set_error.c: Likewise.
Closes: https://github.com/strace/strace/issues/3
Dmitry V. Levin [Thu, 26 Jan 2017 23:57:17 +0000 (23:57 +0000)]
mips: rewrite configure check without sgidefs.h
Use builtin macros provided by gcc >= 3.4 instead of sgidefs.h macros.
* configure.ac <mips>: Do not include <asm/sgidefs.h>, use _ABIO32
instead of _MIPS_SIM_ABI32, _ABIN32 instead of _MIPS_SIM_NABI32,
and _ABI64 instead of _MIPS_SIM_ABI64.
Elvira Khabirova [Fri, 20 Jan 2017 18:21:02 +0000 (21:21 +0300)]
.gitignore: add missing files that should be ignored
* .gitignore: Add /ioctl_iocdef.[ih].
Fixes: 5679fad ("ioctlsort: get ioctl definitions from host, not build")
Andre McCurdy [Fri, 5 Feb 2016 22:00:00 +0000 (14:00 -0800)]
mips: use <asm/sgidefs.h>
Build fix for MIPS with musl libc.
The MIPS specific header <sgidefs.h> is provided by glibc and uclibc
but not by musl. Regardless of the libc, the kernel headers provide
<asm/sgidefs.h> which provides the same definitions, so use that
instead.
* configure.ac: Replace <sgidefs.h> with <asm/sgidefs.h>.
Signed-off-by: Andre McCurdy <armccurdy@gmail.com>
Signed-off-by: Dmitry V. Levin <ldv@altlinux.org>
JingPiao Chen [Tue, 17 Jan 2017 07:55:58 +0000 (15:55 +0800)]
Implement decoding of ustat syscall
* configure.ac (AC_CHECK_HEADERS): Add ustat.h.
* ustat.c: New file.
* Makefile.am (strace_SOURCES): Add it.
* linux/dummy.h: Remove sys_ustat.
* tests/ustat.c: New file.
* tests/ustat.test: New test.
* tests/.gitignore: Add ustat.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add ustat.test.
JingPiao Chen [Thu, 19 Jan 2017 06:59:51 +0000 (14:59 +0800)]
Makefile.am: allow indented DEF_MPERS_TYPE includes
* Makefile.am (m%_type_defs.h): Change sed regular expression to allow
arbitrary number of whitespace characters between "#" symbol
and "include" directive.
JingPiao Chen [Tue, 17 Jan 2017 07:55:59 +0000 (15:55 +0800)]
strace.1: fix formatting
* strace.1: Remove misplaced .TP macros.
Dmitry V. Levin [Fri, 13 Jan 2017 20:07:09 +0000 (20:07 +0000)]
tests: drop non-USE_ASM_STAT case support
With the switch of fstatat family tests to USE_ASM_STAT variant,
there are no non-USE_ASM_STAT users left. Remove support of unused
non-USE_ASM_STAT case.
* configure.ac (AC_CHECK_MEMBERS): Remove struct stat.st_mtim.tv_nsec.
* tests/fstatat.c (USE_ASM_STAT): Remove.
* tests/fstatx.c: Likewise.
* tests/lstatx.c: Likewise.
* tests/xstatx.c: Assume USE_ASM_STAT.
[!USE_ASM_STAT]: Remove.
Dmitry V. Levin [Fri, 13 Jan 2017 19:54:57 +0000 (19:54 +0000)]
tests: call newfstatat and fstatat64 syscalls directly
Do not use glibc wrappers to call newfstatat and fstatat64.
These wrappers have various problems, e.g. they segfault on sparc64
and mips64 if BOGUS_STRUCT_STAT is not disabled, and they do wrong
conversion of timestamps on mips64.
* tests/fstatat.c (TEST_SYSCALL_INVOKE): Invoke the relevant syscall
directly.
(USE_ASM_STAT): Define.
* tests/fstatat64.c (TEST_BOGUS_STRUCT_STAT): Remove.
(STRUCT_STAT, STRUCT_STAT_STR, STRUCT_STAT_IS_STAT64): Define.
Based on patch by James Cowgill <james410@cowgill.org.uk>.
Dmitry V. Levin [Fri, 13 Jan 2017 19:39:18 +0000 (19:39 +0000)]
tests: remove redundant SAMPLE_SIZE definitions
Remove all definitions of SAMPLE_SIZE that are identical to the fallback
definition in tests/xstatx.c.
* tests/fstat64.c (SAMPLE_SIZE): Remove.
* tests/lstat64.c (SAMPLE_SIZE): Remove.
* tests/stat64.c (SAMPLE_SIZE): Remove.
Dmitry V. Levin [Fri, 13 Jan 2017 19:31:30 +0000 (19:31 +0000)]
tests: change SAMPLE_SIZE type to libc_off_t
As ftruncate libc function and our create_sample function that calls
ftruncate both take size argument of type libc_off_t, change the type
of SAMPLE_SIZE constant to libc_off_t.
* tests/fstat.c (SAMPLE_SIZE): Cast to libc_off_t.
* tests/lstat.c (SAMPLE_SIZE): Likewise.
* tests/oldfstat.c (SAMPLE_SIZE): Likewise.
* tests/oldlstat.c (SAMPLE_SIZE): Likewise.
* tests/oldstat.c (SAMPLE_SIZE): Likewise.
* tests/stat.c (SAMPLE_SIZE): Likewise.
* tests/xstatx.c (SAMPLE_SIZE): Likewise.
Alexey Neyman [Thu, 12 Jan 2017 21:15:59 +0000 (13:15 -0800)]
ioctlsort: get ioctl definitions from host, not build
When cross-compiling, ioctlsort must obtain _IOC_* values from the
host, build's values may be incompatible.
* ioctl_iocdef.c: New file.
* Makefile.am (EXTRA_DIST): Add it.
(ioctl_iocdef.i, ioctl_iocdef.h): New rules.
(ioctlsort%.o): Depend on ioctl_iocdef.h.
(CLEANFILES): Add ioctl_iocdef.h and ioctl_iocdef.i.
* ioctlsort.c: Include "ioctl_iocdef.h" instead of <linux/ioctl.h>.
Signed-off-by: Alexey Neyman <stilor@att.net>
Signed-off-by: Dmitry V. Levin <ldv@altlinux.org>
Dmitry V. Levin [Fri, 13 Jan 2017 01:14:51 +0000 (01:14 +0000)]
tests: treat struct stat mismatch as an error
If the test detects struct stat mismatch, this is likely an error
in definitions of a stat structure that might affect strace as well.
Fail the test instead of skipping it to attract more attention.
* tests/xstatx.c (main): Return 1 instead of 77
in case of struct stat mismatch.
Dmitry V. Levin [Thu, 12 Jan 2017 23:01:32 +0000 (23:01 +0000)]
tests: rewrite diagnostics about struct stat mismatch
* tests/xstatx.c (LOG_STAT_OFFSETOF_SIZEOF): New macro.
(main): Use it to print struct stat mismatch details.
Dmitry V. Levin [Thu, 12 Jan 2017 22:52:17 +0000 (22:52 +0000)]
tests: fix typo in tests/xstatx.c
* tests/xstatx.c [!IS_FSTAT]: Define IS_FSTAT instead of IS_STAT.
JingPiao Chen [Thu, 12 Jan 2017 13:56:07 +0000 (21:56 +0800)]
tests: fix typo in mlock.c
* tests/mlock.c [!(__NR_mlock && __NR_munlock)]: Fix spelling
of SKIP_MAIN_UNDEFINED.
JingPiao Chen [Fri, 6 Jan 2017 07:16:27 +0000 (15:16 +0800)]
strace: move description of -k option to the appropriate place
Follow the example of strace.1 and put the description of -k option
into the output format group.
* strace.c (usage): Move description of -k option to the output
format group.
Dmitry V. Levin [Wed, 11 Jan 2017 23:48:41 +0000 (23:48 +0000)]
Remove redundant commas at the end of structure initializers
Automatically remove redundant commas using the following
sed expression:
git grep -El ',[[:space:]]+}' |xargs sed -ri 's/,([[:space:]]+\})/\1/'
* linux/32/syscallent.h: Remove redundant commas at the end of structure
initializers.
* linux/64/syscallent.h: Likewise.
* linux/alpha/syscallent.h: Likewise.
* linux/arm/syscallent.h: Likewise.
* linux/avr32/syscallent.h: Likewise.
* linux/bfin/syscallent.h: Likewise.
* linux/crisv10/syscallent.h: Likewise.
* linux/hppa/syscallent.h: Likewise.
* linux/i386/syscallent.h: Likewise.
* linux/ia64/syscallent.h: Likewise.
* linux/m68k/syscallent.h: Likewise.
* linux/microblaze/syscallent.h: Likewise.
* linux/microblaze/userent.h: Likewise.
* linux/mips/syscallent-n32.h: Likewise.
* linux/mips/syscallent-n64.h: Likewise.
* linux/mips/syscallent-o32.h: Likewise.
* linux/powerpc/syscallent.h: Likewise.
* linux/powerpc64/syscallent.h: Likewise.
* linux/s390/syscallent.h: Likewise.
* linux/s390x/syscallent.h: Likewise.
* linux/sh/syscallent.h: Likewise.
* linux/sh64/syscallent.h: Likewise.
* linux/sparc/syscallent.h: Likewise.
* linux/sparc64/syscallent.h: Likewise.
* linux/x32/syscallent.h: Likewise.
* linux/x86_64/syscallent.h: Likewise.
* linux/xtensa/syscallent.h: Likewise.
* tests/kexec_file_load.c: Likewise.
Reported-by: Eugene Syromyatnikov <evgsyr@gmail.com>
Dmitry V. Levin [Tue, 10 Jan 2017 00:05:17 +0000 (00:05 +0000)]
tests: check decoding of scsi ioctl commands
* tests/ioctl_scsi.c: New file.
* tests/ioctl_scsi.test: New test.
* tests/.gitignore: Add ioctl_scsi.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add ioctl_scsi.test.
Dmitry V. Levin [Mon, 9 Jan 2017 16:01:08 +0000 (16:01 +0000)]
scsi: implement decoding of all SG_* ioctl commands
* print_sg_req_info.c: New file.
* Makefile.am (strace_SOURCES): Add it.
* xlat/sg_scsi_reset.in: New file.
* scsi.c: Include "xlat/sg_scsi_reset.h".
(scsi_ioctl): Implement decoding of all SG_* ioctl commands.
Dmitry V. Levin [Mon, 9 Jan 2017 13:53:27 +0000 (13:53 +0000)]
scsi: prepare for decoding of other SG_* ioctl commands
* scsi.c (scsi_ioctl): Introduce a switch statement.
Dmitry V. Levin [Mon, 9 Jan 2017 00:22:42 +0000 (00:22 +0000)]
tests: check decoding of ioctl SG_IO v3 commands
* tests/ioctl_sg_io_v3.c: New file.
* tests/ioctl_sg_io_v3.test: New test.
* tests/.gitignore: Add ioctl_sg_io_v3.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add ioctl_sg_io_v3.test.
Dmitry V. Levin [Mon, 9 Jan 2017 00:22:42 +0000 (00:22 +0000)]
tests: check decoding of ioctl SG_IO v4 commands
* tests/ioctl_sg_io_v4.c: New file.
* tests/ioctl_sg_io_v4.test: New test.
* tests/.gitignore: Add ioctl_sg_io_v4.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add ioctl_sg_io_v4.test.
Dmitry V. Levin [Mon, 9 Jan 2017 02:40:08 +0000 (02:40 +0000)]
scsi: add fallback definitions for SG_* ioctl command constants
Unfortunately, <scsi/sg.h> from libc does not provide all constants
recognized by the kernel.
* xlat/scsi_sg_commands.in: New file.
* scsi.c: Include "xlat/scsi_sg_commands.h" instead of providing
a fallback definition of SG_IO.
Dmitry V. Levin [Mon, 9 Jan 2017 00:13:58 +0000 (00:13 +0000)]
xlat: provide fallback definitions for BSG_FLAG_* constants
BSG_FLAG_* constants were introduced later than the header file where
they are defined.
* xlat/bsg_flags.in: Add default values for constants.
Dmitry V. Levin [Mon, 9 Jan 2017 00:13:58 +0000 (00:13 +0000)]
xlat: provide fallback definitions for SG_FLAG_* constants
Unfortunately, <scsi/sg.h> from libc does not provide all constants
recognized by the kernel.
* xlat/sg_io_flags.in: Add default values for constants.
Dmitry V. Levin [Sun, 8 Jan 2017 21:43:41 +0000 (21:43 +0000)]
sg_io_v4: print din_resid and dout_resid fields as signed integers
* sg_io_v4.c (decode_response): Print din_resid and dout_resid fields
using %d format.
Dmitry V. Levin [Sun, 8 Jan 2017 18:31:51 +0000 (18:31 +0000)]
sg_io: cleanup printing of sg_io buffers
Turn print_sg_io_buffer into a universal sg_io buffer printer.
* sg_io_v3.c (print_sg_io_buffer): Add iovec_count argument.
Call tprint_iov_upto when iovec_count is non-zero.
(decode_request, decode_response): Do not call tprint_iov_upto directly,
use print_sg_io_buffer instead.
* sg_io_v4.c: Likewise.
Dmitry V. Levin [Sun, 8 Jan 2017 17:43:21 +0000 (17:43 +0000)]
sg_io: decode structures on exiting syscall in case of syserror
The SCSI driver, starting with kernel commit v2.6.25-rc1~1230^2~78,
translates its "struct request.errors" to ioctl errors after
filling in all the output members of the SG_IO header structure.
As there is no easy way to tell SCSI layer errors from other syscall
errors, decode the structure on exiting syscall in case of syserror,
too.
* scsi.c (scsi_ioctl): Do not call set_tcb_priv_ulong, use
get_tcb_priv_data instead of get_tcb_priv_ulong, call decode_sg_io
unconditionally.
* sg_io_v3.c (decode_request): Save a copy of struct_sg_io_hdr using
set_tcb_priv_data.
(decode_response): Restore it using get_tcb_priv_data. Print its i/o
fields when umove call fails. Pass IOV_DECODE_STR to tprint_iov_upto
unconditionally.
* sg_io_v4.c (decode_request): Save a copy of struct sg_io_v4 using
set_tcb_priv_data.
(decode_response): Restore it using get_tcb_priv_data. Print its i/o
fields when umove call fails. Pass IOV_DECODE_STR to tprint_iov_upto
unconditionally.
Dmitry V. Levin [Sun, 8 Jan 2017 16:55:48 +0000 (16:55 +0000)]
sg_io: reorder printing of fields to follow structure order
* sg_io_v4.c (decode_request): Print timeout, flags, and usr_ptr fields
after dout_xferp field.
Dmitry V. Levin [Sun, 8 Jan 2017 16:53:53 +0000 (19:53 +0300)]
sg_io_v3: print sg_io_hdr.duration field as unsigned integer
* sg_io_v3.c (decode_response): Print duration field using %u format.
Dmitry V. Levin [Sun, 8 Jan 2017 16:52:05 +0000 (19:52 +0300)]
sg_io_v3: print msg_status field
* sg_io_v3.c (decode_response): Print msg_status field.
Dmitry V. Levin [Sun, 8 Jan 2017 16:00:01 +0000 (16:00 +0000)]
sg_io: print names of array fields and corresponding length fields
* sg_io_v3.c (decode_request): Print names of cmd_len, cmdp,
and dxferp fields.
(decode_response): Print names of dxferp, sb_len_wr, and sbp fields.
* sg_io_v4.c (decode_request): Print names of request_len, request,
dout_xfer_len, and dout_xferp fields.
(decode_response): Print names of response_len, response,
and din_xferp fields.
Dmitry V. Levin [Sun, 8 Jan 2017 15:43:40 +0000 (15:43 +0000)]
sg_io_v3: print status fields using %#x format specifier
The formerly used format string %02x led to misleading output as there
was no clear indication sometimes whether the printed integer was
decimal or hexadecimal.
* sg_io_v3.c (decode_response): Print status and masked_status fields
using %#x format specifier instead of %02x.
Dmitry V. Levin [Sun, 8 Jan 2017 15:41:06 +0000 (15:41 +0000)]
sg_io_v4: print status fields in a hexadecimal form
The tradition is to print scsi status codes in a hexadecimal form.
* sg_io_v4.c (decode_response): Print driver_status, transport_status,
and device_status fields using %#x format specifier instead of %u.
Dmitry V. Levin [Sun, 8 Jan 2017 15:36:42 +0000 (15:36 +0000)]
sg_io_v4: print request_tag and generated_tag fields in hex
The tradition is to print scsi tags in a hexadecimal form.
* sg_io_v4.c (decode_request): Print request_tag field
using ("%#" PRI__x64) format string.
(decode_response): Print generated_tag field using ("%#" PRI__x64)
format string.
Dmitry V. Levin [Sun, 8 Jan 2017 15:36:42 +0000 (15:36 +0000)]
sg_io_v4: print usr_ptr field in a hexadecimal form
As the nature of this field is pointer-like, print it
in a hexadecimal form.
* sg_io_v4.c (decode_request): Print usr_ptr field
using ("%#" PRI__x64) format string.
Dmitry V. Levin [Sun, 8 Jan 2017 15:33:30 +0000 (15:33 +0000)]
sg_io_v4: do not print spare_in and spare_out fields
As the kernel does not touch these fields, there is no use
to print them.
* sg_io_v4.c (decode_request): Do not print spare_in field.
(decode_response): Do not print spare_out field.
Dmitry V. Levin [Sun, 8 Jan 2017 03:27:18 +0000 (03:27 +0000)]
sg_io: decode struct sg_io_hdr.info and struct sg_io_v4.info
Print struct sg_io_hdr.info and struct sg_io_v4.info using printflags.
* xlat/sg_io_info.in: New file.
* defs.h (sg_io_info): New xlat prototype.
* sg_io_v3.c: Include "xlat/sg_io_info.h".
(decode_response): Print struct_sg_io_hdr.info using printflags.
* sg_io_v4.c: (decode_response): Print struct sg_io_v4.info
using printflags.
Dmitry V. Levin [Sun, 8 Jan 2017 01:20:59 +0000 (01:20 +0000)]
sg_io: decode struct sg_io_hdr.flags and struct sg_io_v4.flags
Print struct sg_io_hdr.flags and struct sg_io_v4.flags using printflags.
* xlat/sg_io_flags.in: New file.
* sg_io_v3.c: Include "xlat/sg_io_flags.h".
(decode_request): Print struct_sg_io_hdr.flags using printflags.
* xlat/bsg_flags.in: New file.
* sg_io_v4.c: Include "xlat/bsg_flags.h".
(decode_request): Print struct sg_io_v4.flags using printflags.
Dmitry V. Levin [Sun, 8 Jan 2017 00:26:36 +0000 (00:26 +0000)]
Mpersify struct sg_io_hdr
struct sg_io_hdr contains pointers and therefore has to be mpersified.
* defs.h (decode_sg_io_v3): Remove prototype.
* sg_io_v3.c (struct_sg_io_hdr): Typedef to struct sg_io_hdr.
Mpersify it.
(decode_sg_io_v3): Wrap into MPERS_PRINTER_DECL.
Dmitry V. Levin [Sun, 8 Jan 2017 00:01:03 +0000 (00:01 +0000)]
Split scsi.c
Move decoders of SG_IO v3 and v4 APIs into separate files,
compile generic SG_IO decoder unconditionally.
* sg_io_v3.c: New file.
* sg_io_v4.c: Likewise.
* Makefile.am (strace_SOURCES): Add them.
* defs.h (decode_sg_io_v3, decode_sg_io_v4): New prototypes.
* ioctl.c (ioctl_decode): Remove [HAVE_SCSI_SG_H] condition.
* scsi.c: (print_sg_io_res): Remove.
(print_sg_io_req): Rename to decode_sg_io, replace print_sg_io_v3_req
with decode_sg_io_v3, replace print_sg_io_v4_req with decode_sg_io_v4,
compile uncoditionally.
(scsi_ioctl): Replace print_sg_io_req and print_sg_io_res
with decode_sg_io, compile uncoditionally.
Move [HAVE_SCSI_SG_H] code to sg_io_v3.c.
Move [HAVE_LINUX_BSG_H] code to sg_io_v4.c.
Dmitry V. Levin [Sat, 7 Jan 2017 19:09:37 +0000 (19:09 +0000)]
scsi: detect and print changes of interface id
* scsi.c (print_sg_io_v3_res): Detect and print changes
of struct sg_io_hdr.interface_id field between entering and exiting
syscall.
(print_sg_io_v4_res): Detect and print changes of struct sg_io_v4.guard
field between entering and exiting syscall.
Dmitry V. Levin [Sat, 7 Jan 2017 19:01:27 +0000 (22:01 +0300)]
scsi: print field names of all fields being printed
* scsi.c (print_sg_io_v3_req): Always print the name
of struct sg_io_hdr.interface_id field.
(print_sg_io_v4_req): Always print the name of struct sg_io_v4.guard
field.
(print_sg_io_req): Print unknown interface id as an integer.
(scsi_ioctl): Save interface id on entering syscall and use it
on exiting syscall.
Dmitry V. Levin [Sat, 7 Jan 2017 18:55:40 +0000 (21:55 +0300)]
scsi: print struct sg_io_hdr.dxfer_direction field name
* scsi.c (print_sg_io_v3_req): Print struct sg_io_hdr.dxfer_direction
field name.
Dmitry V. Levin [Sat, 7 Jan 2017 18:45:48 +0000 (21:45 +0300)]
scsi: print "protocol" and "subprotocol" field names of struct sg_io_v4
* scsi.c (print_sg_io_v4_req): Print field names
of struct sg_io_v4.protocol and struct sg_io_v4.subprotocol.
Dmitry V. Levin [Sat, 7 Jan 2017 16:44:44 +0000 (16:44 +0000)]
Print hexadecimal integer in error diagnostics using %#x
The formerly used format string %x led to misleading output as there was
no clear indication sometimes whether the printed integer was decimal or
hexadecimal.
* aio.c (startup_child, test_ptrace_seize): Print status
using %#x format specifier instead of %x.
Dmitry V. Levin [Sat, 7 Jan 2017 16:44:44 +0000 (16:44 +0000)]
aio: print hexadecimal integer using %#x
The formerly used format string %x led to misleading output as there was
no clear indication sometimes whether the printed integer was decimal or
hexadecimal.
* aio.c (print_common_flags): Print struct iocb.aio_flags using %#x
format specifier instead of %x.
* tests/aio.c (main): Likewise.
Dmitry V. Levin [Fri, 6 Jan 2017 16:31:35 +0000 (16:31 +0000)]
scsi: rewrite print_sg_io_buffer using printstr_ex(QUOTE_FORCE_HEX)
As printstr_ex has got QUOTE_FORCE_HEX flag support, there is no need
to implement it manually any longer.
* scsi.c (print_uchar): Remove.
(print_sg_io_buffer): Rewrite using printstr_ex(QUOTE_FORCE_HEX).
Eugene Syromyatnikov [Fri, 6 Jan 2017 08:57:42 +0000 (09:57 +0100)]
getrandom: print string as hex-escaped
Since there is no reason to interpret the value returned by getrandom as
ASCII string, it makes sense to always print it as a hex-escaped string.
* getrandom.c (SYS_FUNC(getrandom)): Use printstr_ex instead
of printstrn, set QUOTE_FORCE_HEX in user_style parameter in order
to force hex-escaped string formatting.
* tests/getrandom.test: Remove no longer needed -xx flag as the string
is always printed in hexadecimal format now.
Suggested-by: JingPiao Chen <chenjingpiao@gmail.com>
Eugene Syromyatnikov [Fri, 6 Jan 2017 08:55:30 +0000 (09:55 +0100)]
util: add support for forcing printing string as hex-escaped
This could be useful in cases when some binary data should not be
interpreted as an ASCII string, but rather as an array of byte values.
* defs.h (QUOTE_FORCE_HEX): New macro constant.
* util.c (quote_string): Enable use_hex when QUOTE_FORCE_HEX is set
in user_style parameter.
Eugene Syromyatnikov [Sun, 1 Jan 2017 18:46:42 +0000 (21:46 +0300)]
term: do not abort decoding in case of non-verbose output
The case of unset verbose is handled by umoven_or_printaddr, moreover,
exiting at this point is plain wrong and leads to last argument not
being printed while it should be.
* term.c (decode_termios, decode_termio, decode_winsize, decode_ttysize,
decode_modem_flags): Do not check verbose flags explicitly and do not
exit early if it is not set.
Dmitry V. Levin [Thu, 5 Jan 2017 20:46:48 +0000 (20:46 +0000)]
tests: skip fault injection tests on hppa if the kernel is too old
* tests/fault_injection.sh: Add the minimal kernel version for hppa.
Dmitry V. Levin [Thu, 5 Jan 2017 18:20:57 +0000 (18:20 +0000)]
tests: skip readahead.test on MIPS n64 when built with glibc < 2.25
Due to a bug in glibc readahead syscall wrapper on MIPS n64,
this wrapper cannot be used in readahead.test.
* tests/readahead.c [HAVE_READAHEAD && LINUX_MIPSN64 && glibc < 2.25]:
Undefine HAVE_READAHEAD.
Reported-by: James Cowgill <james410@cowgill.org.uk>
Dmitry V. Levin [Thu, 5 Jan 2017 01:34:24 +0000 (01:34 +0000)]
tests: replace init_magic with fill_memory
Use the same fill_memory/fill_memory_ex interface in all affected tests.
* tests/ioctl_block.c (init_magic): Remove.
(main): Replace init_magic with fill_memory.
* tests/ioctl_evdev.c: Likewise.
* tests/ioctl_v4l2.c: Likewise.
* tests/ioctl_mtd.c (magic, init_magic): Remove.
(main): Replace init_magic with fill_memory.
* tests/ioctl_rtc.c: Likewise.
Dmitry V. Levin [Thu, 5 Jan 2017 01:34:24 +0000 (01:34 +0000)]
tests: rewrite ioctl_v4l2 test without reliance on init_magic
* tests/ioctl_v4l2.c (cc0, cc1, cc2, cc3, fourcc): New macros.
(main): Use them. Rewrite expected output without assumptions
on any particular magic data.
Dmitry V. Levin [Wed, 4 Jan 2017 22:17:26 +0000 (22:17 +0000)]
tests: remove redundant casts in fill_memory{,_ex} invocations
* tests/ioctl_loop.c (main): Remove redundant casts of fill_memory
first argument.
* tests/kexec_load.c (main): Likewise.
* tests/perf_event_open.c (main): Likewise.
* tests/quotactl.c (main): Likewise.
* tests/mq_sendrecv.c (main): Remove redundant casts of fill_memory_ex
first argument.
* tests/quotactl-xfs.c (main): Likewise.
Dmitry V. Levin [Wed, 4 Jan 2017 22:08:32 +0000 (22:08 +0000)]
tests: change the type of fill_memory{,_ex} first argument to void *
As these functions behave like memset, it's more convenient to have
the first argument of type void * like memset.
* tests/fill_memory.c (fill_memory, fill_memory_ex): Change the type
of first argument from "char *" to "void *".
* tests/tests.h (fill_memory, fill_memory_ex): Likewise.
Eugene Syromyatnikov [Sun, 1 Jan 2017 19:43:09 +0000 (22:43 +0300)]
tests: check non-verbose decoding of LOOP_* ioctls
* tests/ioctl_loop-nv.c: New file.
* tests/ioctl_loop-nv.test: New test.
* tests/ioctl_loop.c [!ABBREV] (ABBREV): Define to 0.
(print_loop_info, print_loop_info64): Handle [ABBREV != 0] case.
* tests/.gitignore: Add ioctl_loop-nv.
* tests/Makefile.am (check_PROGRAMS): Likewise.
Eugene Syromyatnikov [Sun, 1 Jan 2017 19:29:56 +0000 (22:29 +0300)]
tests: add more checks of LOOP_* ioctls decoding
* tests/ioctl_loop.c: Include <linux/ioctl.h>.
(magic, lmagic): Move static constants ...
(main): ... here. Change types of magic constants to kernel_ulong_t.
Add more checks.
JingPiao Chen [Tue, 27 Dec 2016 03:43:30 +0000 (11:43 +0800)]
tests: check decoding of LOOP_* ioctls
* tests/ioctl_loop.c: New file.
* tests/ioctl_loop-v.c: Likewise.
* tests/ioctl_loop.test: New test.
* tests/ioctl_loop-v.test: Likewise.
* tests/.gitignore: Add ioctl_loop and ioctl_loop-v.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add ioctl_loop.test and ioctl_loop-v.test.
Co-authored-by: Eugene Syromyatnikov <evgsyr@gmail.com>
Dmitry V. Levin [Wed, 4 Jan 2017 13:22:19 +0000 (13:22 +0000)]
Drop vsprintf.c
Drop custom vfprintf implementation that was disabled by default.
Apparently nobody tests strace with this vfprintf enabled, otherwise
multiple uses of format specifiers not supported by this custom vfprintf
would not left unnoticed.
The GNU C library is not the only libc available, so those who want
faster implementations of libc functions are encouraged to try building
strace with other libc implementations.
* vsprintf.c: Remove.
* Makefile.am (strace_SOURCES): Remove vsprintf.c.
* defs.h (USE_CUSTOM_PRINTF, strace_vfprintf): Remove.
* strace.c (tprintf): Replace strace_vfprintf with vfprintf.
Eugene Syromyatnikov [Sun, 1 Jan 2017 19:40:34 +0000 (22:40 +0300)]
loop: remove unnecessary verbose check
The verbose flag is responsible for dereferencing of addresses, and it
is perfectly handled by umove_or_printaddr; moreover, this early exit
leads to incorrect formatting of last argument.
* loop.c (loop_ioctl): Do not check verbose flag explicitly and do not
exit early if it is not set.
Eugene Syromyatnikov [Sun, 1 Jan 2017 19:26:30 +0000 (22:26 +0300)]
loop: fix lo_encrypt_key field output
lo_encrypt_key is a sized string with its size specified by
lo_encrypt_key_size field, so take lo_encrypt_key_size into account.
* loop.c (decode_loop_info, decode_loop_info64): Use minimum of
LO_KEY_SIZE and lo_encrypt_key_size field value as lo_encrypt_key size.
Eugene Syromyatnikov [Sun, 1 Jan 2017 19:19:18 +0000 (22:19 +0300)]
loop: print lo_encrypt_key_size field of struct loop_info as unsigned
It is converted to an unsigned value in kernel (see loop_info64_from_old
in drivers/block/loop.c), so let's print it that way despite its type.
* loop.c (decode_loop_info): Print lo_encrypt_key_size as an uint32_t
value.
Eugene Syromyatnikov [Sun, 1 Jan 2017 18:59:12 +0000 (21:59 +0300)]
tests: add more checks of unknown ioctl command formatting
* tests/ioctl.c (main): Additional check for unknown ioctl command
decoding.
* tests/ioctl_evdev.c (main): Likewise.
* tests/ioctl_dm.c: Include <linux/ioctl.h> for _IOC_SIZE and _IOC_NR.
(main) <dummy_dm_ioctl1, dummy_dm_ioctl2, dummy_dm_arg>: New constants.
Add more checks for unknown command formatting.
Eugene Syromyatnikov [Sun, 1 Jan 2017 18:53:48 +0000 (21:53 +0300)]
ioctl: do not print explicit 0x prefix and do not specify minimum width
Specifying output width for size argument is rather misleading - it can
be up to 14 bits in size. The use of explicit "0x" prefix is
discouraged because 0x0 looks ugly. Usage of width specification along
with alternate form flag leads to inconsistent output for 0.
Let's use just plain %#x qualifiers instead.
* ioctl.c (ioctl_print_code): Change printf qualifiers for ioctl command
type, number and size to "%#x".
* tests/ioctl.c (main): Update expected test output.
* tests/ioctl_dm.c (main): Likewise.
* tests/ioctl_evdev.c (main): Likewise.
Eugene Syromyatnikov [Sun, 1 Jan 2017 18:13:07 +0000 (21:13 +0300)]
loop: fix printing of the reserved field array items
They are of char type, so "hh" length modifier should be used (otherwise
they are printed incorrectly as they are sign extended implicitly when
passed as printf arguments in case char is a signed type which is true
for most compilers).
* loop.c (decode_loop_info): Change "%#x" printf qualifier to "%#hhx"
in printing routine for array elements of the "reserved" field of
loop_info structure.
Eugene Syromyatnikov [Sat, 24 Dec 2016 16:18:51 +0000 (19:18 +0300)]
tests: check ioctl(SIOCGIFCONF) decoding
* tests/ioctl_sock_gifconf.c: New file.
* tests/ioctl_sock_gifconf.test: New test.
* tests/.gitignore: Add ioctl_sock_gifconf.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add ioctl_sock_gifconf.test.
Eugene Syromyatnikov [Mon, 26 Dec 2016 12:24:45 +0000 (15:24 +0300)]
dm.c: add copyright notice
Dmitry V. Levin [Wed, 4 Jan 2017 11:29:32 +0000 (11:29 +0000)]
Add scno.h and syscallent.i to .gitignore files
* .gitignore: Add /scno.h and /syscallent.i.
* tests/.gitignore: Add scno.h and syscallent.i.