[DTrace-devel] [PATCH v2 7/8 + 8/8] probe, io, ip, proc, rawtp, sched: fix memory leaks
Kris Van Hees
kris.van.hees at oracle.com
Fri Apr 12 15:30:41 UTC 2024
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;
--
2.42.0
More information about the DTrace-devel
mailing list