Index | Thread | Search

From:
Martin Pieuchot <mpi@openbsd.org>
Subject:
Re: btrace: Parse unset arguments to 0
To:
Christian Ludwig <christian_ludwig@genua.de>
Cc:
"tech@openbsd.org" <tech@openbsd.org>
Date:
Sun, 21 Jan 2024 19:38:45 -0300

Download raw body.

Thread
On 12/01/24(Fri) 15:45, Christian Ludwig wrote:
> Reading unset arguments from a static tracepoint crashes btrace.
> Set them to "0" instead.

Thanks!  I would prefer if we could place the fix inside builtin_arg().
The rational is that both `dt_dtpis' and `dt_args' are indexed by the
probe number and are not independent.

Here's your fix adapted, ok?

Index: btrace.c
===================================================================
RCS file: /cvs/src/usr.sbin/btrace/btrace.c,v
diff -u -p -r1.81 btrace.c
--- btrace.c	10 Nov 2023 18:56:21 -0000	1.81
+++ btrace.c	21 Jan 2024 22:35:33 -0000
@@ -797,13 +797,18 @@ const char *
 builtin_arg(struct dt_evt *dtev, enum bt_argtype dat)
 {
 	static char buf[sizeof("18446744073709551615")]; /* UINT64_MAX */
-	unsigned int argn;
+	struct dtioc_probe_info *dtpi;
 	struct dtioc_arg_info *dtai;
 	const char *argtype, *fmt;
+	unsigned int argn;
 	long value;
 
-	dtai = dt_args[dtev->dtev_pbn - 1];
 	argn = dat - B_AT_BI_ARG0;
+	dtpi = &dt_dtpis[dtev->dtev_pbn - 1];
+	if (dtpi == NULL || argn >= dtpi->dtpi_nargs)
+		return "0";
+
+	dtai = dt_args[dtev->dtev_pbn - 1];
 	argtype = dtai[argn].dtai_argtype;
 
 	if (strncmp(argtype, "int", DTNAMESIZE) == 0) {