From af2227ebe9b75f82b65772b8488830a3fa2c2524 Mon Sep 17 00:00:00 2001 From: Masahide NAKAMURA Date: Thu, 20 Dec 2007 20:41:57 -0800 Subject: [PATCH] --- yaml --- r: 78591 b: refs/heads/master c: 9473e1f631de339c50bde1e3bd09e1045fe90fd5 h: refs/heads/master i: 78589: bcd55a42eb1dafe311e3784e8a7e90c85747ded1 78587: 2477568b38d682ae229b8fbfb40dd75569fee4e7 78583: 99f7f4ad5a5975ee08859d043ffc45f5fd63b214 78575: b3d4844ad56524917473671c141977cbf8723d07 78559: 98585fe948a8d7268a80ccf3ed7d62c46524b732 78527: 01a2c58648c3947b9973c8267e8a2106a3022d71 78463: 41cb137f1030ec0d67a3172fa3b24193ce1feacd 78335: f6319d295c1fdd660bf82bf3b5c48ff2145ac84d v: v3 --- [refs] | 2 +- trunk/net/ipv6/xfrm6_input.c | 54 +++++++++++++++++++----------------- 2 files changed, 30 insertions(+), 26 deletions(-) diff --git a/[refs] b/[refs] index 4a38b09ed8fa..aa0b0b992085 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: a1b051405bc16222d92c73b0c26d65b333a154ee +refs/heads/master: 9473e1f631de339c50bde1e3bd09e1045fe90fd5 diff --git a/trunk/net/ipv6/xfrm6_input.c b/trunk/net/ipv6/xfrm6_input.c index 74f3aacebb5e..f835ab458f5b 100644 --- a/trunk/net/ipv6/xfrm6_input.c +++ b/trunk/net/ipv6/xfrm6_input.c @@ -63,10 +63,26 @@ int xfrm6_input_addr(struct sk_buff *skb, xfrm_address_t *daddr, struct xfrm_state *x = NULL; int wildcard = 0; xfrm_address_t *xany; - struct xfrm_state *xfrm_vec_one = NULL; int nh = 0; int i = 0; + /* Allocate new secpath or COW existing one. */ + if (!skb->sp || atomic_read(&skb->sp->refcnt) != 1) { + struct sec_path *sp; + + sp = secpath_dup(skb->sp); + if (!sp) { + goto drop; + } + if (skb->sp) + secpath_put(skb->sp); + skb->sp = sp; + } + + if (1 + skb->sp->len == XFRM_MAX_DEPTH) { + goto drop; + } + xany = (xfrm_address_t *)&in6addr_any; for (i = 0; i < 3; i++) { @@ -119,47 +135,35 @@ int xfrm6_input_addr(struct sk_buff *skb, xfrm_address_t *daddr, continue; } + spin_unlock(&x->lock); + nh = x->type->input(x, skb); if (nh <= 0) { - spin_unlock(&x->lock); xfrm_state_put(x); x = NULL; continue; } - x->curlft.bytes += skb->len; - x->curlft.packets++; - - spin_unlock(&x->lock); - - xfrm_vec_one = x; + /* Found a state */ break; } - if (!xfrm_vec_one) + if (!x) { goto drop; - - /* Allocate new secpath or COW existing one. */ - if (!skb->sp || atomic_read(&skb->sp->refcnt) != 1) { - struct sec_path *sp; - sp = secpath_dup(skb->sp); - if (!sp) - goto drop; - if (skb->sp) - secpath_put(skb->sp); - skb->sp = sp; } - if (1 + skb->sp->len > XFRM_MAX_DEPTH) - goto drop; + skb->sp->xvec[skb->sp->len++] = x; + + spin_lock(&x->lock); - skb->sp->xvec[skb->sp->len] = xfrm_vec_one; - skb->sp->len ++; + x->curlft.bytes += skb->len; + x->curlft.packets++; + + spin_unlock(&x->lock); return 1; + drop: - if (xfrm_vec_one) - xfrm_state_put(xfrm_vec_one); return -1; }