diff options
author | Tony Luck <tony.luck@intel.com> | 2005-07-06 18:35:18 -0400 |
---|---|---|
committer | Tony Luck <tony.luck@intel.com> | 2005-07-06 18:35:18 -0400 |
commit | 67d340f440f389e9d56201fb7c7aaa92f262feb1 (patch) | |
tree | a96c26a370beb23282a561ddd936e5d0aa93adde /net/core | |
parent | 2ba3e3e65cf182436757ba13ea8d564e2950fb56 (diff) | |
parent | 159f597a8bd0f1d7650d5e580c93a2666c9c26d1 (diff) |
Auto merge with /home/aegl/GIT/linus
Diffstat (limited to 'net/core')
-rw-r--r-- | net/core/dev.c | 5 | ||||
-rw-r--r-- | net/core/filter.c | 104 | ||||
-rw-r--r-- | net/core/skbuff.c | 2 |
3 files changed, 35 insertions, 76 deletions
diff --git a/net/core/dev.c b/net/core/dev.c index 7016e0c36b..7f5f62c651 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -2089,10 +2089,11 @@ void dev_set_promiscuity(struct net_device *dev, int inc) | |||
2089 | { | 2089 | { |
2090 | unsigned short old_flags = dev->flags; | 2090 | unsigned short old_flags = dev->flags; |
2091 | 2091 | ||
2092 | dev->flags |= IFF_PROMISC; | ||
2093 | if ((dev->promiscuity += inc) == 0) | 2092 | if ((dev->promiscuity += inc) == 0) |
2094 | dev->flags &= ~IFF_PROMISC; | 2093 | dev->flags &= ~IFF_PROMISC; |
2095 | if (dev->flags ^ old_flags) { | 2094 | else |
2095 | dev->flags |= IFF_PROMISC; | ||
2096 | if (dev->flags != old_flags) { | ||
2096 | dev_mc_upload(dev); | 2097 | dev_mc_upload(dev); |
2097 | printk(KERN_INFO "device %s %s promiscuous mode\n", | 2098 | printk(KERN_INFO "device %s %s promiscuous mode\n", |
2098 | dev->name, (dev->flags & IFF_PROMISC) ? "entered" : | 2099 | dev->name, (dev->flags & IFF_PROMISC) ? "entered" : |
diff --git a/net/core/filter.c b/net/core/filter.c index f3b88205ac..cd91a24f97 100644 --- a/net/core/filter.c +++ b/net/core/filter.c | |||
@@ -36,7 +36,7 @@ | |||
36 | #include <linux/filter.h> | 36 | #include <linux/filter.h> |
37 | 37 | ||
38 | /* No hurry in this branch */ | 38 | /* No hurry in this branch */ |
39 | static u8 *load_pointer(struct sk_buff *skb, int k) | 39 | static void *__load_pointer(struct sk_buff *skb, int k) |
40 | { | 40 | { |
41 | u8 *ptr = NULL; | 41 | u8 *ptr = NULL; |
42 | 42 | ||
@@ -50,6 +50,18 @@ static u8 *load_pointer(struct sk_buff *skb, int k) | |||
50 | return NULL; | 50 | return NULL; |
51 | } | 51 | } |
52 | 52 | ||
53 | static inline void *load_pointer(struct sk_buff *skb, int k, | ||
54 | unsigned int size, void *buffer) | ||
55 | { | ||
56 | if (k >= 0) | ||
57 | return skb_header_pointer(skb, k, size, buffer); | ||
58 | else { | ||
59 | if (k >= SKF_AD_OFF) | ||
60 | return NULL; | ||
61 | return __load_pointer(skb, k); | ||
62 | } | ||
63 | } | ||
64 | |||
53 | /** | 65 | /** |
54 | * sk_run_filter - run a filter on a socket | 66 | * sk_run_filter - run a filter on a socket |
55 | * @skb: buffer to run the filter on | 67 | * @skb: buffer to run the filter on |
@@ -64,15 +76,12 @@ static u8 *load_pointer(struct sk_buff *skb, int k) | |||
64 | 76 | ||
65 | int sk_run_filter(struct sk_buff *skb, struct sock_filter *filter, int flen) | 77 | int sk_run_filter(struct sk_buff *skb, struct sock_filter *filter, int flen) |
66 | { | 78 | { |
67 | unsigned char *data = skb->data; | ||
68 | /* len is UNSIGNED. Byte wide insns relies only on implicit | ||
69 | type casts to prevent reading arbitrary memory locations. | ||
70 | */ | ||
71 | unsigned int len = skb->len-skb->data_len; | ||
72 | struct sock_filter *fentry; /* We walk down these */ | 79 | struct sock_filter *fentry; /* We walk down these */ |
80 | void *ptr; | ||
73 | u32 A = 0; /* Accumulator */ | 81 | u32 A = 0; /* Accumulator */ |
74 | u32 X = 0; /* Index Register */ | 82 | u32 X = 0; /* Index Register */ |
75 | u32 mem[BPF_MEMWORDS]; /* Scratch Memory Store */ | 83 | u32 mem[BPF_MEMWORDS]; /* Scratch Memory Store */ |
84 | u32 tmp; | ||
76 | int k; | 85 | int k; |
77 | int pc; | 86 | int pc; |
78 | 87 | ||
@@ -168,86 +177,35 @@ int sk_run_filter(struct sk_buff *skb, struct sock_filter *filter, int flen) | |||
168 | case BPF_LD|BPF_W|BPF_ABS: | 177 | case BPF_LD|BPF_W|BPF_ABS: |
169 | k = fentry->k; | 178 | k = fentry->k; |
170 | load_w: | 179 | load_w: |
171 | if (k >= 0 && (unsigned int)(k+sizeof(u32)) <= len) { | 180 | ptr = load_pointer(skb, k, 4, &tmp); |
172 | A = ntohl(*(u32*)&data[k]); | 181 | if (ptr != NULL) { |
182 | A = ntohl(*(u32 *)ptr); | ||
173 | continue; | 183 | continue; |
174 | } | 184 | } |
175 | if (k < 0) { | ||
176 | u8 *ptr; | ||
177 | |||
178 | if (k >= SKF_AD_OFF) | ||
179 | break; | ||
180 | ptr = load_pointer(skb, k); | ||
181 | if (ptr) { | ||
182 | A = ntohl(*(u32*)ptr); | ||
183 | continue; | ||
184 | } | ||
185 | } else { | ||
186 | u32 _tmp, *p; | ||
187 | p = skb_header_pointer(skb, k, 4, &_tmp); | ||
188 | if (p != NULL) { | ||
189 | A = ntohl(*p); | ||
190 | continue; | ||
191 | } | ||
192 | } | ||
193 | return 0; | 185 | return 0; |
194 | case BPF_LD|BPF_H|BPF_ABS: | 186 | case BPF_LD|BPF_H|BPF_ABS: |
195 | k = fentry->k; | 187 | k = fentry->k; |
196 | load_h: | 188 | load_h: |
197 | if (k >= 0 && (unsigned int)(k + sizeof(u16)) <= len) { | 189 | ptr = load_pointer(skb, k, 2, &tmp); |
198 | A = ntohs(*(u16*)&data[k]); | 190 | if (ptr != NULL) { |
191 | A = ntohs(*(u16 *)ptr); | ||
199 | continue; | 192 | continue; |
200 | } | 193 | } |
201 | if (k < 0) { | ||
202 | u8 *ptr; | ||
203 | |||
204 | if (k >= SKF_AD_OFF) | ||
205 | break; | ||
206 | ptr = load_pointer(skb, k); | ||
207 | if (ptr) { | ||
208 | A = ntohs(*(u16*)ptr); | ||
209 | continue; | ||
210 | } | ||
211 | } else { | ||
212 | u16 _tmp, *p; | ||
213 | p = skb_header_pointer(skb, k, 2, &_tmp); | ||
214 | if (p != NULL) { | ||
215 | A = ntohs(*p); | ||
216 | continue; | ||
217 | } | ||
218 | } | ||
219 | return 0; | 194 | return 0; |
220 | case BPF_LD|BPF_B|BPF_ABS: | 195 | case BPF_LD|BPF_B|BPF_ABS: |
221 | k = fentry->k; | 196 | k = fentry->k; |
222 | load_b: | 197 | load_b: |
223 | if (k >= 0 && (unsigned int)k < len) { | 198 | ptr = load_pointer(skb, k, 1, &tmp); |
224 | A = data[k]; | 199 | if (ptr != NULL) { |
200 | A = *(u8 *)ptr; | ||
225 | continue; | 201 | continue; |
226 | } | 202 | } |
227 | if (k < 0) { | ||
228 | u8 *ptr; | ||
229 | |||
230 | if (k >= SKF_AD_OFF) | ||
231 | break; | ||
232 | ptr = load_pointer(skb, k); | ||
233 | if (ptr) { | ||
234 | A = *ptr; | ||
235 | continue; | ||
236 | } | ||
237 | } else { | ||
238 | u8 _tmp, *p; | ||
239 | p = skb_header_pointer(skb, k, 1, &_tmp); | ||
240 | if (p != NULL) { | ||
241 | A = *p; | ||
242 | continue; | ||
243 | } | ||
244 | } | ||
245 | return 0; | 203 | return 0; |
246 | case BPF_LD|BPF_W|BPF_LEN: | 204 | case BPF_LD|BPF_W|BPF_LEN: |
247 | A = len; | 205 | A = skb->len; |
248 | continue; | 206 | continue; |
249 | case BPF_LDX|BPF_W|BPF_LEN: | 207 | case BPF_LDX|BPF_W|BPF_LEN: |
250 | X = len; | 208 | X = skb->len; |
251 | continue; | 209 | continue; |
252 | case BPF_LD|BPF_W|BPF_IND: | 210 | case BPF_LD|BPF_W|BPF_IND: |
253 | k = X + fentry->k; | 211 | k = X + fentry->k; |
@@ -259,10 +217,12 @@ load_b: | |||
259 | k = X + fentry->k; | 217 | k = X + fentry->k; |
260 | goto load_b; | 218 | goto load_b; |
261 | case BPF_LDX|BPF_B|BPF_MSH: | 219 | case BPF_LDX|BPF_B|BPF_MSH: |
262 | if (fentry->k >= len) | 220 | ptr = load_pointer(skb, fentry->k, 1, &tmp); |
263 | return 0; | 221 | if (ptr != NULL) { |
264 | X = (data[fentry->k] & 0xf) << 2; | 222 | X = (*(u8 *)ptr & 0xf) << 2; |
265 | continue; | 223 | continue; |
224 | } | ||
225 | return 0; | ||
266 | case BPF_LD|BPF_IMM: | 226 | case BPF_LD|BPF_IMM: |
267 | A = fentry->k; | 227 | A = fentry->k; |
268 | continue; | 228 | continue; |
diff --git a/net/core/skbuff.c b/net/core/skbuff.c index bb73b2190e..733deee24b 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c | |||
@@ -357,7 +357,6 @@ struct sk_buff *skb_clone(struct sk_buff *skb, int gfp_mask) | |||
357 | C(ip_summed); | 357 | C(ip_summed); |
358 | C(priority); | 358 | C(priority); |
359 | C(protocol); | 359 | C(protocol); |
360 | C(security); | ||
361 | n->destructor = NULL; | 360 | n->destructor = NULL; |
362 | #ifdef CONFIG_NETFILTER | 361 | #ifdef CONFIG_NETFILTER |
363 | C(nfmark); | 362 | C(nfmark); |
@@ -422,7 +421,6 @@ static void copy_skb_header(struct sk_buff *new, const struct sk_buff *old) | |||
422 | new->pkt_type = old->pkt_type; | 421 | new->pkt_type = old->pkt_type; |
423 | new->stamp = old->stamp; | 422 | new->stamp = old->stamp; |
424 | new->destructor = NULL; | 423 | new->destructor = NULL; |
425 | new->security = old->security; | ||
426 | #ifdef CONFIG_NETFILTER | 424 | #ifdef CONFIG_NETFILTER |
427 | new->nfmark = old->nfmark; | 425 | new->nfmark = old->nfmark; |
428 | new->nfcache = old->nfcache; | 426 | new->nfcache = old->nfcache; |