Project

General

Profile

Bug #3387 ยป patch.txt

guy, 11/09/2025 11:14 PM

 
diff --git a/share/man/man4/bpf.4 b/share/man/man4/bpf.4
index 69ed51c455..de93de41a9 100644
--- a/share/man/man4/bpf.4
+++ b/share/man/man4/bpf.4
@@ -591,10 +591,14 @@ A <- A - k
A <- A * k
.It Li BPF_ALU+BPF_DIV+BPF_K
A <- A / k
+.It Li BPF_ALU+BPF_MOD+BPF_K
+A <- A % k
.It Li BPF_ALU+BPF_AND+BPF_K
A <- A & k
.It Li BPF_ALU+BPF_OR+BPF_K
A <- A | k
+.It Li BPF_ALU+BPF_XOR+BPF_K
+A <- A ^ k
.It Li BPF_ALU+BPF_LSH+BPF_K
A <- A << k
.It Li BPF_ALU+BPF_RSH+BPF_K
@@ -607,10 +611,14 @@ A <- A - X
A <- A * X
.It Li BPF_ALU+BPF_DIV+BPF_X
A <- A / X
+.It Li BPF_ALU+BPF_OD+BPF_X
+A <- A % X
.It Li BPF_ALU+BPF_AND+BPF_X
A <- A & X
.It Li BPF_ALU+BPF_OR+BPF_X
A <- A | X
+.It Li BPF_ALU+BPF_XOR+BPF_X
+A <- A ^ X
.It Li BPF_ALU+BPF_LSH+BPF_X
A <- A << X
.It Li BPF_ALU+BPF_RSH+BPF_X
diff --git a/sys/net/bpf_filter.c b/sys/net/bpf_filter.c
index c059535fb3..c4b5aee97f 100644
--- a/sys/net/bpf_filter.c
+++ b/sys/net/bpf_filter.c
@@ -432,6 +432,12 @@ bpf_filter(const struct bpf_insn *pc, u_char *p, u_int wirelen, u_int buflen)
A /= X;
continue;
+ case BPF_ALU|BPF_MOD|BPF_X:
+ if (X == 0)
+ return (0);
+ A %= X;
+ continue;
+
case BPF_ALU|BPF_AND|BPF_X:
A &= X;
continue;
@@ -440,6 +446,10 @@ bpf_filter(const struct bpf_insn *pc, u_char *p, u_int wirelen, u_int buflen)
A |= X;
continue;
+ case BPF_ALU|BPF_XOR|BPF_X:
+ A ^= X;
+ continue;
+
case BPF_ALU|BPF_LSH|BPF_X:
A <<= X;
continue;
@@ -464,6 +474,10 @@ bpf_filter(const struct bpf_insn *pc, u_char *p, u_int wirelen, u_int buflen)
A /= pc->k;
continue;
+ case BPF_ALU|BPF_MOD|BPF_K:
+ A %= pc->k;
+ continue;
+
case BPF_ALU|BPF_AND|BPF_K:
A &= pc->k;
continue;
@@ -472,6 +486,10 @@ bpf_filter(const struct bpf_insn *pc, u_char *p, u_int wirelen, u_int buflen)
A |= pc->k;
continue;
+ case BPF_ALU|BPF_XOR|BPF_K:
+ A ^= pc->k;
+ continue;
+
case BPF_ALU|BPF_LSH|BPF_K:
A <<= pc->k;
continue;
@@ -564,6 +582,7 @@ bpf_validate(const struct bpf_insn *f, int len)
case BPF_NEG:
break;
case BPF_DIV:
+ case BPF_MOD:
/*
* Check for constant division by 0.
*/
    (1-1/1)