]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - net/xfrm/xfrm_output.c
[IPV6]: Fix race in ipv6_flowlabel_opt() when inserting two labels
[linux-2.6-omap-h63xx.git] / net / xfrm / xfrm_output.c
index 8c852119d190b80a9b56a984ac99c8d3258d64e1..f4bfd6c4565119f9f3be6cb80547922b930b4f73 100644 (file)
@@ -63,11 +63,7 @@ int xfrm_output(struct sk_buff *skb)
                                xfrm_replay_notify(x, XFRM_REPLAY_UPDATE);
                }
 
-               err = x->mode->output(x, skb);
-               if (err)
-                       goto error;
-
-               err = x->type->output(x, skb);
+               err = x->outer_mode->output(x, skb);
                if (err)
                        goto error;
 
@@ -76,7 +72,9 @@ int xfrm_output(struct sk_buff *skb)
 
                spin_unlock_bh(&x->lock);
 
-               skb_reset_network_header(skb);
+               err = x->type->output(x, skb);
+               if (err)
+                       goto error_nolock;
 
                if (!(skb->dst = dst_pop(dst))) {
                        err = -EHOSTUNREACH;
@@ -84,7 +82,7 @@ int xfrm_output(struct sk_buff *skb)
                }
                dst = skb->dst;
                x = dst->xfrm;
-       } while (x && (x->props.mode != XFRM_MODE_TUNNEL));
+       } while (x && !(x->outer_mode->flags & XFRM_MODE_FLAG_TUNNEL));
 
        err = 0;