From: Patrick McHardy
Sent: 1/6/2006 5:12:33 PM
> > -static inline void *load_pointer(struct sk_buff *skb, int k,
> > - unsigned int size, void *buffer)
> > +static inline void *load_pointer(struct sk_buff *skb, int k, unsigned int
> > size)
> > {
> > - if (k >= 0)
> > + if (k >= 0) {
> > + u32 *buffer = NULL;
> > return skb_header_pointer(skb, k, size, buffer);
>
> This is wrong, skb_header_pointer needs a pointer to a buffer
> to which it can copy the packet contents if they are located
> in the non-linear area.
Ah, gotcha.
--- x/net/core/filter.c 2006-01-06 19:14:34.000000000 -0600
+++ y/net/core/filter.c 2006-01-06 19:14:26.000000000 -0600
@@ -51,12 +51,12 @@ static void *__load_pointer(struct sk_bu
return NULL;
}
-static inline void *load_pointer(struct sk_buff *skb, int k,
- unsigned int size, void *buffer)
+static inline void *load_pointer(struct sk_buff *skb, int k, unsigned int size)
{
- if (k >= 0)
- return skb_header_pointer(skb, k, size, buffer);
- else {
+ if (k >= 0) {
+ u32 buffer;
+ return skb_header_pointer(skb, k, size, &buffer);
+ } else {
if (k >= SKF_AD_OFF)
return NULL;
return __load_pointer(skb, k);
@@ -82,7 +82,6 @@ unsigned int sk_run_filter(struct sk_buf
u32 A = 0; /* Accumulator */
u32 X = 0; /* Index Register */
u32 mem[BPF_MEMWORDS]; /* Scratch Memory Store */
- u32 tmp;
int k;
int pc;
@@ -176,7 +175,7 @@ unsigned int sk_run_filter(struct sk_buf
case BPF_LD|BPF_W|BPF_ABS:
k = fentry->k;
load_w:
- ptr = load_pointer(skb, k, 4, &tmp);
+ ptr = load_pointer(skb, k, 4);
if (ptr != NULL) {
A = ntohl(*(u32 *)ptr);
continue;
@@ -185,7 +184,7 @@ unsigned int sk_run_filter(struct sk_buf
case BPF_LD|BPF_H|BPF_ABS:
k = fentry->k;
load_h:
- ptr = load_pointer(skb, k, 2, &tmp);
+ ptr = load_pointer(skb, k, 2);
if (ptr != NULL) {
A = ntohs(*(u16 *)ptr);
continue;
@@ -194,7 +193,7 @@ unsigned int sk_run_filter(struct sk_buf
case BPF_LD|BPF_B|BPF_ABS:
k = fentry->k;
load_b:
- ptr = load_pointer(skb, k, 1, &tmp);
+ ptr = load_pointer(skb, k, 1);
if (ptr != NULL) {
A = *(u8 *)ptr;
continue;
@@ -216,7 +215,7 @@ load_b:
k = X + fentry->k;
goto load_b;
case BPF_LDX|BPF_B|BPF_MSH:
- ptr = load_pointer(skb, fentry->k, 1, &tmp);
+ ptr = load_pointer(skb, fentry->k, 1);
if (ptr != NULL) {
X = (*(u8 *)ptr & 0xf) << 2;
continue;
-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html