diff options
Diffstat (limited to 'net/core')
-rw-r--r-- | net/core/dev.c | 7 | ||||
-rw-r--r-- | net/core/filter.c | 104 | ||||
-rw-r--r-- | net/core/skbuff.c | 19 | ||||
-rw-r--r-- | net/core/sock.c | 11 |
4 files changed, 53 insertions, 88 deletions
diff --git a/net/core/dev.c b/net/core/dev.c index 7016e0c36b3d..ff9dc029233a 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -1127,7 +1127,7 @@ static inline int illegal_highdma(struct net_device *dev, struct sk_buff *skb) | |||
1127 | extern void skb_release_data(struct sk_buff *); | 1127 | extern void skb_release_data(struct sk_buff *); |
1128 | 1128 | ||
1129 | /* Keep head the same: replace data */ | 1129 | /* Keep head the same: replace data */ |
1130 | int __skb_linearize(struct sk_buff *skb, int gfp_mask) | 1130 | int __skb_linearize(struct sk_buff *skb, unsigned int __nocast gfp_mask) |
1131 | { | 1131 | { |
1132 | unsigned int size; | 1132 | unsigned int size; |
1133 | u8 *data; | 1133 | u8 *data; |
@@ -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 f3b88205ace2..cd91a24f9720 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 bb73b2190ec7..d9f7b06fe886 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c | |||
@@ -129,7 +129,7 @@ void skb_under_panic(struct sk_buff *skb, int sz, void *here) | |||
129 | * Buffers may only be allocated from interrupts using a @gfp_mask of | 129 | * Buffers may only be allocated from interrupts using a @gfp_mask of |
130 | * %GFP_ATOMIC. | 130 | * %GFP_ATOMIC. |
131 | */ | 131 | */ |
132 | struct sk_buff *alloc_skb(unsigned int size, int gfp_mask) | 132 | struct sk_buff *alloc_skb(unsigned int size, unsigned int __nocast gfp_mask) |
133 | { | 133 | { |
134 | struct sk_buff *skb; | 134 | struct sk_buff *skb; |
135 | u8 *data; | 135 | u8 *data; |
@@ -182,7 +182,8 @@ nodata: | |||
182 | * %GFP_ATOMIC. | 182 | * %GFP_ATOMIC. |
183 | */ | 183 | */ |
184 | struct sk_buff *alloc_skb_from_cache(kmem_cache_t *cp, | 184 | struct sk_buff *alloc_skb_from_cache(kmem_cache_t *cp, |
185 | unsigned int size, int gfp_mask) | 185 | unsigned int size, |
186 | unsigned int __nocast gfp_mask) | ||
186 | { | 187 | { |
187 | struct sk_buff *skb; | 188 | struct sk_buff *skb; |
188 | u8 *data; | 189 | u8 *data; |
@@ -322,7 +323,7 @@ void __kfree_skb(struct sk_buff *skb) | |||
322 | * %GFP_ATOMIC. | 323 | * %GFP_ATOMIC. |
323 | */ | 324 | */ |
324 | 325 | ||
325 | struct sk_buff *skb_clone(struct sk_buff *skb, int gfp_mask) | 326 | struct sk_buff *skb_clone(struct sk_buff *skb, unsigned int __nocast gfp_mask) |
326 | { | 327 | { |
327 | struct sk_buff *n = kmem_cache_alloc(skbuff_head_cache, gfp_mask); | 328 | struct sk_buff *n = kmem_cache_alloc(skbuff_head_cache, gfp_mask); |
328 | 329 | ||
@@ -357,7 +358,6 @@ struct sk_buff *skb_clone(struct sk_buff *skb, int gfp_mask) | |||
357 | C(ip_summed); | 358 | C(ip_summed); |
358 | C(priority); | 359 | C(priority); |
359 | C(protocol); | 360 | C(protocol); |
360 | C(security); | ||
361 | n->destructor = NULL; | 361 | n->destructor = NULL; |
362 | #ifdef CONFIG_NETFILTER | 362 | #ifdef CONFIG_NETFILTER |
363 | C(nfmark); | 363 | C(nfmark); |
@@ -422,7 +422,6 @@ static void copy_skb_header(struct sk_buff *new, const struct sk_buff *old) | |||
422 | new->pkt_type = old->pkt_type; | 422 | new->pkt_type = old->pkt_type; |
423 | new->stamp = old->stamp; | 423 | new->stamp = old->stamp; |
424 | new->destructor = NULL; | 424 | new->destructor = NULL; |
425 | new->security = old->security; | ||
426 | #ifdef CONFIG_NETFILTER | 425 | #ifdef CONFIG_NETFILTER |
427 | new->nfmark = old->nfmark; | 426 | new->nfmark = old->nfmark; |
428 | new->nfcache = old->nfcache; | 427 | new->nfcache = old->nfcache; |
@@ -462,7 +461,7 @@ static void copy_skb_header(struct sk_buff *new, const struct sk_buff *old) | |||
462 | * header is going to be modified. Use pskb_copy() instead. | 461 | * header is going to be modified. Use pskb_copy() instead. |
463 | */ | 462 | */ |
464 | 463 | ||
465 | struct sk_buff *skb_copy(const struct sk_buff *skb, int gfp_mask) | 464 | struct sk_buff *skb_copy(const struct sk_buff *skb, unsigned int __nocast gfp_mask) |
466 | { | 465 | { |
467 | int headerlen = skb->data - skb->head; | 466 | int headerlen = skb->data - skb->head; |
468 | /* | 467 | /* |
@@ -501,7 +500,7 @@ struct sk_buff *skb_copy(const struct sk_buff *skb, int gfp_mask) | |||
501 | * The returned buffer has a reference count of 1. | 500 | * The returned buffer has a reference count of 1. |
502 | */ | 501 | */ |
503 | 502 | ||
504 | struct sk_buff *pskb_copy(struct sk_buff *skb, int gfp_mask) | 503 | struct sk_buff *pskb_copy(struct sk_buff *skb, unsigned int __nocast gfp_mask) |
505 | { | 504 | { |
506 | /* | 505 | /* |
507 | * Allocate the copy buffer | 506 | * Allocate the copy buffer |
@@ -559,7 +558,8 @@ out: | |||
559 | * reloaded after call to this function. | 558 | * reloaded after call to this function. |
560 | */ | 559 | */ |
561 | 560 | ||
562 | int pskb_expand_head(struct sk_buff *skb, int nhead, int ntail, int gfp_mask) | 561 | int pskb_expand_head(struct sk_buff *skb, int nhead, int ntail, |
562 | unsigned int __nocast gfp_mask) | ||
563 | { | 563 | { |
564 | int i; | 564 | int i; |
565 | u8 *data; | 565 | u8 *data; |
@@ -649,7 +649,8 @@ struct sk_buff *skb_realloc_headroom(struct sk_buff *skb, unsigned int headroom) | |||
649 | * only by netfilter in the cases when checksum is recalculated? --ANK | 649 | * only by netfilter in the cases when checksum is recalculated? --ANK |
650 | */ | 650 | */ |
651 | struct sk_buff *skb_copy_expand(const struct sk_buff *skb, | 651 | struct sk_buff *skb_copy_expand(const struct sk_buff *skb, |
652 | int newheadroom, int newtailroom, int gfp_mask) | 652 | int newheadroom, int newtailroom, |
653 | unsigned int __nocast gfp_mask) | ||
653 | { | 654 | { |
654 | /* | 655 | /* |
655 | * Allocate the copy buffer | 656 | * Allocate the copy buffer |
diff --git a/net/core/sock.c b/net/core/sock.c index a6ec3ada7f9e..8b35ccdc2b3b 100644 --- a/net/core/sock.c +++ b/net/core/sock.c | |||
@@ -622,7 +622,8 @@ lenout: | |||
622 | * @prot: struct proto associated with this new sock instance | 622 | * @prot: struct proto associated with this new sock instance |
623 | * @zero_it: if we should zero the newly allocated sock | 623 | * @zero_it: if we should zero the newly allocated sock |
624 | */ | 624 | */ |
625 | struct sock *sk_alloc(int family, int priority, struct proto *prot, int zero_it) | 625 | struct sock *sk_alloc(int family, unsigned int __nocast priority, |
626 | struct proto *prot, int zero_it) | ||
626 | { | 627 | { |
627 | struct sock *sk = NULL; | 628 | struct sock *sk = NULL; |
628 | kmem_cache_t *slab = prot->slab; | 629 | kmem_cache_t *slab = prot->slab; |
@@ -750,7 +751,8 @@ unsigned long sock_i_ino(struct sock *sk) | |||
750 | /* | 751 | /* |
751 | * Allocate a skb from the socket's send buffer. | 752 | * Allocate a skb from the socket's send buffer. |
752 | */ | 753 | */ |
753 | struct sk_buff *sock_wmalloc(struct sock *sk, unsigned long size, int force, int priority) | 754 | struct sk_buff *sock_wmalloc(struct sock *sk, unsigned long size, int force, |
755 | unsigned int __nocast priority) | ||
754 | { | 756 | { |
755 | if (force || atomic_read(&sk->sk_wmem_alloc) < sk->sk_sndbuf) { | 757 | if (force || atomic_read(&sk->sk_wmem_alloc) < sk->sk_sndbuf) { |
756 | struct sk_buff * skb = alloc_skb(size, priority); | 758 | struct sk_buff * skb = alloc_skb(size, priority); |
@@ -765,7 +767,8 @@ struct sk_buff *sock_wmalloc(struct sock *sk, unsigned long size, int force, int | |||
765 | /* | 767 | /* |
766 | * Allocate a skb from the socket's receive buffer. | 768 | * Allocate a skb from the socket's receive buffer. |
767 | */ | 769 | */ |
768 | struct sk_buff *sock_rmalloc(struct sock *sk, unsigned long size, int force, int priority) | 770 | struct sk_buff *sock_rmalloc(struct sock *sk, unsigned long size, int force, |
771 | unsigned int __nocast priority) | ||
769 | { | 772 | { |
770 | if (force || atomic_read(&sk->sk_rmem_alloc) < sk->sk_rcvbuf) { | 773 | if (force || atomic_read(&sk->sk_rmem_alloc) < sk->sk_rcvbuf) { |
771 | struct sk_buff *skb = alloc_skb(size, priority); | 774 | struct sk_buff *skb = alloc_skb(size, priority); |
@@ -780,7 +783,7 @@ struct sk_buff *sock_rmalloc(struct sock *sk, unsigned long size, int force, int | |||
780 | /* | 783 | /* |
781 | * Allocate a memory block from the socket's option memory buffer. | 784 | * Allocate a memory block from the socket's option memory buffer. |
782 | */ | 785 | */ |
783 | void *sock_kmalloc(struct sock *sk, int size, int priority) | 786 | void *sock_kmalloc(struct sock *sk, int size, unsigned int __nocast priority) |
784 | { | 787 | { |
785 | if ((unsigned)size <= sysctl_optmem_max && | 788 | if ((unsigned)size <= sysctl_optmem_max && |
786 | atomic_read(&sk->sk_omem_alloc) + size < sysctl_optmem_max) { | 789 | atomic_read(&sk->sk_omem_alloc) + size < sysctl_optmem_max) { |