[DTrace-devel] [PATCH] Memory corruption fix during dynamic pid probe creation
Eugene Loh
eugene.loh at oracle.com
Mon Apr 12 11:00:01 PDT 2021
Reviewed-by: Eugene Loh <eugene.loh at oracle.com>
with a few nits below
On 4/12/21 1:31 PM, Kris Van Hees wrote:
> The discovery and creation process for pid probes can sometimes
> cause the function name to be replaced in the probe description that
> is used to create pid probes. When that probe description copied
copied -> copies?
> its content from a ECB probe description, we cannot just replcae the
replcae -> replace
> function name value and free the original one because other code data
> may still hold a reference to that function name string.
>
> Make a copy before doing pid probe processing, and free the copy once
> we are done.
>
> Signed-off-by: Kris Van Hees <kris.van.hees at oracle.com>
> ---
> libdtrace/dt_pid.c | 6 +++++-
> 1 file changed, 5 insertions(+), 1 deletion(-)
>
> diff --git a/libdtrace/dt_pid.c b/libdtrace/dt_pid.c
> index cdc9a1d7..fef17292 100644
> --- a/libdtrace/dt_pid.c
> +++ b/libdtrace/dt_pid.c
> @@ -784,7 +784,7 @@ dt_pid_create_probes_module(dtrace_hdl_t *dtp, dt_proc_t *dpr)
> {
> dtrace_prog_t *pgp;
> dt_stmt_t *stp;
> - dtrace_probedesc_t *pdp, pd;
> + dtrace_probedesc_t *pdp;
> pid_t pid;
> int ret = 0, found = B_FALSE;
> char provname[DTRACE_PROVNAMELEN];
> @@ -793,6 +793,7 @@ dt_pid_create_probes_module(dtrace_hdl_t *dtp, dt_proc_t *dpr)
>
> for (pgp = dt_list_next(&dtp->dt_programs); pgp != NULL;
> pgp = dt_list_next(pgp)) {
> + dtrace_probedesc_t pd;
Okay, though I do not understand why you move it inside this loop but
not also inside the stp loop.
> for (stp = dt_list_next(&pgp->dp_stmts); stp != NULL;
> stp = dt_list_next(stp)) {
> @@ -805,6 +806,7 @@ dt_pid_create_probes_module(dtrace_hdl_t *dtp, dt_proc_t *dpr)
> found = B_TRUE;
>
> pd = *pdp;
> + pd.fun = strdup(pd.fun); /* we may change it */
>
> if (gmatch(provname, pdp->prv) != 0 &&
> dt_pid_create_pid_probes(&pd, dtp, NULL, dpr) != 0)
> @@ -819,6 +821,8 @@ dt_pid_create_probes_module(dtrace_hdl_t *dtp, dt_proc_t *dpr)
> dt_pid_create_usdt_probes(&pd, dtp, NULL, dpr) != 0)
> ret = 1;
> #endif
> +
> + free((char *)pd.fun);
> }
> }
>
More information about the DTrace-devel
mailing list