X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=net%2Fipv4%2Fnetfilter%2Fip_queue.c;h=d51e2057226f8119273977402846ff731530c2ed;hb=352771d8dfacc828fdee58d5def490d5fb480c83;hp=26dca38f692ac786e65dfc2a1365baad2c59b409;hpb=8acd6bd4f7d04a05c364bea1883ca3876efde353;p=linux-2.6.git diff --git a/net/ipv4/netfilter/ip_queue.c b/net/ipv4/netfilter/ip_queue.c index 26dca38f6..d51e20572 100644 --- a/net/ipv4/netfilter/ip_queue.c +++ b/net/ipv4/netfilter/ip_queue.c @@ -162,6 +162,7 @@ static inline void __ipq_reset(void) { peer_pid = 0; + net_disable_timestamp(); __ipq_set_mode(IPQ_COPY_NONE, 0); __ipq_flush(NF_DROP); } @@ -257,7 +258,8 @@ ipq_build_packet_message(struct ipq_queue_entry *entry, int *errp) } if (data_len) - memcpy(pmsg->payload, entry->skb->data, data_len); + if (skb_copy_bits(entry->skb, 0, pmsg->payload, data_len)) + BUG(); nlh->nlmsg_len = skb->tail - old_tail; return skb; @@ -362,6 +364,8 @@ ipq_mangle_ipv4(ipq_verdict_msg_t *v, struct ipq_queue_entry *e) } skb_put(e->skb, diff); } + if (!skb_ip_make_writable(&e->skb, v->data_len)) + return -ENOMEM; memcpy(e->skb->data, v->payload, v->data_len); e->skb->nfcache |= NFC_ALTERED; @@ -514,9 +518,10 @@ ipq_rcv_skb(struct sk_buff *skb) write_unlock_bh(&queue_lock); RCV_SKB_FAIL(-EBUSY); } - } - else + } else { + net_enable_timestamp(); peer_pid = pid; + } write_unlock_bh(&queue_lock);