diff options
Diffstat (limited to 'net/ipv4/netfilter')
-rw-r--r-- | net/ipv4/netfilter/arpt_mangle.c | 8 | ||||
-rw-r--r-- | net/ipv4/netfilter/ip_queue.c | 4 | ||||
-rw-r--r-- | net/ipv4/netfilter/nf_nat_helper.c | 3 |
3 files changed, 8 insertions, 7 deletions
diff --git a/net/ipv4/netfilter/arpt_mangle.c b/net/ipv4/netfilter/arpt_mangle.c index b4450f1ccc1..6298d404e7c 100644 --- a/net/ipv4/netfilter/arpt_mangle.c +++ b/net/ipv4/netfilter/arpt_mangle.c | |||
@@ -37,28 +37,28 @@ target(struct sk_buff **pskb, | |||
37 | /* We assume that pln and hln were checked in the match */ | 37 | /* We assume that pln and hln were checked in the match */ |
38 | if (mangle->flags & ARPT_MANGLE_SDEV) { | 38 | if (mangle->flags & ARPT_MANGLE_SDEV) { |
39 | if (ARPT_DEV_ADDR_LEN_MAX < hln || | 39 | if (ARPT_DEV_ADDR_LEN_MAX < hln || |
40 | (arpptr + hln > (**pskb).tail)) | 40 | (arpptr + hln > skb_tail_pointer(*pskb))) |
41 | return NF_DROP; | 41 | return NF_DROP; |
42 | memcpy(arpptr, mangle->src_devaddr, hln); | 42 | memcpy(arpptr, mangle->src_devaddr, hln); |
43 | } | 43 | } |
44 | arpptr += hln; | 44 | arpptr += hln; |
45 | if (mangle->flags & ARPT_MANGLE_SIP) { | 45 | if (mangle->flags & ARPT_MANGLE_SIP) { |
46 | if (ARPT_MANGLE_ADDR_LEN_MAX < pln || | 46 | if (ARPT_MANGLE_ADDR_LEN_MAX < pln || |
47 | (arpptr + pln > (**pskb).tail)) | 47 | (arpptr + pln > skb_tail_pointer(*pskb))) |
48 | return NF_DROP; | 48 | return NF_DROP; |
49 | memcpy(arpptr, &mangle->u_s.src_ip, pln); | 49 | memcpy(arpptr, &mangle->u_s.src_ip, pln); |
50 | } | 50 | } |
51 | arpptr += pln; | 51 | arpptr += pln; |
52 | if (mangle->flags & ARPT_MANGLE_TDEV) { | 52 | if (mangle->flags & ARPT_MANGLE_TDEV) { |
53 | if (ARPT_DEV_ADDR_LEN_MAX < hln || | 53 | if (ARPT_DEV_ADDR_LEN_MAX < hln || |
54 | (arpptr + hln > (**pskb).tail)) | 54 | (arpptr + hln > skb_tail_pointer(*pskb))) |
55 | return NF_DROP; | 55 | return NF_DROP; |
56 | memcpy(arpptr, mangle->tgt_devaddr, hln); | 56 | memcpy(arpptr, mangle->tgt_devaddr, hln); |
57 | } | 57 | } |
58 | arpptr += hln; | 58 | arpptr += hln; |
59 | if (mangle->flags & ARPT_MANGLE_TIP) { | 59 | if (mangle->flags & ARPT_MANGLE_TIP) { |
60 | if (ARPT_MANGLE_ADDR_LEN_MAX < pln || | 60 | if (ARPT_MANGLE_ADDR_LEN_MAX < pln || |
61 | (arpptr + pln > (**pskb).tail)) | 61 | (arpptr + pln > skb_tail_pointer(*pskb))) |
62 | return NF_DROP; | 62 | return NF_DROP; |
63 | memcpy(arpptr, &mangle->u_t.tgt_ip, pln); | 63 | memcpy(arpptr, &mangle->u_t.tgt_ip, pln); |
64 | } | 64 | } |
diff --git a/net/ipv4/netfilter/ip_queue.c b/net/ipv4/netfilter/ip_queue.c index 5842f1aa973..15e0d200223 100644 --- a/net/ipv4/netfilter/ip_queue.c +++ b/net/ipv4/netfilter/ip_queue.c | |||
@@ -191,7 +191,7 @@ ipq_flush(int verdict) | |||
191 | static struct sk_buff * | 191 | static struct sk_buff * |
192 | ipq_build_packet_message(struct ipq_queue_entry *entry, int *errp) | 192 | ipq_build_packet_message(struct ipq_queue_entry *entry, int *errp) |
193 | { | 193 | { |
194 | unsigned char *old_tail; | 194 | sk_buff_data_t old_tail; |
195 | size_t size = 0; | 195 | size_t size = 0; |
196 | size_t data_len = 0; | 196 | size_t data_len = 0; |
197 | struct sk_buff *skb; | 197 | struct sk_buff *skb; |
@@ -235,7 +235,7 @@ ipq_build_packet_message(struct ipq_queue_entry *entry, int *errp) | |||
235 | if (!skb) | 235 | if (!skb) |
236 | goto nlmsg_failure; | 236 | goto nlmsg_failure; |
237 | 237 | ||
238 | old_tail= skb->tail; | 238 | old_tail = skb->tail; |
239 | nlh = NLMSG_PUT(skb, 0, 0, IPQM_PACKET, size - sizeof(*nlh)); | 239 | nlh = NLMSG_PUT(skb, 0, 0, IPQM_PACKET, size - sizeof(*nlh)); |
240 | pmsg = NLMSG_DATA(nlh); | 240 | pmsg = NLMSG_DATA(nlh); |
241 | memset(pmsg, 0, sizeof(*pmsg)); | 241 | memset(pmsg, 0, sizeof(*pmsg)); |
diff --git a/net/ipv4/netfilter/nf_nat_helper.c b/net/ipv4/netfilter/nf_nat_helper.c index c2c92ff1278..8a40fbe842b 100644 --- a/net/ipv4/netfilter/nf_nat_helper.c +++ b/net/ipv4/netfilter/nf_nat_helper.c | |||
@@ -92,7 +92,8 @@ static void mangle_contents(struct sk_buff *skb, | |||
92 | /* move post-replacement */ | 92 | /* move post-replacement */ |
93 | memmove(data + match_offset + rep_len, | 93 | memmove(data + match_offset + rep_len, |
94 | data + match_offset + match_len, | 94 | data + match_offset + match_len, |
95 | skb->tail - (data + match_offset + match_len)); | 95 | skb->tail - (skb->network_header + dataoff + |
96 | match_offset + match_len)); | ||
96 | 97 | ||
97 | /* insert data from buffer */ | 98 | /* insert data from buffer */ |
98 | memcpy(data + match_offset, rep_buffer, rep_len); | 99 | memcpy(data + match_offset, rep_buffer, rep_len); |