[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