[DTrace-devel] [PATCH 08/20] bpf: don't throw away CTF errors when doing relocations

Nick Alcock nick.alcock at oracle.com
Wed May 11 21:12:50 UTC 2022


The first type lookup done after translators are parsed is the set done
to relocate CTF-related offsets.  If something is wrong with the CTF and
the translators are missing, these lookups are likely to fail -- but
since most of these lookups don't set dt_ctferr, the actual error is
discarded and the only thing reported to the user is "unknown CTF
error".  Not even CTF debugging helps.

Signed-off-by: Nick Alcock <nick.alcock at oracle.com>
---
 libdtrace/dt_cc.c | 23 ++++++++++++++---------
 1 file changed, 14 insertions(+), 9 deletions(-)

diff --git a/libdtrace/dt_cc.c b/libdtrace/dt_cc.c
index fba54cb02fdc..c6c31fc92712 100644
--- a/libdtrace/dt_cc.c
+++ b/libdtrace/dt_cc.c
@@ -2380,10 +2380,10 @@ dt_link_construct(dtrace_hdl_t *dtp, const dt_probe_t *prp, dtrace_difo_t *dp,
 				ctf_file_t *cfp = dtp->dt_shared_ctf;
 				ctf_id_t type = ctf_lookup_by_name(cfp, "struct task_struct");
 				ctf_membinfo_t ctm;
-				int rc;
+				int rc = 0;
 
 				if (type == CTF_ERR)
-					return -1;
+					goto err_ctf;
 
 				switch (idp->di_id) {
 				case DT_CONST_TASK_PID:
@@ -2400,7 +2400,7 @@ dt_link_construct(dtrace_hdl_t *dtp, const dt_probe_t *prp, dtrace_difo_t *dp,
 					break;
 				}
 				if (rc == CTF_ERR)
-					return -1;
+					goto err_ctf;
 				nrp->dofr_data = ctm.ctm_offset / NBBY;
 				continue;
 			}
@@ -2411,11 +2411,12 @@ dt_link_construct(dtrace_hdl_t *dtp, const dt_probe_t *prp, dtrace_difo_t *dp,
 				ctf_id_t rc = CTF_ERR;
 
 				if (type == CTF_ERR)
-					return -1;
+					goto err_ctf;
 
 				rc = ctf_member_info(cfp, type, "owner", &ctm);
 				if (rc == CTF_ERR)
-					return -1;
+					goto err_ctf;
+
 				nrp->dofr_data = ctm.ctm_offset / NBBY;
 				continue;
 			}
@@ -2437,18 +2438,18 @@ dt_link_construct(dtrace_hdl_t *dtp, const dt_probe_t *prp, dtrace_difo_t *dp,
 
 				type = ctf_lookup_by_name(cfp, "rwlock_t");
 				if (type == CTF_ERR)
-					return -1;
+					goto err_ctf;
 				rc = ctf_member_info(cfp, type, "raw_lock", &ctm);
 				if (rc == CTF_ERR)
-					return -1;
+					goto err_ctf;
 				total_offset = ctm.ctm_offset / NBBY;
 
 				type = ctf_lookup_by_name(cfp, "arch_rwlock_t");
 				if (type == CTF_ERR)
-					return -1;
+					goto err_ctf;
 				rc = ctf_member_info(cfp, type, "cnts", &ctm);
 				if (rc == CTF_ERR)
-					return -1;
+					goto err_ctf;
 				total_offset += ctm.ctm_offset / NBBY;
 
 				nrp->dofr_data = total_offset;
@@ -2497,6 +2498,10 @@ dt_link_construct(dtrace_hdl_t *dtp, const dt_probe_t *prp, dtrace_difo_t *dp,
 	}
 
 	return pc;
+
+ err_ctf:
+	dtp->dt_ctferr = ctf_errno(dtp->dt_shared_ctf);
+	return -1;
 }
 
 static void
-- 
2.36.1.263.g194b774378.dirty




More information about the DTrace-devel mailing list