[DTrace-devel] [PATCH] tstring: fix leaks
Eugene Loh
eugene.loh at oracle.com
Fri Jul 18 17:49:35 UTC 2025
I don't understand the details, but looks like the road I was heading
down and the testing looks good.
Reviewed-by: Eugene Loh <eugene.loh at oracle.com>
On 7/17/25 14:16, Kris Van Hees wrote:
> 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 */
More information about the DTrace-devel
mailing list