]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
xfrm: xfrm_alloc_spi shouldn't use 0 as SPI
authorSabrina Dubroca <sd@queasysnail.net>
Fri, 29 Aug 2025 08:54:15 +0000 (10:54 +0200)
committerSteffen Klassert <steffen.klassert@secunet.com>
Mon, 1 Sep 2025 06:56:00 +0000 (08:56 +0200)
x->id.spi == 0 means "no SPI assigned", but since commit
94f39804d891 ("xfrm: Duplicate SPI Handling"), we now create states
and add them to the byspi list with this value.

__xfrm_state_delete doesn't remove those states from the byspi list,
since they shouldn't be there, and this shows up as a UAF the next
time we go through the byspi list.

Reported-by: syzbot+a25ee9d20d31e483ba7b@syzkaller.appspotmail.com
Closes: https://syzkaller.appspot.com/bug?extid=a25ee9d20d31e483ba7b
Fixes: 94f39804d891 ("xfrm: Duplicate SPI Handling")
Signed-off-by: Sabrina Dubroca <sd@queasysnail.net>
Reviewed-by: Simon Horman <horms@kernel.org>
Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
net/xfrm/xfrm_state.c

index 78fcbb89cf3256cbbe56bc40d4d2cabecb09bf28..d213ca3653a8f20c9c5295f7c0c1e6b1f406dbe0 100644 (file)
@@ -2583,6 +2583,8 @@ int xfrm_alloc_spi(struct xfrm_state *x, u32 low, u32 high,
 
        for (h = 0; h < range; h++) {
                u32 spi = (low == high) ? low : get_random_u32_inclusive(low, high);
+               if (spi == 0)
+                       goto next;
                newspi = htonl(spi);
 
                spin_lock_bh(&net->xfrm.xfrm_state_lock);
@@ -2598,6 +2600,7 @@ int xfrm_alloc_spi(struct xfrm_state *x, u32 low, u32 high,
                xfrm_state_put(x0);
                spin_unlock_bh(&net->xfrm.xfrm_state_lock);
 
+next:
                if (signal_pending(current)) {
                        err = -ERESTARTSYS;
                        goto unlock;