]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
xfrm: fix a race in xfrm_state_lookup_byspi
authorLi RongQing <roy.qing.li@gmail.com>
Wed, 29 Apr 2015 00:42:44 +0000 (08:42 +0800)
committerLuis Henriques <luis.henriques@canonical.com>
Thu, 11 Jun 2015 10:25:00 +0000 (11:25 +0100)
commit bdddbf6996c0b9299efc97b8f66e06286f3aa8c9 upstream.

The returned xfrm_state should be hold before unlock xfrm_state_lock,
otherwise the returned xfrm_state maybe be released.

Fixes: c454997e6[{pktgen, xfrm} Introduce xfrm_state_lookup_byspi..]
Cc: Fan Du <fan.du@intel.com>
Signed-off-by: Li RongQing <roy.qing.li@gmail.com>
Acked-by: Fan Du <fan.du@intel.com>
Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
Signed-off-by: Luis Henriques <luis.henriques@canonical.com>
net/xfrm/xfrm_state.c

index 0ab54134bb40b84cf825df6035a9acf7cb3cf760..86f381b09d8dc22af54f4d937bcf9492f1964654 100644 (file)
@@ -934,8 +934,8 @@ struct xfrm_state *xfrm_state_lookup_byspi(struct net *net, __be32 spi,
                        x->id.spi != spi)
                        continue;
 
-               spin_unlock_bh(&net->xfrm.xfrm_state_lock);
                xfrm_state_hold(x);
+               spin_unlock_bh(&net->xfrm.xfrm_state_lock);
                return x;
        }
        spin_unlock_bh(&net->xfrm.xfrm_state_lock);