[DTrace-devel] [PATCH 1/3] Ensure proper probe compilation context is set for trampolines

Kris Van Hees kris.van.hees at oracle.com
Fri Jul 2 11:18:56 PDT 2021


Trampolines are generated per-probe, well after the clauses have been
compiled.  The code generation for the trampolines was not setting the
proper probe context which could lead to obscure issues like not having
the proper probe argument information when the trampoline is generated.

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

diff --git a/libdtrace/dt_cc.c b/libdtrace/dt_cc.c
index 9c05e831..2a6904a0 100644
--- a/libdtrace/dt_cc.c
+++ b/libdtrace/dt_cc.c
@@ -1560,7 +1560,7 @@ dt_compile_xlator(dt_node_t *dnp)
 }
 
 void
-dt_setcontext(dtrace_hdl_t *dtp, dtrace_probedesc_t *pdp)
+dt_setcontext(dtrace_hdl_t *dtp, const dtrace_probedesc_t *pdp)
 {
 	const dtrace_pattr_t *pap;
 	dt_probe_t *prp;
@@ -1585,7 +1585,7 @@ dt_setcontext(dtrace_hdl_t *dtp, dtrace_probedesc_t *pdp)
 	    isdigit(pdp->prv[strlen(pdp->prv) - 1]) &&
 	    ((pvp = dt_provider_lookup(dtp, pdp->prv)) == NULL ||
 	     pvp->pv_flags & DT_PROVIDER_PID) &&
-	    dt_pid_create_probes(pdp, dtp, yypcb) != 0) {
+	    dt_pid_create_probes((dtrace_probedesc_t *)pdp, dtp, yypcb) != 0) {
 		longjmp(yypcb->pcb_jmpbuf, EDT_COMPILER);
 	}
 
@@ -2117,7 +2117,7 @@ dt_construct(dtrace_hdl_t *dtp, dt_probe_t *prp, uint_t cflags, dt_ident_t *idp)
 	pcb.pcb_context = DT_CTX_DPROG;
 	pcb.pcb_token = DT_CTX_DPROG;
 	pcb.pcb_probe = prp;
-	pcb.pcb_pdesc = NULL;
+	pcb.pcb_pdesc = prp->desc;
 
 	if ((err = setjmp(yypcb->pcb_jmpbuf)) != 0)
 		goto out;
@@ -2134,6 +2134,7 @@ dt_construct(dtrace_hdl_t *dtp, dt_probe_t *prp, uint_t cflags, dt_ident_t *idp)
 	if (yypcb->pcb_pragmas != NULL)
 		dt_idhash_iter(yypcb->pcb_pragmas, dt_idpragma, NULL);
 
+	dt_setcontext(dtp, yypcb->pcb_pdesc);
 	tnp = dt_node_trampoline(prp);
 	dt_node_type_assign(tnp, dtp->dt_ints[0].did_ctfp,
 				 dtp->dt_ints[0].did_type);
@@ -2164,6 +2165,8 @@ out:
 	     ctf_write(dtp->dt_ddefs->dm_ctfp, dtp->dt_ddefs_fd) == CTF_ERR))
 		dt_dprintf("failed to update CTF cache: %s\n", strerror(errno));
 
+	dt_endcontext(dtp);
+
 	dt_pcb_pop(dtp, err);
 	dt_set_errno(dtp, err);
 
diff --git a/libdtrace/dt_impl.h b/libdtrace/dt_impl.h
index d3e133e7..bd8d9943 100644
--- a/libdtrace/dt_impl.h
+++ b/libdtrace/dt_impl.h
@@ -698,7 +698,7 @@ extern uint64_t dt_stddev(uint64_t *, uint64_t);
 
 extern int dt_options_load(dtrace_hdl_t *);
 
-extern void dt_setcontext(dtrace_hdl_t *, dtrace_probedesc_t *);
+extern void dt_setcontext(dtrace_hdl_t *, const dtrace_probedesc_t *);
 extern void dt_endcontext(dtrace_hdl_t *);
 
 extern void dt_dlib_init(dtrace_hdl_t *dtp);
diff --git a/libdtrace/dt_pid.c b/libdtrace/dt_pid.c
index dc710926..36e8e749 100644
--- a/libdtrace/dt_pid.c
+++ b/libdtrace/dt_pid.c
@@ -504,7 +504,7 @@ dt_pid_fix_mod(dt_pid_probe_t *pp, dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp,
 
 static int
 dt_pid_create_pid_probes(dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp,
-    dt_pcb_t *pcb, dt_proc_t *dpr)
+			 dt_pcb_t *pcb, dt_proc_t *dpr)
 {
 	dt_pid_probe_t pp;
 	int ret = 0;
@@ -685,8 +685,8 @@ dt_pid_create_usdt_probes(dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp,
 #endif
 
 static pid_t
-dt_pid_get_pid(dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp, dt_pcb_t *pcb,
-    dt_proc_t *dpr)
+dt_pid_get_pid(const dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp, dt_pcb_t *pcb,
+	       dt_proc_t *dpr)
 {
 	pid_t pid;
 	char *end;
@@ -741,7 +741,8 @@ dt_pid_create_probes(dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp, dt_pcb_t *pcb)
 		dpr = dt_proc_lookup(dtp, pid);
 		assert(dpr != NULL);
 
-		if ((err = dt_pid_create_pid_probes(pdp, dtp, pcb, dpr)) == 0) {
+		err = dt_pid_create_pid_probes(pdp, dtp, pcb, dpr);
+		if (err == 0) {
 			/*
 			 * Alert other retained enablings which may match
 			 * against the newly created probes.
-- 
2.31.1




More information about the DTrace-devel mailing list