[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