Module Name:    src
Committed By:   alnsn
Date:           Sat Jul  5 22:06:11 UTC 2014

Modified Files:
        src/sys/net: bpf_filter.c

Log Message:
Implement error checking in m_xbyte() and check for errors after m_xbyte() call.
Reuse (len - k) expression in m_xword() and m_xhalf() to give an optimization
hint to a compiler.

When m_xbyte() didn't exist, bpf_filter() handled out-of-bounds BPF_B loads
correctly because "return 0" inside MINDEX() was aborting filter programs.
After the change that added m_xbyte() zero values were passed to A or X
registers instead of aborting a filter program.


To generate a diff of this commit:
cvs rdiff -u -r1.65 -r1.66 src/sys/net/bpf_filter.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/net/bpf_filter.c
diff -u src/sys/net/bpf_filter.c:1.65 src/sys/net/bpf_filter.c:1.66
--- src/sys/net/bpf_filter.c:1.65	Wed Jun 25 09:51:34 2014
+++ src/sys/net/bpf_filter.c	Sat Jul  5 22:06:11 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: bpf_filter.c,v 1.65 2014/06/25 09:51:34 alnsn Exp $	*/
+/*	$NetBSD: bpf_filter.c,v 1.66 2014/07/05 22:06:11 alnsn Exp $	*/
 
 /*-
  * Copyright (c) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997
@@ -37,7 +37,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: bpf_filter.c,v 1.65 2014/06/25 09:51:34 alnsn Exp $");
+__KERNEL_RCSID(0, "$NetBSD: bpf_filter.c,v 1.66 2014/07/05 22:06:11 alnsn Exp $");
 
 #if 0
 #if !(defined(lint) || defined(KERNEL))
@@ -124,12 +124,12 @@ m_xword(const struct mbuf *m, uint32_t k
 	*err = 1;
 	MINDEX(len, m, k);
 	cp = mtod(m, u_char *) + k;
-	if (len >= k + 4) {
+	if (len - k >= 4) {
 		*err = 0;
 		return EXTRACT_LONG(cp);
 	}
 	m0 = m->m_next;
-	if (m0 == 0 || m0->m_len + len - k < 4)
+	if (m0 == 0 || (len - k) + m0->m_len < 4)
 		return 0;
 	*err = 0;
 	np = mtod(m0, u_char *);
@@ -154,7 +154,7 @@ m_xhalf(const struct mbuf *m, uint32_t k
 	*err = 1;
 	MINDEX(len, m, k);
 	cp = mtod(m, u_char *) + k;
-	if (len >= k + 2) {
+	if (len - k >= 2) {
 		*err = 0;
 		return EXTRACT_SHORT(cp);
 	}
@@ -170,8 +170,9 @@ m_xbyte(const struct mbuf *m, uint32_t k
 {
 	int len;
 
-	*err = 0;
+	*err = 1;
 	MINDEX(len, m, k);
+	*err = 0;
 	return mtod(m, u_char *)[k];
 }
 #else /* _KERNEL */
@@ -306,6 +307,8 @@ bpf_filter(const struct bpf_insn *pc, co
 				if (args->buflen != 0)
 					return 0;
 				A = xbyte(args->pkt, k, &merr);
+				if (merr != 0)
+					return 0;
 				continue;
 #else
 				return 0;
@@ -374,6 +377,8 @@ bpf_filter(const struct bpf_insn *pc, co
 				if (args->buflen != 0)
 					return 0;
 				A = xbyte(args->pkt, k, &merr);
+				if (merr != 0)
+					return 0;
 				continue;
 #else
 				return 0;
@@ -391,6 +396,8 @@ bpf_filter(const struct bpf_insn *pc, co
 				if (args->buflen != 0)
 					return 0;
 				X = (xbyte(args->pkt, k, &merr) & 0xf) << 2;
+				if (merr != 0)
+					return 0;
 				continue;
 #else
 				return 0;

Reply via email to