[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