projects
/
powerpc.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
[NETFILTER]: Avoid skb_copy/pskb_copy/skb_realloc_headroom
[powerpc.git]
/
net
/
netfilter
/
nfnetlink_queue.c
diff --git
a/net/netfilter/nfnetlink_queue.c
b/net/netfilter/nfnetlink_queue.c
index
6ba98ac
..
3ceeffc
100644
(file)
--- a/
net/netfilter/nfnetlink_queue.c
+++ b/
net/netfilter/nfnetlink_queue.c
@@
-617,6
+617,7
@@
static int
nfqnl_mangle(void *data, int data_len, struct nfqnl_queue_entry *e)
{
int diff;
nfqnl_mangle(void *data, int data_len, struct nfqnl_queue_entry *e)
{
int diff;
+ int err;
diff = data_len - e->skb->len;
if (diff < 0) {
diff = data_len - e->skb->len;
if (diff < 0) {
@@
-626,21
+627,14
@@
nfqnl_mangle(void *data, int data_len, struct nfqnl_queue_entry *e)
if (data_len > 0xFFFF)
return -EINVAL;
if (diff > skb_tailroom(e->skb)) {
if (data_len > 0xFFFF)
return -EINVAL;
if (diff > skb_tailroom(e->skb)) {
- struct sk_buff *newskb;
-
- newskb = skb_copy_expand(e->skb,
- skb_headroom(e->skb),
- diff,
- GFP_ATOMIC);
- if (newskb == NULL) {
+ err = pskb_expand_head(e->skb, 0,
+ diff - skb_tailroom(e->skb),
+ GFP_ATOMIC);
+ if (err) {
printk(KERN_WARNING "nf_queue: OOM "
"in mangle, dropping packet\n");
printk(KERN_WARNING "nf_queue: OOM "
"in mangle, dropping packet\n");
- return
-ENOMEM
;
+ return
err
;
}
}
- if (e->skb->sk)
- skb_set_owner_w(newskb, e->skb->sk);
- kfree_skb(e->skb);
- e->skb = newskb;
}
skb_put(e->skb, diff);
}
}
skb_put(e->skb, diff);
}