diff options
Diffstat (limited to 'net/ipv6')
-rw-r--r-- | net/ipv6/xfrm6_policy.c | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/net/ipv6/xfrm6_policy.c b/net/ipv6/xfrm6_policy.c index 89432279d3a0..77dc3651437e 100644 --- a/net/ipv6/xfrm6_policy.c +++ b/net/ipv6/xfrm6_policy.c | |||
@@ -123,7 +123,7 @@ __xfrm6_bundle_create(struct xfrm_policy *policy, struct xfrm_state **xfrm, int | |||
123 | } | 123 | } |
124 | }; | 124 | }; |
125 | int i; | 125 | int i; |
126 | int err = 0; | 126 | int err; |
127 | int header_len = 0; | 127 | int header_len = 0; |
128 | int trailer_len = 0; | 128 | int trailer_len = 0; |
129 | 129 | ||
@@ -201,13 +201,20 @@ __xfrm6_bundle_create(struct xfrm_policy *policy, struct xfrm_state **xfrm, int | |||
201 | 201 | ||
202 | dst_prev = *dst_p; | 202 | dst_prev = *dst_p; |
203 | i = 0; | 203 | i = 0; |
204 | err = -ENODEV; | ||
204 | for (; dst_prev != &rt->u.dst; dst_prev = dst_prev->child) { | 205 | for (; dst_prev != &rt->u.dst; dst_prev = dst_prev->child) { |
205 | struct xfrm_dst *x = (struct xfrm_dst*)dst_prev; | 206 | struct xfrm_dst *x = (struct xfrm_dst*)dst_prev; |
206 | 207 | ||
207 | dst_prev->xfrm = xfrm[i++]; | 208 | dst_prev->xfrm = xfrm[i++]; |
208 | dst_prev->dev = rt->u.dst.dev; | 209 | dst_prev->dev = rt->u.dst.dev; |
209 | if (rt->u.dst.dev) | 210 | if (!rt->u.dst.dev) |
210 | dev_hold(rt->u.dst.dev); | 211 | goto error; |
212 | dev_hold(rt->u.dst.dev); | ||
213 | |||
214 | x->u.rt6.rt6i_idev = in6_dev_get(rt->u.dst.dev); | ||
215 | if (!x->u.rt6.rt6i_idev) | ||
216 | goto error; | ||
217 | |||
211 | dst_prev->obsolete = -1; | 218 | dst_prev->obsolete = -1; |
212 | dst_prev->flags |= DST_HOST; | 219 | dst_prev->flags |= DST_HOST; |
213 | dst_prev->lastuse = jiffies; | 220 | dst_prev->lastuse = jiffies; |
@@ -226,8 +233,6 @@ __xfrm6_bundle_create(struct xfrm_policy *policy, struct xfrm_state **xfrm, int | |||
226 | memcpy(&x->u.rt6.rt6i_gateway, &rt0->rt6i_gateway, sizeof(x->u.rt6.rt6i_gateway)); | 233 | memcpy(&x->u.rt6.rt6i_gateway, &rt0->rt6i_gateway, sizeof(x->u.rt6.rt6i_gateway)); |
227 | x->u.rt6.rt6i_dst = rt0->rt6i_dst; | 234 | x->u.rt6.rt6i_dst = rt0->rt6i_dst; |
228 | x->u.rt6.rt6i_src = rt0->rt6i_src; | 235 | x->u.rt6.rt6i_src = rt0->rt6i_src; |
229 | x->u.rt6.rt6i_idev = rt0->rt6i_idev; | ||
230 | in6_dev_hold(rt0->rt6i_idev); | ||
231 | header_len -= x->u.dst.xfrm->props.header_len; | 236 | header_len -= x->u.dst.xfrm->props.header_len; |
232 | trailer_len -= x->u.dst.xfrm->props.trailer_len; | 237 | trailer_len -= x->u.dst.xfrm->props.trailer_len; |
233 | } | 238 | } |