[DTrace-devel] [PATCH] tstring: fix leaks

Kris Van Hees kris.van.hees at oracle.com
Thu Jul 17 18:16:27 UTC 2025


Temporary strings were not being freed in various places.

Signed-off-by: Kris Van Hees <kris.van.hees at oracle.com>
---
 libdtrace/dt_cg.c     | 12 ++++++------
 libdtrace/dt_parser.c |  1 +
 libdtrace/dt_parser.h |  2 +-
 3 files changed, 8 insertions(+), 7 deletions(-)

diff --git a/libdtrace/dt_cg.c b/libdtrace/dt_cg.c
index c3376ee9..1a57686f 100644
--- a/libdtrace/dt_cg.c
+++ b/libdtrace/dt_cg.c
@@ -1515,6 +1515,7 @@ dt_cg_tstring_free(dt_pcb_t *pcb, dt_node_t *dnp)
 	case DT_NODE_OP2:
 	case DT_NODE_OP3:
 	case DT_NODE_DEXPR:
+	case DT_NODE_VAR:
 		if (dnp->dn_tstring) {
 			dt_cg_tstring_xfree(pcb, dnp->dn_tstring->dn_value);
 			dnp->dn_tstring = NULL;
@@ -4969,12 +4970,6 @@ dt_cg_asgn_op(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp)
 		idp = dt_ident_resolve(dnp->dn_left->dn_ident);
 
 		dt_cg_store_var(dnp, dlp, drp, idp);
-
-		/*
-		 * Move the (possibly) tstring from dn_right to the op node.
-		 */
-		dnp->dn_tstring = dnp->dn_right->dn_tstring;
-		dnp->dn_right->dn_tstring = NULL;
 	} else {
 		uint_t rbit = dnp->dn_left->dn_flags & DT_NF_REF;
 
@@ -5920,6 +5915,7 @@ dt_cg_subr_bcopy_impl(dt_node_t *dnp, dt_node_t *dst, dt_node_t *src,
 	dt_regset_free(drp, src->dn_reg);
 	dt_regset_free(drp, dst->dn_reg);
 	dt_regset_free(drp, size->dn_reg);
+	dt_cg_tstring_free(yypcb, src);
 
 	TRACE_REGSET("      subr-bcopy-impl:End  ");
 }
@@ -6958,6 +6954,7 @@ dt_cg_node(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp)
 		dt_cg_node(dnp->dn_right, dlp, drp);
 		dnp->dn_reg = dnp->dn_right->dn_reg;
 		dt_cg_asgn_op(dnp, dlp, drp);
+		dt_cg_tstring_free(yypcb, dnp->dn_right);
 		break;
 
 	case DT_TOK_ADD_EQ:
@@ -7191,6 +7188,9 @@ dt_cg_node(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp)
 		dt_cg_node(dnp->dn_child, dlp, drp);
 		dt_cg_check_notnull(dlp, drp, dnp->dn_child->dn_reg);
 		dnp->dn_reg = dnp->dn_child->dn_reg;
+		/* Move the tstring (if any) to the result. */
+		dnp->dn_tstring = dnp->dn_child->dn_tstring;
+		dnp->dn_child->dn_tstring = NULL;
 		break;
 
 	case DT_TOK_XLATE:
diff --git a/libdtrace/dt_parser.c b/libdtrace/dt_parser.c
index f777a910..7e5bac48 100644
--- a/libdtrace/dt_parser.c
+++ b/libdtrace/dt_parser.c
@@ -1238,6 +1238,7 @@ dt_node_is_tstring(const dt_node_t *dnp)
 	case DT_NODE_OP2:
 	case DT_NODE_OP3:
 	case DT_NODE_DEXPR:
+	case DT_NODE_VAR:
 		return dnp->dn_tstring != NULL;
 	}
 }
diff --git a/libdtrace/dt_parser.h b/libdtrace/dt_parser.h
index ff32a84a..297bf6c9 100644
--- a/libdtrace/dt_parser.h
+++ b/libdtrace/dt_parser.h
@@ -105,7 +105,7 @@ typedef struct dt_node {
 #define	dn_expr		dn_u._nodes._links[2]	/* DT_NODE_OP3, DEXPR */
 #define	dn_aggfun	dn_u._nodes._links[0]	/* DT_NODE_AGG */
 #define	dn_aggtup	dn_u._nodes._links[1]	/* DT_NODE_AGG */
-#define	dn_tstring	dn_u._nodes._links[3]	/* FUNC, OP1, OP2, OP3, DEXPR */
+#define	dn_tstring	dn_u._nodes._links[3]	/* FUNC,OP1,OP2,OP3,DEXPR,VAR */
 #define	dn_pdescs	dn_u._clause._descs	/* DT_NODE_CLAUSE */
 #define	dn_pred		dn_u._clause._pred	/* DT_NODE_CLAUSE */
 #define	dn_acts		dn_u._clause._acts	/* DT_NODE_CLAUSE */
-- 
2.45.2




More information about the DTrace-devel mailing list