git: 3ee1bbd01eb3 - stable/14 - dtrace: Fix DOF section-specific validation

Mark Johnston <[email protected]>
Newsgroups gmane.os.freebsd.devel.cvs.src
Message-ID <6a67dc88.26df1.113b72e9__10445.2466637426$1785191606$gmane$org@gitrepo.freebsd.org>
The branch stable/14 has been updated by markj:

URL: https://cgit.FreeBSD.org/src/commit/?id=3ee1bbd01eb3708c8228f083d026d28ed0e07213

commit 3ee1bbd01eb3708c8228f083d026d28ed0e07213
Author:     Mark Johnston <[email protected]>
AuthorDate: 2026-07-06 13:21:43 +0000
Commit:     Mark Johnston <[email protected]>
CommitDate: 2026-07-27 14:05:07 +0000

    dtrace: Fix DOF section-specific validation
    
    The entry size of the probe section is assumed to be at least
    sizeof(dof_probe_t) by the loop further below.
    
    enoff_sec->dofs_entsize was not being validated at all.
    
    When multiplying an index by a table entry size, make sure the
    multiplication can't overflow.
    
    Fix an off-by-one when validating the translated probe argument array.
    
    Make sure that the probe argument argvs are valid string offsets
    even if the argument count is zero.
    
    Reviewed by:    christos
    MFC after:      2 weeks
    Sponsored by:   CHERI Research Centre
    Differential Revision:  https://reviews.freebsd.org/D57979
    
    (cherry picked from commit 7f5fa76367d78e47d483fdf2cc72e5823d0f7807)
---
 .../contrib/opensolaris/uts/common/dtrace/dtrace.c | 30 +++++++++++++++++-----
 1 file changed, 23 insertions(+), 7 deletions(-)

diff --git a/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c b/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c
index ff31d806664b..11d499953c85 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c
+++ b/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c
@@ -16260,7 +16260,8 @@ dtrace_helper_provider_validate(dof_hdr_t *dof, dof_sec_t *sec)
 	}
 
 	if (prb_sec->dofs_entsize == 0 ||
-	    prb_sec->dofs_entsize > prb_sec->dofs_size) {
+	    prb_sec->dofs_entsize > prb_sec->dofs_size ||
+	    prb_sec->dofs_entsize < sizeof (dof_probe_t)) {
 		dtrace_dof_error(dof, "invalid entry size");
 		return (-1);
 	}
@@ -16285,6 +16286,11 @@ dtrace_helper_provider_validate(dof_hdr_t *dof, dof_sec_t *sec)
 		return (-1);
 	}
 
+	if (enoff_sec != NULL && enoff_sec->dofs_entsize != sizeof (uint32_t)) {
+		dtrace_dof_error(dof, "invalid entry size");
+		return (-1);
+	}
+
 	arg = (uint8_t *)(uintptr_t)(daddr + arg_sec->dofs_offset);
 
 	nprobes = prb_sec->dofs_size / prb_sec->dofs_entsize;
@@ -16325,7 +16331,7 @@ dtrace_helper_provider_validate(dof_hdr_t *dof, dof_sec_t *sec)
 		if (probe->dofpr_offidx + probe->dofpr_noffs <
 		    probe->dofpr_offidx ||
 		    (probe->dofpr_offidx + probe->dofpr_noffs) *
-		    off_sec->dofs_entsize > off_sec->dofs_size) {
+		    (uint64_t) off_sec->dofs_entsize > off_sec->dofs_size) {
 			dtrace_dof_error(dof, "invalid probe offset");
 			return (-1);
 		}
@@ -16347,7 +16353,8 @@ dtrace_helper_provider_validate(dof_hdr_t *dof, dof_sec_t *sec)
 			} else if (probe->dofpr_enoffidx +
 			    probe->dofpr_nenoffs < probe->dofpr_enoffidx ||
 			    (probe->dofpr_enoffidx + probe->dofpr_nenoffs) *
-			    enoff_sec->dofs_entsize > enoff_sec->dofs_size) {
+			    (uint64_t) enoff_sec->dofs_entsize >
+			    enoff_sec->dofs_size) {
 				dtrace_dof_error(dof, "invalid is-enabled "
 				    "offset");
 				return (-1);
@@ -16366,13 +16373,17 @@ dtrace_helper_provider_validate(dof_hdr_t *dof, dof_sec_t *sec)
 		if (probe->dofpr_argidx + probe->dofpr_xargc <
 		    probe->dofpr_argidx ||
 		    (probe->dofpr_argidx + probe->dofpr_xargc) *
-		    arg_sec->dofs_entsize > arg_sec->dofs_size) {
+		    (uint64_t) arg_sec->dofs_entsize > arg_sec->dofs_size) {
 			dtrace_dof_error(dof, "invalid args");
 			return (-1);
 		}
 
 		typeidx = probe->dofpr_nargv;
-		typestr = strtab + probe->dofpr_nargv;
+		if (typeidx >= str_sec->dofs_size) {
+			dtrace_dof_error(dof, "bad native argument type");
+			return (-1);
+		}
+		typestr = strtab + typeidx;
 		for (k = 0; k < probe->dofpr_nargc; k++) {
 			if (typeidx >= str_sec->dofs_size) {
 				dtrace_dof_error(dof, "bad "
@@ -16391,9 +16402,14 @@ dtrace_helper_provider_validate(dof_hdr_t *dof, dof_sec_t *sec)
 		}
 
 		typeidx = probe->dofpr_xargv;
-		typestr = strtab + probe->dofpr_xargv;
+		if (typeidx >= str_sec->dofs_size) {
+			dtrace_dof_error(dof, "bad native argument type");
+			return (-1);
+		}
+		typestr = strtab + typeidx;
 		for (k = 0; k < probe->dofpr_xargc; k++) {
-			if (arg[probe->dofpr_argidx + k] > probe->dofpr_nargc) {
+			if (arg[probe->dofpr_argidx + k] >=
+			    probe->dofpr_nargc) {
 				dtrace_dof_error(dof, "bad "
 				    "native argument index");
 				return (-1);
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.