[DTrace-devel] [PATCH] test: Fix use of syscall::execve:entry args[1][?]
Kris Van Hees
kris.van.hees at oracle.com
Tue Feb 20 17:13:55 UTC 2024
On Thu, Feb 15, 2024 at 05:42:42PM -0500, eugene.loh at oracle.com wrote:
>
> Commit 82332371 ("proc: use a rawtp for the proc:::exit probe") included
> some test changes. Specifically, it sought to use syscall::execve:entry
> probe arguments args[1][0] and args[1][1] to recognize "sleep 10000".
> The patch recognized that the argv pointers in question were in user
> space, requiring copyinstr() to access the strings.
>
> But it's trickier than that. The args[1][?] require two dereferencings,
> both in user space. So a copyin() is required to access args[1] and
> then copyinstr() to access the args[1][?].
>
> Fix the tests to use two layers of copyin*() to double dereference the
> args[1][?] strings.
>
> Signed-off-by: Eugene Loh <eugene.loh at oracle.com>
Reviewed-by: Kris Van Hees <kris.van.hees at oracle.com>
> ---
> test/unittest/proc/tst.exitkilled.sh | 6 ++++--
> test/unittest/proc/tst.signal.sh | 8 ++++++--
> 2 files changed, 10 insertions(+), 4 deletions(-)
>
> diff --git a/test/unittest/proc/tst.exitkilled.sh b/test/unittest/proc/tst.exitkilled.sh
> index be9fc651..723dff88 100755
> --- a/test/unittest/proc/tst.exitkilled.sh
> +++ b/test/unittest/proc/tst.exitkilled.sh
> @@ -12,8 +12,10 @@ script()
> {
> $dtrace $dt_flags -s /dev/stdin <<EOF
> syscall::execve:entry
> - /copyinstr((uintptr_t)args[1][0]) == "sleep" && args[1][1] &&
> - copyinstr((uintptr_t)args[1][1]) == "10000"/
> + /(this->myargs = (uintptr_t *)copyin((uintptr_t)args[1], 2 * sizeof(char *)))
> + && copyinstr(this->myargs[0]) == "sleep"
> + && this->myargs[1]
> + && copyinstr(this->myargs[1]) == "10000"/
> {
> kill_pid = pid;
> }
> diff --git a/test/unittest/proc/tst.signal.sh b/test/unittest/proc/tst.signal.sh
> index 3f885759..1db10042 100755
> --- a/test/unittest/proc/tst.signal.sh
> +++ b/test/unittest/proc/tst.signal.sh
> @@ -12,8 +12,10 @@ script()
> {
> $dtrace $dt_flags -s /dev/stdin <<EOF
> syscall::execve:entry
> - /copyinstr((uintptr_t)args[1][0]) == "sleep" && args[1][1] &&
> - copyinstr((uintptr_t)args[1][1]) == "10000"/
> + /(this->myargs = (uintptr_t *)copyin((uintptr_t)args[1], 2 * sizeof(char *)))
> + && copyinstr(this->myargs[0]) == "sleep"
> + && this->myargs[1]
> + && copyinstr(this->myargs[1]) == "10000"/
> {
> sig_pid = pid;
> }
> @@ -23,12 +25,14 @@ script()
> sig_pid == args[1]->pr_pid && args[2] != SIGUSR1/
> {
> /* Wrong signal being sent. */
> + printf("wrong signal sent: %d vs %d\n", args[2], SIGUSR1);
> exit(1);
> }
>
> proc:::signal-handle
> /sig_pid == pid/
> {
> + printf("signal received %d\n", args[0]);
> exit(args[0] == SIGUSR1 ? 0 : 1);
> }
>
> --
> 2.18.4
>
>
More information about the DTrace-devel
mailing list