[DTrace-devel] [PATCH 1/2] Clean up error reporting in the BPF progran load process

Kris Van Hees kris.van.hees at oracle.com
Mon Sep 12 17:04:37 UTC 2022


The return value for the attach() provider hook was being passed to
the dtrace_go() through dt_bpf_load_progs(), confusing the dtrace
command line utility which was expecting 0 or -1 (with the proper
error code being set).

It turns out return values were misused in a few other places.  The
code will now explicitly check for -1 as failure indication (and return
-1 explicitly where needed) for dt_aggregate_go(), dt_bpf_gmap_create(),
dt_bpf_load_prog(), and dt_bpf_load_progs().

Signed-off-by: Kris Van Hees <kris.van.hees at oracle.com>
---
 libdtrace/dt_bpf.c  | 12 +++++-------
 libdtrace/dt_work.c | 22 ++++++++--------------
 2 files changed, 13 insertions(+), 21 deletions(-)

diff --git a/libdtrace/dt_bpf.c b/libdtrace/dt_bpf.c
index 95f51e1d..e9f2c4a4 100644
--- a/libdtrace/dt_bpf.c
+++ b/libdtrace/dt_bpf.c
@@ -1044,7 +1044,7 @@ dt_bpf_load_progs(dtrace_hdl_t *dtp, uint_t cflags)
 	 */
 	for (prp = dt_list_next(&dtp->dt_enablings); prp != NULL;
 	     prp = dt_list_next(prp)) {
-		int		fd, rc;
+		int		fd;
 
 		/* Already done. */
 		if (prp == dtp->dt_error)
@@ -1059,15 +1059,13 @@ dt_bpf_load_progs(dtrace_hdl_t *dtp, uint_t cflags)
 
 		fd = dt_bpf_load_prog(dtp, prp, dp, cflags);
 		if (fd < 0)
-			return fd;
+			return -1;
 
 		dt_difo_free(dtp, dp);
 
-		if (!prp->prov->impl->attach)
-			return -1;
-		rc = prp->prov->impl->attach(dtp, prp, fd);
-		if (rc < 0)
-			return rc;
+		if (!prp->prov->impl->attach ||
+		    prp->prov->impl->attach(dtp, prp, fd) < 0)
+			return dt_set_errno(dtp, EDT_ENABLING_ERR);
 	}
 
 	return 0;
diff --git a/libdtrace/dt_work.c b/libdtrace/dt_work.c
index da08d9c5..732eba80 100644
--- a/libdtrace/dt_work.c
+++ b/libdtrace/dt_work.c
@@ -53,7 +53,6 @@ int
 dtrace_go(dtrace_hdl_t *dtp, uint_t cflags)
 {
 	size_t			size;
-	int			err;
 	struct epoll_event	ev;
 	dtrace_optval_t		lockmem = dtp->dt_options[DTRACEOPT_LOCKMEM];
 	struct rlimit		rl;
@@ -69,17 +68,13 @@ dtrace_go(dtrace_hdl_t *dtp, uint_t cflags)
                 setrlimit(RLIMIT_MEMLOCK, &rl);
         }
 
-	/*
-	 * Create the global BPF maps.  This is done only once regardless of
-	 * how many programs there are.
-	 */
-	err = dt_bpf_gmap_create(dtp);
-	if (err)
-		return err;
+	/* Create the global BPF maps. */
+	if (dt_bpf_gmap_create(dtp) == -1)
+		return -1;
 
-	err = dt_bpf_load_progs(dtp, cflags);
-	if (err)
-		return err;
+	/* Load the BPF programs.  */
+	if (dt_bpf_load_progs(dtp, cflags) == -1)
+		return -1;
 
 	/*
 	 * Set up the event polling file descriptor.
@@ -116,9 +111,8 @@ dtrace_go(dtrace_hdl_t *dtp, uint_t cflags)
 	 * We must initialize the aggregation consumer handling before we
 	 * trigger the BEGIN probe.
 	 */
-	err = dt_aggregate_go(dtp);
-	if (err)
-		return err;
+	if (dt_aggregate_go(dtp) == -1)
+		return -1;
 
 	if (RUNNING_ON_VALGRIND)
 		VALGRIND_NON_SIMD_CALL0(BEGIN_probe);
-- 
2.34.1




More information about the DTrace-devel mailing list