Use call via structure only when multiple tracing backends are available
Since dispatching function calls via the tracing backend structure
definitely imposes some overhead, let's try to minimise it for the
(pretty common) case of having only one tracing backend available.
* configure.ac (additional_tracing_backends): New m4 variable.
(ADDITIONAL_TRACING_BACKENDS): New AC_DEFINE, equal to
additional_tracing_backends.
* ptrace_backend.c: Put ptrace_backend definition under
"#if ADDITIONAL_TRACING_PACKENDS".
* ptrace_backend.h: Put ptrace_backend declaration under
"#if ADDITIONAL_TRACING_PACKENDS".
* tcb_wait_data.h [!ADDITIONAL_TRACING_PACKENDS]: Provide macros for
aliasing trace_wait_data_size, init_trace_wait_data,
copy_trace_wait_data, and free_trace_wait_data to ptrace-based tracing
backend definitions.
* tracing_backend.c: Put the contents, except local_open, under #if
ADDITIONAL_TRACING_PACKENDS.
* tracing_backend.h: Put the contents (except local_open) under #if
ADDITIONAL_TRACING_PACKENDS, provide macros for all the inline functions
that alias them to the respective functions in the ptrace-based tracing
backend in the opposite case.
Introduce tracing backend abstraction layer (TraBAL, for short)
So, all the ptrace-specific routines are now getting "ptrace_" prefix.
Wrappers for the old routines are provided, that call appropriate method
based on current tracing backend selection. Some auxiliary functions
are provided for getting backend name and selecting backend.
Based on "Implement gdbserver using backend dispatch table." and "Add
defaults for all backend methods." commits by Stanford Cox.
* Makefile.am (strace_SOURCES): Add ptrace_backend.c, ptrace_backend.h,
ptrace_wait_data.h, tcb_wait_data.h, tracing_backend.c, tracing_backend.h.
* defs.h: Add struct tcb_wait_data forward declaration; include
tracing_backend.h.
(generic_get_instruction_pointer): Rename from get_instruction_pointer,
the latter is now defined in tracing_backend.h.
(generic_get_stack_pointer): Rename from get_stack_pointer, the latter
is now defained in tracing_dackend.h.
(clear_regs, get_scno, umoven, umovestr, upeek, upoke): Remove
declarations, they are now defined in tracing_backend.h.
* pathtrace.c (getfdpath): Change readlink call to tracee_readlink.
(pathtrace_select_set): Change realpath call to tracee_realpath.
* ptrace_backend.c: New file.
* ptrace_backend.h: Likewise.
* ptrace_wait_data.h: Likewise.
* tcb_wait_data.h: Likewise.
* tracing_backend.c: Likewise.
* tracing_backend.h: Likewise.
* strace.c: Include "tcb_wait_data.h", "ptrace_wait_data.h".
(struct tcb_wait_data): Move to tcb_wait_data.h.
(struct ptrace_wait_data, to_ptrace_wait_data): Move to
ptrace_wait_data.h.
(detach, cleanup): Remove declarations (they are a part of
tracing_backend.h now).
(detach, attach_tcb, startup_child, init_trace_wait_data,
copy_trace_wait_data, free_trace_wait_data, next_event,
handle_group_stop, handle_exec, restart_process): Add "ptrace_" prefix.
Remove static qualifier.
(tracing_backend_init): Rename to ptrace_init.
(tracing_backend_name): Remove.
(trace_wait_data_size): Remove, it is now defined in
tracing_backend.h.
(init): Call tracing_backend_post_init() at the end of the routine.
* syscall.c (get_regs, get_syscall_args, get_syscall_result. get_error,
set_scno, set_error, set_success): Remove declarations (they are part
of tracing_backend.h now).
(clear_regs, get_regs, get_scno, set_scno, set_error, set_success,
get_syscall_args, get_syscall_result, get_syscall_regs, ): Add "ptrace_"
prefix, remove static qualifier.
(get_instruction_pointer): Split into ptrace_get_instruction_pointer
and generic_get_instruction_pointer.
(get_stack_pointer): Split into ptrace_get_stack_pointer
and generic_get_stack_pointer.
* ucopy.c (umoven, umovestr): Add "ptrace_" prefix.
* upeek.c (upeek): Likewise.
* upoke.c (upoke): Likewise.
* socketutils.c (send_query): Replace sendmsg call with tracee_sendmsg.
(receive_responses): Replace recvmsg call with tracee_recvmsg.
(get_sockaddr_by_inode_uncached, genl_families_xlat): Replace socket
call with tracee_socket.
* util.c (getfdproto): Replace getxattr call with tracee_getxattr.
(open_file): Move to is part of ptrace_backend.c.
(read_int_from_file): Replace open_file call with tracee_open. Replace
read call with tracee_pread. Replace close call with tracee_close.
strace.c: construct and pass environment to startup_child
The current approach with putenv() during parsing has two problems:
- it changes tracer's own environment which may affect its behaviour
and may be undesirable;
- it's specific to ptrace tracing backend.
As a solution, let's apply an approach similar to path tracing option
parsing: collect the provided optarg's in an array and then pass it to
tracing-backend-specific routines.
* strace.c (struct exec_params): Add env field.
(exec_or_die): Call execve() instead of execv(); pass params->env
as the third argument.
(startup_child): Add env parameter, set params_for_tracee.env to it.
(add_to_env, make_env): New functions.
(init): Add env_changes, env_change_size, env_change_count local
variables; store optarg in env_changes array on -E option occurrence;
construct new environment using make_env and pass it to startup_child
in the second argument.
tests: add support for negative match patterns to match_grep
For the cases when we want that some patterns do not appear in the
output.
* tests/init.sh (match_grep): Add res and negated local variables; set
negated to 1 if pattern starts with "!", otherwise to 0; fail if negated
pattern has been matched.
xmalloc: add zero-initialisation counterparts for xmalloc and xcalloc
Specifically, array allocation without zero memory initialisation
and xmalloc with zero memory initialisation.
* xmalloc.c (xallocarray): New function.
* xmalloc.h (xcalloc): Document the function.
(xallocarray): New function declaration.
(xzalloc): New function, wrapper for xcalloc with xmalloc interface.
strace.c: move ptrace-specific parts out of dispatch_event
dispatch_event is mostly neutral to a tracing backends, except for some
parts. Let's move them into separate functions and call them from it.
Also, while we are here, let's pass an opaque pointer to next_event and
these new functions, so a tracing backend is able to carry some tracing
loop state (like siginfo and restart_op, in case of ptrace) there.
* strace.c (struct tcb_wait_data): Remove msg and status fields (as
those are specific to tracing backend), ass sig, exit, and core_dumped
fields.
(struct ptrace_wait_data): New type.
(to_ptrace_wait_data): New macro.
(tcb_wait_tab): Change type to struct ptrace_wait_data *.
(maybe_switch_tcbs): Change the second argument to struct tcb_wait_data *wd,
use to_ptrace_wait_data(wd)->msg to obtain previously stored
PTRACE_GETEVENTMSG result, use tcp->pid instead of pid, avoid tcp =
execve_thread assignment.
(print_signalled): Change the third argument to struct tcb_wait_data *wd,
use wd->sig instead of WTERMSIG(status).
(print_exited): Rename second argument to exit, use it directly instead
of WEXITSTATUS(status).
(trace_wait_data_size): Return sizeof(struct ptrace_wait_data) instead
of sizeof(struct tcb_wait_data).
(init_trace_wait_data): Initialise struct ptrace_wait_data: set
ptrace_wd->restart_op to PTRACE_SYSCALL; return pointer to the wd field.
(copy_trace_wait_data): Copy containing struct ptrace_wait_data instead
of struct tcb_wait_data.
(free_trace_wait_data): Free containing struct ptrace_wait_data.
(next_event): Change type of wd to struct ptrace_wait_data; initialise
wd->wd.sig and wd->wd.core_dumped on WIFSIGNALED(status); initialise
wd->wd.exit on WIFEXITED(status); initialise wd->wd.sig on ptrace event
being 0 or PTRACE_EVENT_STOP with signal being one of SIGSTOP, SIGTSTP,
SIGTTIN, or SIGTTOU.
(classify_ptrace_stop, handle_exec, restart_process): New functions.
(dispatch_event): Remove restart_op, restart_sig, status; use wd->sig
instead of restart_sig; pass wd to print_signalled.
(dispatch_event) <case TE_GROUP_STOP>: Move ptrace-specific code to
classify_group_stop, call it from next_event instead.
(dispatch_event) <case TE_STOP_BEFORE_EXECVE>: Move ptrace-specific code
to handle_exec.
(dispatch_event): Replace ptrace_restart call with restart_process call.
strace.c: move argc/nprocs check to the tracing_backend_init routine
It is deemed that for some tracing backends it is possible to run strace
without providing either program to run or PIDs to attach (attaching to
already running GDB server with existing inferiors is an example). Thus,
let's move this check to tracing_backend_init.
strace.c: move ptrace backend initialisation into a separate routine
In a preparation to TraBAL introduction.
* strace.c (tracing_backend_init): New function.
(tracing_backend_name): New macro.
(init): Move OS release detection, ptrace_setoptions initialisation,
and PTRACE_SEIZE/PTRACE_GET_SYSCALL_INFO tests to tracing_backend_init.
strace.c: move pathtrace_select calls to a later initialisation stage
Since pathtrace initialisation (more speicifically, path name
resolution) is specific to the tracing backend (especially in case
tracees are remote), let's first collect the list of paths to trace
in a temporary array and add it later during the initialisation.
* strace.c (init): Add pathtrace_paths temporary array, with its
element count stored in pathtrace_count and size in pathtrace_size.
(init) <case 'P'>: Store argument in pathtrace_paths, grow it if needed.
(init): Iterate over pathtrace_paths and call pathtrace_select for each
element. Free the array.
strace.c: use aux_children interface for handling strace_popen'ed child
Now, when we have generic auxiliary children handling interface, we can
implement it once and then add additional children with
register_aux_child call, without disturbing main strace code.
* strace.c: Include "aux_children.h"
(popen_pid): Remove.
(strace_popen): Provide resulting PID as an argument to
register_aux_child instead of storing it in popen_pid.
(next_event): Check for the presence of additional children with
have_aux_children. Handle stops of auxiliary children with
aux_children_signal.
(terminate): Use aux_children_exit_notify and aux_children_exit_wait
instead of manually waiting on popen_pid.
Introduce an API for handling spawned auxiliary children
One of gdbserver backend features is to spawn a GDB server. The handling
of this child process is more or less similar to strace_popen'ed child,
so let's generalise it.
Introduce next_setqual_scno (needed for gdbserver backend)
During initialisation, gdbserver backend enumerates all the syscall
numbers enabled for tracing and asks GDB server to stop only on the
specified syscall numbers. Since number_set interface is now opaque,
we provide an ability to enumerate all the syscall numbers that are
enabled.
* defs.h (next_set_qual_scno): New declaration.
* number_set.h (next_set_bit_in_set_array): Likewise.
* filter_qualify.c (next_set_qual_scno): Implement it.
* number_set.c (next_set_bit_in_set_array): Likewise.
strace.c: pre-allocate tcb on PTRACE_EVENT_{FORK,VFORK,CLONE}
In an attempt to resolve a race between the first stop of a new child
and the death of the last process.
* defs.h (TCB_PREALLOCATED): New constant.
* strace.c (pid2tcb): Add skip_preallocated parameter.
(maybe_allocate_tcb): Add tcp parameter, use it instead of allocating a
new tcp if it is not NULL.
(maybe_switch_tcbs): Pass true as a second argument to pid2tcb.
(next_event): Pass tcp to maybe_switch_tcbs if it is pre-allocated,
pre-allocate a tcb on PTRACE_EVENT_{FORK,VFORK,CLONE} if followfork is
enabled and we successfully retrieved the new pid.
The commit v4.24~48 "Implement -e kvm= option on all architectures",
while removing #ifdef, left formatting of the help message string a bit
inconsistent.
* strace.c (usage): Move "\n\" bit after "kvm", remove double quotes.
Complements: v4.24~48 "Implement -e kvm= option on all architectures"
strace.c: pass signal to cleanup() instead of reading it inside it
* strace.c (die): Pass 0 as an argument to cleanup().
(cleanup): Add fatal_sig parameter, remove the local variable
of the same name, do not use interrupted.
(terminate): Initialise new sig local variable with interrupted,
pass it to cleanup and use it instead of the latter for exit_code
initialisation.
Implement queueing of threads before dispatching them
It is possible that some tracees call a lot of cheap syscalls too fast,
and that can lead to starvation to the point some tracees are not served
for indefinite amount of time. In order to solve that unfairness, try
to collect all the pending tracees first along with the relevant
information and only then dispatch the events.
* defs.h: Include "list.h".
(struct tcb): Add wait_data_idx, delayed_wait_data, and wait_list
fields.
* strace.c (struct tcb_wait_data): Add "msg" field.
(tcb_wait_tab, tcb_wait_tab_size): New static variable.
(droptcb): Remove tcp from wait_list.
(maybe_switch_tcbs): Get old pid from
tcb_wait_tab[tcp->wait_data_idx].msg instead of calling
ptrace(PTRACE_GETEVENTMSG).
(tcb_wait_tab_check_size): New function.
(trace_wait_data_size, init_trace_wait_data, copy_trace_wait_data,
free_trace_wait_data): New functions, in order to allow the code outside
next_event to operate with wait_data as with an opaque object (needed
for dispatch_event and restart_delayed_tcb).
(next_event): Add pending_tcps, extra_tcp, wait_nohang, elem, and
wait_tab_pos variables; check for elements in pending_tcps and skip
waiting if the list is not empty; check for extra_tcp and skip waiting
along with swapping wait_data_idx with wait_extra_data_idx;
after the initial wait4(), call wait4() in loop with WNOHANG flag set;
fetch siginfo on signal and eventmsg on PTRACE_EVENT_EXEC;
return the first tcp in pending_tcps list.
(dispatch_event): Store a pointer to a copy of tcb_wait_data in
tcp->delayed_wait_data if tcp's restart has to be delayed.
(restart_delayed_tcb): Use tcp->delayed_wait_data, create a stub
tcb_wait_data if it is NULL, free temporary trace_wait_data.
* tests/Makefile.am (XFAIL_TEST): Remove looping_threads.test.
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=478419
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=526740
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=851457
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1609318
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1610774 Co-Authored-by: Dmitry V. Levin <ldv@altlinux.org> Co-Authored-by: Denys Vlasenko <dvlasenk@redhat.com> Co-Authored-by: Andreas Schwab <aschwab@redhat.com> Co-Authored-by: Jeff Law <law@redhat.com> Co-Authored-by: DJ Delorie <dj@redhat.com>
xmalloc: add ability to specify desired minimum size for xgrowarray
* xmalloc.h (xgrowarray_ex): Rename from xgrowarray, add min_memb
parameter.
(xgrowarray): New static inline function, wrapper for xgrowarray_ex.
* xmalloc.c: Include "macros.h".
(xgrowarray_ex): Rename from xgrowarray, add min_memb, increase array
size to the maximum of min_memb and old size + grow_memb.
* xlat/gen.sh: Export LC_ALL=C so it could be omitted from individual
invocations.
(cond_def): Remove LC_ALL=C from sed invocation.
(gen_header): Remove LC_COLLATE=C.
Makefile.am: pass D variable to shell scripts' environment
And set -x if D is set to 1, so the commands called by various shell scripts
are easier to see during debugging.
* Makefile.am (bpf_attr_check.c, sen.h, mpers-m%.stamp, $(srcdir)/CREDITS): Pass
D variable in the environment to the shell script call.
* gen_bpf_attr_check.sh: Set -x if D is set to 1.
* generate_mpers_am.sh: Likewise.
* generate_sen.sh: Likewise.
* maint/gen-contributors-list.sh: Likewise.
* mpers.sh: Likewise.
* mpers_test.sh: Likewise.
tests: add checks for dumpstr output into read-write test
util.c:dumpstr() now aligns offsets in accordance with the total length
of the dump and also may perform only partial dump, so let's add checks
for these cases.
* tests/fill_memory.c (fill_memory_ex): Change the type of the period
argument from unsigned char to unsigned int.
* tests/tests.h (fill_memory_ex): Likewise.
* tests/read-write.c (dump_str_ex): Rename from dump_str, add idx_w
argument, support len greater than 240 bytes.
(dump_str): New function, wrapper for dump_str_ex with the default index
width.
(print_hex): Add checks for dumpstr output, close fd 1 later.
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>
Character class checks and hexadecimal number formatting are open-coded
all over the place, let's try to de-duplicate them a bit.
* print_utils.h: New file.
* Makefile.am (strace_SOURCES): Add it.
* util.c: Include "print_utils.h".
(string_quote, dumpstr): Use sprint_byte_hex and is_print.
* v4l2.c: Include "print_utils.h".
(print_pixelformat): Use is_print and BYTE_HEX_CHARS_PRINTF_QUOTED,
add a note that the routine is rather generic.
cleanup() has exactly two call sites, die() and terminate(), and the
first one resets cflag in order to prevent call_summary() invocation.
Move the call to terminate() in order to avoid bogus cflag reset.
Dmitry V. Levin [Tue, 19 Feb 2019 01:39:32 +0000 (01:39 +0000)]
build: fix --with-libiberty
* m4/st_demangle.m4 (st_DEMANGLE): Move the check for cplus_demangle
out of AC_CHECK_HEADERS because the latter checks for demangle.h in two
different places and an absence of demangle.h in one of these places
would cause a build error in --with-libiberty=yes mode.
* NEWS: Mention this fix.
Dmitry V. Levin [Sun, 17 Feb 2019 00:10:26 +0000 (00:10 +0000)]
hppa: workaround kernel bug in syscall number tampering
Linux kernel commit v4.6-rc2~20^2 introduced a regression:
when tracer changes syscall number to -1, the kernel fails
to initialize %r28 with -ENOSYS and subsequently fails
to return the error code of the failed syscall to userspace.
Workaround this by initializing %r28 ourselves.
* linux/arch_defs_.h (ARCH_NEEDS_SET_ERROR_FOR_SCNO_TAMPERING): Define
to 0.
* linux/hppa/arch_defs_.h (ARCH_NEEDS_SET_ERROR_FOR_SCNO_TAMPERING):
Define to 1.
* syscall.c (tamper_with_syscall_entering)
[ARCH_NEEDS_SET_ERROR_FOR_SCNO_TAMPERING]: When changing syscall number
to -1, set the return value as well.
Dmitry V. Levin [Fri, 15 Feb 2019 21:22:30 +0000 (21:22 +0000)]
mips o32: fix 7th syscall argument with PTRACE_GET_SYSCALL_INFO API
As PTRACE_GET_SYSCALL_INFO API supports 6 syscall arguments,
all architectures that have syscalls with more than 6 arguments
(i.e. mips o32) have to fetch extra arguments manually when using
PTRACE_GET_SYSCALL_INFO API.
* linux/mips/get_syscall_args.c [LINUX_MIPSO32]
(arch_get_syscall_args_extra): New function.
* syscall.c (get_syscall_args) [MAX_ARGS > 6]: Use it.
Dmitry V. Levin [Mon, 11 Feb 2019 21:00:05 +0000 (21:00 +0000)]
tests: robustify preadv2-pwritev2 test against odd kernels
The test used to assume that either both preadv2 and pwritev2 syscalls
are implemented or both are not implemented, but, apparently, there are
kernels in the wild that implement just preadv2 syscall without
pwritev2.
* tests/preadv2-pwritev2.c (main): Skip the dumpio part of the test
if either preadv2 or pwritev2 syscall is not implemented.
Dmitry V. Levin [Sun, 10 Feb 2019 21:04:41 +0000 (21:04 +0000)]
Fix whitespace issues
* Makefile.am (strace_SOURCES, EXTRA_DIST): Replace SPACE symbol followed
by TAB symbol with TAB symbol.
* kvm.c (is_map_for_file): Likewise.
* tests/gen_tests.in (ioctl_ptp, printsignal-Xverbose): Likewise.
* xlat/skf_ad.in: Likewise.
sockaddr: print sin6_flowinfo field before sin6_addr
The sin6_flowinfo field comes before sin6_addr in the sockaddr_in6
defintion, but for some reason we switch the order when decoding.
This patch fixes the order of decoding.
Dmitry V. Levin [Tue, 8 Jan 2019 19:23:44 +0000 (19:23 +0000)]
mips o32: fix build
Commit 917c2ccf3a67 "Refactor stack pointers" moved mips_REG_* macros
from linux/mips/arch_regs.h to linux/mips/arch_regs.c because these
macros are no longer used outside syscall.c or files included by
syscall.c, but this caused a build regression on mips o32 because
decode_syscall_subcall() uses mips_REG_SP prior to its definition.
Baruch Siach [Tue, 8 Jan 2019 16:36:20 +0000 (18:36 +0200)]
Fix build for no-MMU targets
Commit 7488ce9e23f1 "Check whether PTRACE_GET_SYSCALL_INFO is supported
by the kernel" added a fork() call in test_ptrace_get_syscall_info()
which is included in the main strace executable code. Although the
test_ptrace_get_syscall_info() routine is not called on no-MMU targets,
the compiler can't optimize it out because it is a global symbol.
So build for no-MMU targets currently fails:
strace-ptrace_syscall_info.o: In function `test_ptrace_get_syscall_info':
ptrace_syscall_info.c:(.text+0x1c): undefined reference to `fork'
* ptrace_syscall_info.c (test_ptrace_get_syscall_info): Make
the definition depend on HAVE_FORK.
* strace.c (init): Call test_ptrace_get_syscall_info unconditionally.
* NEWS: Mention this fix.
Co-Authored-by: Dmitry V. Levin <ldv@altlinux.org> Fixes: v4.26~50 "Check whether PTRACE_GET_SYSCALL_INFO is supported by the kernel"
Dmitry V. Levin [Sat, 5 Jan 2019 21:14:42 +0000 (21:14 +0000)]
xlat: update NT_* constants
* xlat/nt_descriptor_types.in (NT_ARM_PAC_MASK, NT_MIPS_MSA): New
constants introduced by Linux kernel commits v5.0-rc1~35^2~21
and v5.0-rc1~30^2~58, respectively.
* NEWS: Mention this.
Dmitry V. Levin [Sat, 5 Jan 2019 21:14:42 +0000 (21:14 +0000)]
xlat: update V4L2_* constants
* xlat/v4l2_buf_types.in (V4L2_BUF_TYPE_META_OUTPUT): New constant
introduced by Linux kernel commit v5.0-rc1~181^2~21.
* xlat/v4l2_device_capabilities_flags.in (V4L2_CAP_META_OUTPUT):
Likewise.
* xlat/v4l2_pix_fmts.in (V4L2_PIX_FMT_CNF4): New constant introduced
by Linux kernel commit v5.0-rc1~182^2~120.
* NEWS: Mention this.
Dmitry V. Levin [Sat, 5 Jan 2019 21:14:42 +0000 (21:14 +0000)]
xlat: update KVM_CAP_* constants
* xlat/kvm_cap.in (KVM_CAP_MANUAL_DIRTY_LOG_PROTECT,
KVM_CAP_HYPERV_CPUID): New constants introduced by Linux kernel commits
v5.0-rc1~156^2~115 and v5.0-rc1~156^2~74, respectively.
* NEWS: Mention this.
Dmitry V. Levin [Sat, 5 Jan 2019 21:14:42 +0000 (21:14 +0000)]
xlat: update BTRFS_FEATURE_INCOMPAT_* constants
* xlat/btrfs_features_incompat.in
(BTRFS_FEATURE_INCOMPAT_METADATA_UUID): New constant introduced by Linux
kernel commit v5.0-rc1~126^2~64.
* NEWS: Mention this.
Martin Lau [Thu, 3 Jan 2019 23:36:22 +0000 (23:36 +0000)]
tests: fix prog_info initialization in bpf-obj_get_info_by_fd-prog*
The sys_bpf(BPF_OBJ_GET_INFO_BY_FD, &bpf_prog_get_info_attr, ...) is
called in a loop. The bpf_prog_get_info_attr.info object is in size 104
but bpf_prog_get_info_attr.info_len is in size 168. Hence, if the prog
is jited, the second iteration onwards will have nr_jited_ksyms == 1
which is asking the kernel to fill the
bpf_prog_get_info_attr.info.jited_ksyms and it is NULL.
* tests/bpf-obj_get_info_by_fd.c (main): Clear memory beyond prog_info
at the start of every iteration.
Co-Authored-by: Dmitry V. Levin <ldv@altlinux.org>
Dmitry V. Levin [Tue, 1 Jan 2019 21:36:08 +0000 (21:36 +0000)]
tests: fix strace-k.test on alpha
Change strace-k.test to use chdir syscall instead of getpid syscall
because the latter is not universally available, e.g. there is no getpid
syscall on alpha.