summaryrefslogtreecommitdiff
path: root/sys/net/bpf_filter.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/net/bpf_filter.c')
-rw-r--r--sys/net/bpf_filter.c94
1 files changed, 40 insertions, 54 deletions
diff --git a/sys/net/bpf_filter.c b/sys/net/bpf_filter.c
index a452448390341..63f78f8e889d7 100644
--- a/sys/net/bpf_filter.c
+++ b/sys/net/bpf_filter.c
@@ -37,7 +37,7 @@
*
* @(#)bpf_filter.c 8.1 (Berkeley) 6/10/93
*
- * $Id: bpf_filter.c,v 1.11 1998/12/07 03:26:34 eivind Exp $
+ * $Id: bpf_filter.c,v 1.8 1997/02/22 09:40:57 peter Exp $
*/
#include <sys/param.h>
@@ -46,30 +46,27 @@
#include <netinet/in.h>
#endif
-#if defined(sparc) || defined(mips) || defined(ibm032) || defined(__alpha__)
+#if defined(sparc) || defined(mips) || defined(ibm032)
#define BPF_ALIGN
#endif
#ifndef BPF_ALIGN
-#define EXTRACT_SHORT(p) ((u_int16_t)ntohs(*(u_int16_t *)p))
-#define EXTRACT_LONG(p) (ntohl(*(u_int32_t *)p))
+#define EXTRACT_SHORT(p) ((u_short)ntohs(*(u_short *)p))
+#define EXTRACT_LONG(p) (ntohl(*(u_long *)p))
#else
#define EXTRACT_SHORT(p)\
- ((u_int16_t)\
- ((u_int16_t)*((u_char *)p+0)<<8|\
- (u_int16_t)*((u_char *)p+1)<<0))
+ ((u_short)\
+ ((u_short)*((u_char *)p+0)<<8|\
+ (u_short)*((u_char *)p+1)<<0))
#define EXTRACT_LONG(p)\
- ((u_int32_t)*((u_char *)p+0)<<24|\
- (u_int32_t)*((u_char *)p+1)<<16|\
- (u_int32_t)*((u_char *)p+2)<<8|\
- (u_int32_t)*((u_char *)p+3)<<0)
+ ((u_long)*((u_char *)p+0)<<24|\
+ (u_long)*((u_char *)p+1)<<16|\
+ (u_long)*((u_char *)p+2)<<8|\
+ (u_long)*((u_char *)p+3)<<0)
#endif
#ifdef KERNEL
#include <sys/mbuf.h>
-#endif
-#include <net/bpf.h>
-#ifdef KERNEL
#define MINDEX(m, k) \
{ \
register int len = m->m_len; \
@@ -83,16 +80,15 @@
} \
}
-static u_int16_t m_xhalf __P((struct mbuf *m, bpf_u_int32 k, int *err));
-static u_int32_t m_xword __P((struct mbuf *m, bpf_u_int32 k, int *err));
+static int m_xhalf __P((struct mbuf *m, int k, int *err));
+static int m_xword __P((struct mbuf *m, int k, int *err));
-static u_int32_t
+static int
m_xword(m, k, err)
register struct mbuf *m;
- register bpf_u_int32 k;
- register int *err;
+ register int k, *err;
{
- register size_t len;
+ register int len;
register u_char *cp, *np;
register struct mbuf *m0;
@@ -117,38 +113,27 @@ m_xword(m, k, err)
switch (len - k) {
case 1:
- return
- ((u_int32_t)cp[0] << 24) |
- ((u_int32_t)np[0] << 16) |
- ((u_int32_t)np[1] << 8) |
- (u_int32_t)np[2];
+ return (cp[0] << 24) | (np[0] << 16) | (np[1] << 8) | np[2];
case 2:
- return
- ((u_int32_t)cp[0] << 24) |
- ((u_int32_t)cp[1] << 16) |
- ((u_int32_t)np[0] << 8) |
- (u_int32_t)np[1];
+ return (cp[0] << 24) | (cp[1] << 16) | (np[0] << 8) |
+ np[1];
default:
- return
- ((u_int32_t)cp[0] << 24) |
- ((u_int32_t)cp[1] << 16) |
- ((u_int32_t)cp[2] << 8) |
- (u_int32_t)np[0];
+ return (cp[0] << 24) | (cp[1] << 16) | (cp[2] << 8) |
+ np[0];
}
bad:
*err = 1;
return 0;
}
-static u_int16_t
+static int
m_xhalf(m, k, err)
register struct mbuf *m;
- register bpf_u_int32 k;
- register int *err;
+ register int k, *err;
{
- register size_t len;
+ register int len;
register u_char *cp;
register struct mbuf *m0;
@@ -176,6 +161,7 @@ m_xhalf(m, k, err)
}
#endif
+#include <net/bpf.h>
/*
* Execute the filter program starting at pc on the packet p
* wirelen is the length of the original packet
@@ -188,9 +174,9 @@ bpf_filter(pc, p, wirelen, buflen)
u_int wirelen;
register u_int buflen;
{
- register u_int32_t A = 0, X = 0;
- register bpf_u_int32 k;
- int32_t mem[BPF_MEMWORDS];
+ register u_long A = 0, X = 0;
+ register int k;
+ long mem[BPF_MEMWORDS];
if (pc == 0)
/*
@@ -217,7 +203,7 @@ bpf_filter(pc, p, wirelen, buflen)
case BPF_LD|BPF_W|BPF_ABS:
k = pc->k;
- if (k > buflen || sizeof(int32_t) > buflen - k) {
+ if (k + sizeof(long) > buflen) {
#ifdef KERNEL
int merr;
@@ -232,16 +218,16 @@ bpf_filter(pc, p, wirelen, buflen)
#endif
}
#ifdef BPF_ALIGN
- if (((intptr_t)(p + k) & 3) != 0)
+ if (((int)(p + k) & 3) != 0)
A = EXTRACT_LONG(&p[k]);
else
#endif
- A = ntohl(*(int32_t *)(p + k));
+ A = ntohl(*(long *)(p + k));
continue;
case BPF_LD|BPF_H|BPF_ABS:
k = pc->k;
- if (k > buflen || sizeof(int16_t) > buflen - k) {
+ if (k + sizeof(short) > buflen) {
#ifdef KERNEL
int merr;
@@ -285,7 +271,7 @@ bpf_filter(pc, p, wirelen, buflen)
case BPF_LD|BPF_W|BPF_IND:
k = X + pc->k;
- if (pc->k > buflen || X > buflen - pc->k || sizeof(int32_t) > buflen - k) {
+ if (k + sizeof(long) > buflen) {
#ifdef KERNEL
int merr;
@@ -300,16 +286,16 @@ bpf_filter(pc, p, wirelen, buflen)
#endif
}
#ifdef BPF_ALIGN
- if (((intptr_t)(p + k) & 3) != 0)
+ if (((int)(p + k) & 3) != 0)
A = EXTRACT_LONG(&p[k]);
else
#endif
- A = ntohl(*(int32_t *)(p + k));
+ A = ntohl(*(long *)(p + k));
continue;
case BPF_LD|BPF_H|BPF_IND:
k = X + pc->k;
- if (X > buflen || pc->k > buflen - X || sizeof(int16_t) > buflen - k) {
+ if (k + sizeof(short) > buflen) {
#ifdef KERNEL
int merr;
@@ -328,7 +314,7 @@ bpf_filter(pc, p, wirelen, buflen)
case BPF_LD|BPF_B|BPF_IND:
k = X + pc->k;
- if (pc->k >= buflen || X >= buflen - k) {
+ if (k >= buflen) {
#ifdef KERNEL
register struct mbuf *m;
@@ -534,10 +520,10 @@ bpf_validate(f, len)
register int from = i + 1;
if (BPF_OP(p->code) == BPF_JA) {
- if (from >= len || p->k >= len - from)
+ if (from + p->k >= len)
return 0;
}
- else if (from >= len || p->jt >= len - from || p->jf >= len - from)
+ else if (from + p->jt >= len || from + p->jf >= len)
return 0;
}
/*
@@ -546,7 +532,7 @@ bpf_validate(f, len)
if ((BPF_CLASS(p->code) == BPF_ST ||
(BPF_CLASS(p->code) == BPF_LD &&
(p->code & 0xe0) == BPF_MEM)) &&
- p->k >= BPF_MEMWORDS)
+ (p->k >= BPF_MEMWORDS || p->k < 0))
return 0;
/*
* Check for constant division by 0.