diff options
-rw-r--r-- | net/ipv6/ah6.c | 45 | ||||
-rw-r--r-- | net/ipv6/exthdrs.c | 1 | ||||
-rw-r--r-- | net/ipv6/mip6.c | 6 |
3 files changed, 10 insertions, 42 deletions
diff --git a/net/ipv6/ah6.c b/net/ipv6/ah6.c index 0f2b4e330aa9..b0d83e8e4252 100644 --- a/net/ipv6/ah6.c +++ b/net/ipv6/ah6.c | |||
@@ -128,9 +128,7 @@ static void ipv6_rearrange_destopt(struct ipv6hdr *iph, struct ipv6_opt_hdr *des | |||
128 | off += optlen; | 128 | off += optlen; |
129 | len -= optlen; | 129 | len -= optlen; |
130 | } | 130 | } |
131 | if (len == 0) | 131 | /* Note: ok if len == 0 */ |
132 | return; | ||
133 | |||
134 | bad: | 132 | bad: |
135 | return; | 133 | return; |
136 | } | 134 | } |
@@ -175,11 +173,7 @@ static void ipv6_rearrange_rthdr(struct ipv6hdr *iph, struct ipv6_rt_hdr *rthdr) | |||
175 | ipv6_addr_copy(&iph->daddr, &final_addr); | 173 | ipv6_addr_copy(&iph->daddr, &final_addr); |
176 | } | 174 | } |
177 | 175 | ||
178 | #ifdef CONFIG_IPV6_MIP6 | ||
179 | static int ipv6_clear_mutable_options(struct ipv6hdr *iph, int len, int dir) | 176 | static int ipv6_clear_mutable_options(struct ipv6hdr *iph, int len, int dir) |
180 | #else | ||
181 | static int ipv6_clear_mutable_options(struct ipv6hdr *iph, int len) | ||
182 | #endif | ||
183 | { | 177 | { |
184 | union { | 178 | union { |
185 | struct ipv6hdr *iph; | 179 | struct ipv6hdr *iph; |
@@ -194,30 +188,12 @@ static int ipv6_clear_mutable_options(struct ipv6hdr *iph, int len) | |||
194 | 188 | ||
195 | while (exthdr.raw < end) { | 189 | while (exthdr.raw < end) { |
196 | switch (nexthdr) { | 190 | switch (nexthdr) { |
197 | #ifdef CONFIG_IPV6_MIP6 | ||
198 | case NEXTHDR_HOP: | ||
199 | if (!zero_out_mutable_opts(exthdr.opth)) { | ||
200 | LIMIT_NETDEBUG( | ||
201 | KERN_WARNING "overrun %sopts\n", | ||
202 | nexthdr == NEXTHDR_HOP ? | ||
203 | "hop" : "dest"); | ||
204 | return -EINVAL; | ||
205 | } | ||
206 | break; | ||
207 | case NEXTHDR_DEST: | 191 | case NEXTHDR_DEST: |
192 | #ifdef CONFIG_IPV6_MIP6 | ||
208 | if (dir == XFRM_POLICY_OUT) | 193 | if (dir == XFRM_POLICY_OUT) |
209 | ipv6_rearrange_destopt(iph, exthdr.opth); | 194 | ipv6_rearrange_destopt(iph, exthdr.opth); |
210 | if (!zero_out_mutable_opts(exthdr.opth)) { | 195 | #endif |
211 | LIMIT_NETDEBUG( | ||
212 | KERN_WARNING "overrun %sopts\n", | ||
213 | nexthdr == NEXTHDR_HOP ? | ||
214 | "hop" : "dest"); | ||
215 | return -EINVAL; | ||
216 | } | ||
217 | break; | ||
218 | #else | ||
219 | case NEXTHDR_HOP: | 196 | case NEXTHDR_HOP: |
220 | case NEXTHDR_DEST: | ||
221 | if (!zero_out_mutable_opts(exthdr.opth)) { | 197 | if (!zero_out_mutable_opts(exthdr.opth)) { |
222 | LIMIT_NETDEBUG( | 198 | LIMIT_NETDEBUG( |
223 | KERN_WARNING "overrun %sopts\n", | 199 | KERN_WARNING "overrun %sopts\n", |
@@ -226,7 +202,6 @@ static int ipv6_clear_mutable_options(struct ipv6hdr *iph, int len) | |||
226 | return -EINVAL; | 202 | return -EINVAL; |
227 | } | 203 | } |
228 | break; | 204 | break; |
229 | #endif | ||
230 | 205 | ||
231 | case NEXTHDR_ROUTING: | 206 | case NEXTHDR_ROUTING: |
232 | ipv6_rearrange_rthdr(iph, exthdr.rth); | 207 | ipv6_rearrange_rthdr(iph, exthdr.rth); |
@@ -282,16 +257,13 @@ static int ah6_output(struct xfrm_state *x, struct sk_buff *skb) | |||
282 | } | 257 | } |
283 | #ifdef CONFIG_IPV6_MIP6 | 258 | #ifdef CONFIG_IPV6_MIP6 |
284 | memcpy(tmp_ext, &top_iph->saddr, extlen); | 259 | memcpy(tmp_ext, &top_iph->saddr, extlen); |
285 | err = ipv6_clear_mutable_options(top_iph, | ||
286 | extlen - sizeof(*tmp_ext) + | ||
287 | sizeof(*top_iph), | ||
288 | XFRM_POLICY_OUT); | ||
289 | #else | 260 | #else |
290 | memcpy(tmp_ext, &top_iph->daddr, extlen); | 261 | memcpy(tmp_ext, &top_iph->daddr, extlen); |
262 | #endif | ||
291 | err = ipv6_clear_mutable_options(top_iph, | 263 | err = ipv6_clear_mutable_options(top_iph, |
292 | extlen - sizeof(*tmp_ext) + | 264 | extlen - sizeof(*tmp_ext) + |
293 | sizeof(*top_iph)); | 265 | sizeof(*top_iph), |
294 | #endif | 266 | XFRM_POLICY_OUT); |
295 | if (err) | 267 | if (err) |
296 | goto error_free_iph; | 268 | goto error_free_iph; |
297 | } | 269 | } |
@@ -386,13 +358,8 @@ static int ah6_input(struct xfrm_state *x, struct sk_buff *skb) | |||
386 | if (!tmp_hdr) | 358 | if (!tmp_hdr) |
387 | goto out; | 359 | goto out; |
388 | memcpy(tmp_hdr, skb->nh.raw, hdr_len); | 360 | memcpy(tmp_hdr, skb->nh.raw, hdr_len); |
389 | #ifdef CONFIG_IPV6_MIP6 | ||
390 | if (ipv6_clear_mutable_options(skb->nh.ipv6h, hdr_len, XFRM_POLICY_IN)) | 361 | if (ipv6_clear_mutable_options(skb->nh.ipv6h, hdr_len, XFRM_POLICY_IN)) |
391 | goto free_out; | 362 | goto free_out; |
392 | #else | ||
393 | if (ipv6_clear_mutable_options(skb->nh.ipv6h, hdr_len)) | ||
394 | goto free_out; | ||
395 | #endif | ||
396 | skb->nh.ipv6h->priority = 0; | 363 | skb->nh.ipv6h->priority = 0; |
397 | skb->nh.ipv6h->flow_lbl[0] = 0; | 364 | skb->nh.ipv6h->flow_lbl[0] = 0; |
398 | skb->nh.ipv6h->flow_lbl[1] = 0; | 365 | skb->nh.ipv6h->flow_lbl[1] = 0; |
diff --git a/net/ipv6/exthdrs.c b/net/ipv6/exthdrs.c index 6a6466bb5f26..084f78c3479b 100644 --- a/net/ipv6/exthdrs.c +++ b/net/ipv6/exthdrs.c | |||
@@ -87,7 +87,6 @@ int ipv6_find_tlv(struct sk_buff *skb, int offset, int type) | |||
87 | len -= optlen; | 87 | len -= optlen; |
88 | } | 88 | } |
89 | /* not_found */ | 89 | /* not_found */ |
90 | return -1; | ||
91 | bad: | 90 | bad: |
92 | return -1; | 91 | return -1; |
93 | } | 92 | } |
diff --git a/net/ipv6/mip6.c b/net/ipv6/mip6.c index 70854035c131..99d116caecda 100644 --- a/net/ipv6/mip6.c +++ b/net/ipv6/mip6.c | |||
@@ -121,7 +121,8 @@ int mip6_mh_filter(struct sock *sk, struct sk_buff *skb) | |||
121 | &skb->nh.ipv6h->daddr, | 121 | &skb->nh.ipv6h->daddr, |
122 | mhlen, IPPROTO_MH, | 122 | mhlen, IPPROTO_MH, |
123 | skb_checksum(skb, 0, mhlen, 0))) { | 123 | skb_checksum(skb, 0, mhlen, 0))) { |
124 | LIMIT_NETDEBUG(KERN_DEBUG "mip6: MH checksum failed [%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x > %04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x]\n", | 124 | LIMIT_NETDEBUG(KERN_DEBUG "mip6: MH checksum failed " |
125 | "[" NIP6_FMT " > " NIP6_FMT "]\n", | ||
125 | NIP6(skb->nh.ipv6h->saddr), | 126 | NIP6(skb->nh.ipv6h->saddr), |
126 | NIP6(skb->nh.ipv6h->daddr)); | 127 | NIP6(skb->nh.ipv6h->daddr)); |
127 | return -1; | 128 | return -1; |
@@ -234,7 +235,8 @@ static int mip6_destopt_reject(struct xfrm_state *x, struct sk_buff *skb, struct | |||
234 | struct timeval stamp; | 235 | struct timeval stamp; |
235 | int err = 0; | 236 | int err = 0; |
236 | 237 | ||
237 | if (unlikely(fl->proto == IPPROTO_MH && fl->fl_mh_type <= IP6_MH_TYPE_MAX)) | 238 | if (unlikely(fl->proto == IPPROTO_MH && |
239 | fl->fl_mh_type <= IP6_MH_TYPE_MAX)) | ||
238 | goto out; | 240 | goto out; |
239 | 241 | ||
240 | if (likely(opt->dsthao)) { | 242 | if (likely(opt->dsthao)) { |