[DTrace-devel] [PATCH] Check pid==0 for uaddr2str

Kris Van Hees kris.van.hees at oracle.com
Sat Apr 29 03:55:01 UTC 2023


On Thu, Mar 16, 2023 at 12:28:31PM -0400, eugene.loh--- via DTrace-devel wrote:
> From: Eugene Loh <eugene.loh at oracle.com>
> 
> If dtrace_uaddr2str() is given pid==0, it will try to look up the
> pid, get a NULL pointer back, dereference it, and cause dtrace to
> segfault.
> 
> Add a check for pid==0.
> 
> Signed-off-by: Eugene Loh <eugene.loh at oracle.com>

Reviewed-by: Kris Van Hees <kris.van.hees at oracle.com>

> ---
>  libdtrace/dt_subr.c                   |  2 +-
>  test/unittest/ustack/tst.uaddr-pid0.d | 17 +++++++++++++++++
>  test/unittest/ustack/tst.uaddr-pid0.r |  1 +
>  test/unittest/ustack/tst.ufunc-pid0.d | 17 +++++++++++++++++
>  test/unittest/ustack/tst.ufunc-pid0.r |  1 +
>  test/unittest/ustack/tst.usym-pid0.d  | 17 +++++++++++++++++
>  test/unittest/ustack/tst.usym-pid0.r  |  1 +
>  7 files changed, 55 insertions(+), 1 deletion(-)
>  create mode 100644 test/unittest/ustack/tst.uaddr-pid0.d
>  create mode 100644 test/unittest/ustack/tst.uaddr-pid0.r
>  create mode 100644 test/unittest/ustack/tst.ufunc-pid0.d
>  create mode 100644 test/unittest/ustack/tst.ufunc-pid0.r
>  create mode 100644 test/unittest/ustack/tst.usym-pid0.d
>  create mode 100644 test/unittest/ustack/tst.usym-pid0.r
> 
> diff --git a/libdtrace/dt_subr.c b/libdtrace/dt_subr.c
> index 3a93eed7..bff0497a 100644
> --- a/libdtrace/dt_subr.c
> +++ b/libdtrace/dt_subr.c
> @@ -888,7 +888,7 @@ dtrace_uaddr2str(dtrace_hdl_t *dtp, pid_t pid, uint64_t addr, char *str,
>  		pid = dt_proc_grab_lock(dtp, pid, DTRACE_PROC_WAITING |
>  					DTRACE_PROC_SHORTLIVED);
>  
> -	if (pid < 0) {
> +	if (pid <= 0) {
>  		snprintf(c, sizeof(c), "0x%llx", (unsigned long long)addr);
>  		return dt_string2str(c, str, nbytes);
>  	}
> diff --git a/test/unittest/ustack/tst.uaddr-pid0.d b/test/unittest/ustack/tst.uaddr-pid0.d
> new file mode 100644
> index 00000000..263a7ca9
> --- /dev/null
> +++ b/test/unittest/ustack/tst.uaddr-pid0.d
> @@ -0,0 +1,17 @@
> +/*
> + * Oracle Linux DTrace.
> + * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
> + * Licensed under the Universal Permissive License v 1.0 as shown at
> + * http://oss.oracle.com/licenses/upl.
> + */
> +
> +/* Without a trigger, pid will be 0, but we should not segfault. */
> +
> +#pragma D option quiet
> +
> +tick-1
> +/pid == $target/
> +{
> +    uaddr(ucaller);
> +    exit(0);
> +}
> diff --git a/test/unittest/ustack/tst.uaddr-pid0.r b/test/unittest/ustack/tst.uaddr-pid0.r
> new file mode 100644
> index 00000000..a8e68f4e
> --- /dev/null
> +++ b/test/unittest/ustack/tst.uaddr-pid0.r
> @@ -0,0 +1 @@
> +  {ptr}                                               
> diff --git a/test/unittest/ustack/tst.ufunc-pid0.d b/test/unittest/ustack/tst.ufunc-pid0.d
> new file mode 100644
> index 00000000..f076782a
> --- /dev/null
> +++ b/test/unittest/ustack/tst.ufunc-pid0.d
> @@ -0,0 +1,17 @@
> +/*
> + * Oracle Linux DTrace.
> + * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
> + * Licensed under the Universal Permissive License v 1.0 as shown at
> + * http://oss.oracle.com/licenses/upl.
> + */
> +
> +/* Without a trigger, pid will be 0, but we should not segfault. */
> +
> +#pragma D option quiet
> +
> +tick-1
> +/pid == $target/
> +{
> +    ufunc(ucaller);
> +    exit(0);
> +}
> diff --git a/test/unittest/ustack/tst.ufunc-pid0.r b/test/unittest/ustack/tst.ufunc-pid0.r
> new file mode 100644
> index 00000000..a8e68f4e
> --- /dev/null
> +++ b/test/unittest/ustack/tst.ufunc-pid0.r
> @@ -0,0 +1 @@
> +  {ptr}                                               
> diff --git a/test/unittest/ustack/tst.usym-pid0.d b/test/unittest/ustack/tst.usym-pid0.d
> new file mode 100644
> index 00000000..d2f5ec5d
> --- /dev/null
> +++ b/test/unittest/ustack/tst.usym-pid0.d
> @@ -0,0 +1,17 @@
> +/*
> + * Oracle Linux DTrace.
> + * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
> + * Licensed under the Universal Permissive License v 1.0 as shown at
> + * http://oss.oracle.com/licenses/upl.
> + */
> +
> +/* Without a trigger, pid will be 0, but we should not segfault. */
> +
> +#pragma D option quiet
> +
> +tick-1
> +/pid == $target/
> +{
> +    usym(ucaller);
> +    exit(0);
> +}
> diff --git a/test/unittest/ustack/tst.usym-pid0.r b/test/unittest/ustack/tst.usym-pid0.r
> new file mode 100644
> index 00000000..a8e68f4e
> --- /dev/null
> +++ b/test/unittest/ustack/tst.usym-pid0.r
> @@ -0,0 +1 @@
> +  {ptr}                                               
> -- 
> 2.18.4
> 
> 
> _______________________________________________
> DTrace-devel mailing list
> DTrace-devel at oss.oracle.com
> https://oss.oracle.com/mailman/listinfo/dtrace-devel



More information about the DTrace-devel mailing list