[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