]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
xfrm: make state as DEAD before final put when migrate fails
authorSabrina Dubroca <sd@queasysnail.net>
Thu, 16 Oct 2025 10:39:14 +0000 (12:39 +0200)
committerSteffen Klassert <steffen.klassert@secunet.com>
Tue, 21 Oct 2025 08:42:43 +0000 (10:42 +0200)
xfrm_state_migrate/xfrm_state_clone_and_setup create a new state, and
call xfrm_state_put to destroy it in case of
failure. __xfrm_state_destroy expects the state to be in
XFRM_STATE_DEAD, but we currently don't do that.

Reported-by: syzbot+5cd6299ede4d4f70987b@syzkaller.appspotmail.com
Closes: https://syzkaller.appspot.com/bug?extid=5cd6299ede4d4f70987b
Fixes: 78347c8c6b2d ("xfrm: Fix xfrm_state_migrate leak")
Signed-off-by: Sabrina Dubroca <sd@queasysnail.net>
Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
net/xfrm/xfrm_state.c

index 721ef0f409b5137f463403045c13f4b2e0f1faba..1ab19ca007deacb0cce810aa554a16a5cf98a7c2 100644 (file)
@@ -2074,6 +2074,7 @@ static struct xfrm_state *xfrm_state_clone_and_setup(struct xfrm_state *orig,
        return x;
 
  error:
+       x->km.state = XFRM_STATE_DEAD;
        xfrm_state_put(x);
 out:
        return NULL;
@@ -2163,6 +2164,7 @@ struct xfrm_state *xfrm_state_migrate(struct xfrm_state *x,
 
        return xc;
 error:
+       xc->km.state = XFRM_STATE_DEAD;
        xfrm_state_put(xc);
        return NULL;
 }