[DTrace-devel] [PATCH] Fix error reporting for agg walk functioons

Kris Van Hees kris.van.hees at oracle.com
Fri Aug 12 07:01:03 UTC 2022


Callback functions for aggregation walkers were not correctly returning
DTRACE_AGGWALK_* values, causing "invalid return value from callback"
errors to be reported rather than the actual error.  This is only seen
when the consumer code has a bug in it (e.g. record description
mismatches).

Signed-off-by: Kris Van Hees <kris.van.hees at oracle.com>
---
 libdtrace/dt_aggregate.c |  2 +-
 libdtrace/dt_consume.c   | 20 ++++++++++----------
 libdtrace/dt_printf.c    | 16 ++++++++++------
 3 files changed, 21 insertions(+), 17 deletions(-)

diff --git a/libdtrace/dt_aggregate.c b/libdtrace/dt_aggregate.c
index f079073a..559a497e 100644
--- a/libdtrace/dt_aggregate.c
+++ b/libdtrace/dt_aggregate.c
@@ -1112,7 +1112,7 @@ dt_aggwalk_rval(dtrace_hdl_t *dtp, dt_ahashent_t *h, int rval)
 		/*
 		 * We assume that errno is already set in this case.
 		 */
-		return dt_set_errno(dtp, errno);
+		return -1;
 
 	case DTRACE_AGGWALK_ABORT:
 		return dt_set_errno(dtp, EDT_DIRABORT);
diff --git a/libdtrace/dt_consume.c b/libdtrace/dt_consume.c
index 51e7c43a..973084d6 100644
--- a/libdtrace/dt_consume.c
+++ b/libdtrace/dt_consume.c
@@ -1722,11 +1722,11 @@ dt_print_aggs(const dtrace_aggdata_t **aggsdata, int naggvars, void *arg)
 		}
 
 		if (dt_print_datum(dtp, fp, rec, addr, size, 1, 0) < 0)
-			return -1;
+			return DTRACE_AGGWALK_ERROR;
 
 		if (dt_buffered_flush(dtp, NULL, rec, aggdata,
 				      DTRACE_BUFDATA_AGGKEY) < 0)
-			return -1;
+			return DTRACE_AGGWALK_ERROR;
 	}
 
 	for (i = (naggvars == 1 ? 0 : 1); i < naggvars; i++) {
@@ -1743,25 +1743,25 @@ dt_print_aggs(const dtrace_aggdata_t **aggsdata, int naggvars, void *arg)
 
 		if (dt_print_datum(dtp, fp, rec, addr, size, normal,
 				   agg->dtagd_sig) < 0)
-			return -1;
+			return DTRACE_AGGWALK_ERROR;
 
 		if (dt_buffered_flush(dtp, NULL, rec, aggdata,
 				      DTRACE_BUFDATA_AGGVAL) < 0)
-			return -1;
+			return DTRACE_AGGWALK_ERROR;
 
 		if (!pd->dtpa_allunprint)
 			agg->dtagd_flags |= DTRACE_AGD_PRINTED;
 	}
 
 	if (dt_printf(dtp, fp, "\n") < 0)
-		return -1;
+		return DTRACE_AGGWALK_ERROR;
 
 	if (dt_buffered_flush(dtp, NULL, NULL, aggdata,
 			      DTRACE_BUFDATA_AGGFORMAT |
 			      DTRACE_BUFDATA_AGGLAST) < 0)
-		return -1;
+		return DTRACE_AGGWALK_ERROR;
 
-	return 0;
+	return DTRACE_AGGWALK_NEXT;
 }
 
 int
@@ -1773,7 +1773,7 @@ dt_print_agg(const dtrace_aggdata_t *aggdata, void *arg)
 
 	if (pd->dtpa_allunprint) {
 		if (agg->dtagd_flags & DTRACE_AGD_PRINTED)
-			return 0;
+			return DTRACE_AGGWALK_NEXT;
 	} else {
 		/*
 		 * If we're not printing all unprinted aggregations, then the
@@ -1782,10 +1782,10 @@ dt_print_agg(const dtrace_aggdata_t *aggdata, void *arg)
 		 * that we encounter.
 		 */
 		if (agg->dtagd_nrecs == 0)
-			return 0;
+			return DTRACE_AGGWALK_NEXT;
 
 		if (aggvarid != agg->dtagd_varid)
-			return 0;
+			return DTRACE_AGGWALK_NEXT;
 	}
 
 	return dt_print_aggs(&aggdata, 1, arg);
diff --git a/libdtrace/dt_printf.c b/libdtrace/dt_printf.c
index 5fccb555..4fb20b23 100644
--- a/libdtrace/dt_printf.c
+++ b/libdtrace/dt_printf.c
@@ -1818,8 +1818,10 @@ dt_fprinta(const dtrace_aggdata_t *adp, void *arg)
 		return 0;	/* id does not match */
 
 	if (dt_printf_format(dtp, pfw->pfw_fp, pfw->pfw_argv, rec, nrecs,
-			     adp->dtada_data, adp->dtada_size, &adp, 1) == -1)
-		return (pfw->pfw_err = dtp->dt_errno);
+			     adp->dtada_data, adp->dtada_size, &adp, 1) == -1) {
+		pfw->pfw_err = dtp->dt_errno;
+		return DTRACE_AGGWALK_ERROR;
+	}
 
 	/*
 	 * Cast away the const to set the bit indicating that this aggregation
@@ -1827,7 +1829,7 @@ dt_fprinta(const dtrace_aggdata_t *adp, void *arg)
 	 */
 	((dtrace_aggdesc_t *)agg)->dtagd_flags |= DTRACE_AGD_PRINTED;
 
-	return 0;
+	return DTRACE_AGGWALK_NEXT;
 }
 
 static int
@@ -1843,8 +1845,10 @@ dt_fprintas(const dtrace_aggdata_t **aggsdata, int naggvars, void *arg)
 
 	if (dt_printf_format(dtp, pfw->pfw_fp, pfw->pfw_argv, rec, nrecs,
 			     aggdata->dtada_data, aggdata->dtada_size,
-			     aggsdata, naggvars) == -1)
-		return (pfw->pfw_err = dtp->dt_errno);
+			     aggsdata, naggvars) == -1) {
+		pfw->pfw_err = dtp->dt_errno;
+		return DTRACE_AGGWALK_ERROR;
+	}
 
 	/*
 	 * For each aggregation, indicate that it has been printed, casting
@@ -1855,7 +1859,7 @@ dt_fprintas(const dtrace_aggdata_t **aggsdata, int naggvars, void *arg)
 		((dtrace_aggdesc_t *)agg)->dtagd_flags |= DTRACE_AGD_PRINTED;
 	}
 
-	return 0;
+	return DTRACE_AGGWALK_NEXT;
 }
 
 int
-- 
2.34.1




More information about the DTrace-devel mailing list