[DTrace-devel] [PATCH v2 7/8 + 8/8] probe, io, ip, proc, rawtp, sched: fix memory leaks

Eugene Loh eugene.loh at oracle.com
Fri Apr 12 18:00:41 UTC 2024


Reviewed-by: Eugene Loh <eugene.loh at oracle.com>
but I cannot swear to every detail.  Maybe Nick looked at this more 
closely.  In any case, the earlier test/demo rampant failures seem to be 
fixed now.

On 4/12/24 11:30, Kris Van Hees via DTrace-devel wrote:
> Signed-off-by: Kris Van Hees <kris.van.hees at oracle.com>
> ---
>   libdtrace/dt_probe.c        |  5 ++++-
>   libdtrace/dt_prov_io.c      |  1 +
>   libdtrace/dt_prov_ip.c      |  3 ++-
>   libdtrace/dt_prov_proc.c    | 10 ++++++++--
>   libdtrace/dt_prov_rawtp.c   |  2 +-
>   libdtrace/dt_prov_sched.c   |  3 ++-
>   libdtrace/dt_provider_sdt.c | 10 ++++++++--
>   libdtrace/dt_provider_tp.c  | 11 ++++++-----
>   8 files changed, 32 insertions(+), 13 deletions(-)
>
> diff --git a/libdtrace/dt_probe.c b/libdtrace/dt_probe.c
> index 7da30ddb..c0273169 100644
> --- a/libdtrace/dt_probe.c
> +++ b/libdtrace/dt_probe.c
> @@ -1,6 +1,6 @@
>   /*
>    * Oracle Linux DTrace.
> - * Copyright (c) 2006, 2023, Oracle and/or its affiliates. All rights reserved.
> + * Copyright (c) 2006, 2024, 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.
>    */
> @@ -962,6 +962,9 @@ dt_probe_args_info(dtrace_hdl_t *dtp, dt_probe_t *prp)
>   		prp->mapping[i] = argv[i].mapping;
>   		prp->argv[i] = dtt;
>   		prp->xargv[i]->dn_flags |= argv[i].flags;
> +
> +		free((char *)argv[i].native);
> +		free((char *)argv[i].xlate);
>   	}
>   
>   	dt_free(dtp, argv);
> diff --git a/libdtrace/dt_prov_io.c b/libdtrace/dt_prov_io.c
> index ace3982a..992b623a 100644
> --- a/libdtrace/dt_prov_io.c
> +++ b/libdtrace/dt_prov_io.c
> @@ -517,4 +517,5 @@ dt_provimpl_t	dt_io = {
>   	.enable		= &dt_sdt_enable,
>   	.trampoline	= &trampoline,
>   	.probe_info	= &dt_sdt_probe_info,
> +	.destroy	= &dt_sdt_destroy,
>   };
> diff --git a/libdtrace/dt_prov_ip.c b/libdtrace/dt_prov_ip.c
> index 03e929b6..85ee580f 100644
> --- a/libdtrace/dt_prov_ip.c
> +++ b/libdtrace/dt_prov_ip.c
> @@ -1,6 +1,6 @@
>   /*
>    * Oracle Linux DTrace.
> - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
> + * Copyright (c) 2023, 2024, 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.
>    *
> @@ -181,4 +181,5 @@ dt_provimpl_t	dt_ip = {
>   	.enable		= &dt_sdt_enable,
>   	.trampoline	= &trampoline,
>   	.probe_info	= &dt_sdt_probe_info,
> +	.destroy	= &dt_sdt_destroy,
>   };
> diff --git a/libdtrace/dt_prov_proc.c b/libdtrace/dt_prov_proc.c
> index 8ff8e105..752a930b 100644
> --- a/libdtrace/dt_prov_proc.c
> +++ b/libdtrace/dt_prov_proc.c
> @@ -468,8 +468,14 @@ static int probe_info(dtrace_hdl_t *dtp, const dt_probe_t *prp,
>   
>   	for (i = pidx; i < pidx + argc; i++) {
>   		probe_arg_t	*arg = &probe_args[i];
> -
> -		argv[arg->argno] = arg->argdesc;
> +		dt_argdesc_t	*argd = &arg->argdesc;
> +		dt_argdesc_t	*parg = &argv[arg->argno];
> +
> +		*parg = *argd;
> +		if (argd->native)
> +			parg->native = strdup(argd->native);
> +		if (argd->xlate)
> +			parg->xlate = strdup(argd->xlate);
>   	}
>   
>   done:
> diff --git a/libdtrace/dt_prov_rawtp.c b/libdtrace/dt_prov_rawtp.c
> index c604fa3c..8b7d0e69 100644
> --- a/libdtrace/dt_prov_rawtp.c
> +++ b/libdtrace/dt_prov_rawtp.c
> @@ -208,7 +208,7 @@ static int probe_info_bpf(dtrace_hdl_t *dtp, const dt_probe_t *prp,
>   
>   	for (i = 0; i < argc; i++) {
>   		argv[i].mapping = i;
> -		argv[i].native = "uint64_t";
> +		argv[i].native = strdup("uint64_t");
>   		argv[i].xlate = NULL;
>   	}
>   
> diff --git a/libdtrace/dt_prov_sched.c b/libdtrace/dt_prov_sched.c
> index 8703c936..e597fcbe 100644
> --- a/libdtrace/dt_prov_sched.c
> +++ b/libdtrace/dt_prov_sched.c
> @@ -1,6 +1,6 @@
>   /*
>    * Oracle Linux DTrace.
> - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
> + * Copyright (c) 2023, 2024, 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.
>    *
> @@ -148,4 +148,5 @@ dt_provimpl_t	dt_sched = {
>   	.enable		= &dt_sdt_enable,
>   	.trampoline	= &trampoline,
>   	.probe_info	= &dt_sdt_probe_info,
> +	.destroy	= &dt_sdt_destroy,
>   };
> diff --git a/libdtrace/dt_provider_sdt.c b/libdtrace/dt_provider_sdt.c
> index a81668fb..96284848 100644
> --- a/libdtrace/dt_provider_sdt.c
> +++ b/libdtrace/dt_provider_sdt.c
> @@ -154,8 +154,14 @@ dt_sdt_probe_info(dtrace_hdl_t *dtp, const dt_probe_t *prp, int *argcp,
>   
>   	for (i = pidx; i < pidx + argc; i++) {
>   		const probe_arg_t	*arg = &probe_args[i];
> -
> -		argv[arg->argno] = arg->argdesc;
> +		const dt_argdesc_t	*argd = &arg->argdesc;
> +		dt_argdesc_t		*parg = &argv[arg->argno];
> +
> +		*parg = *argd;
> +		if (argd->native)
> +			parg->native = strdup(argd->native);
> +		if (argd->xlate)
> +			parg->xlate = strdup(argd->xlate);
>   	}
>   
>   done:
> diff --git a/libdtrace/dt_provider_tp.c b/libdtrace/dt_provider_tp.c
> index 1d45b70d..2a1094cc 100644
> --- a/libdtrace/dt_provider_tp.c
> +++ b/libdtrace/dt_provider_tp.c
> @@ -126,7 +126,6 @@ dt_tp_event_info(dtrace_hdl_t *dtp, FILE *f, int skip, tp_probe_t *tpp,
>   	int		argc;
>   	size_t		argsz = 0;
>   	dt_argdesc_t	*argv = NULL;
> -	char		*strp;
>   
>   	tpp->event_id = -1;
>   
> @@ -176,10 +175,9 @@ dt_tp_event_info(dtrace_hdl_t *dtp, FILE *f, int skip, tp_probe_t *tpp,
>   	if (argc == 0)
>   		goto done;
>   
> -	argv = dt_zalloc(dtp, argc * sizeof(dt_argdesc_t) + argsz);
> +	argv = dt_calloc(dtp, argc, sizeof(dt_argdesc_t));
>   	if (!argv)
>   		return -ENOMEM;
> -	strp = (char *)(argv + argc);
>   
>   	/*
>   	 * Pass 2:
> @@ -191,6 +189,8 @@ dt_tp_event_info(dtrace_hdl_t *dtp, FILE *f, int skip, tp_probe_t *tpp,
>   		char	*p;
>   		size_t	l;
>   		size_t	size = 0;
> +		char	tstr[DT_TYPE_NAMELEN];
> +		char	*strp;
>   
>   		p = strstr(buf, "size:");
>   		if (p != NULL)
> @@ -217,7 +217,7 @@ dt_tp_event_info(dtrace_hdl_t *dtp, FILE *f, int skip, tp_probe_t *tpp,
>   				*q = '\0';
>   
>   			l = q - p;
> -			memcpy(strp, p, l);
> +			strp = p;
>   		} else {
>   			char	*s, *q;
>   			int	n;
> @@ -251,6 +251,7 @@ dt_tp_event_info(dtrace_hdl_t *dtp, FILE *f, int skip, tp_probe_t *tpp,
>   			if ((q = strrchr(p, ' ')))
>   				*q = '\0';
>   
> +			strp = tstr;
>   			if (alpha) {
>   				ctf_file_t	*ctfp = dtp->dt_shared_ctf;
>   				ctf_id_t	type;
> @@ -275,7 +276,7 @@ dt_tp_event_info(dtrace_hdl_t *dtp, FILE *f, int skip, tp_probe_t *tpp,
>   
>   		argv[argc].mapping = argc;
>   		argv[argc].flags = 0;
> -		argv[argc].native = strp;
> +		argv[argc].native = strdup(strp);
>   		argv[argc].xlate = NULL;
>   
>   		strp += l + 1;



More information about the DTrace-devel mailing list