Patch "xfrm: Fix xfrm migrate issues when address family changes" has been added to the 5.4-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    xfrm: Fix xfrm migrate issues when address family changes

to the 5.4-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     xfrm-fix-xfrm-migrate-issues-when-address-family-cha.patch
and it can be found in the queue-5.4 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit db663c2f9d749c6c05a02168cd6fd67cfe587e39
Author: Yan Yan <evitayan@xxxxxxxxxx>
Date:   Tue Jan 18 16:00:14 2022 -0800

    xfrm: Fix xfrm migrate issues when address family changes
    
    [ Upstream commit e03c3bba351f99ad932e8f06baa9da1afc418e02 ]
    
    xfrm_migrate cannot handle address family change of an xfrm_state.
    The symptons are the xfrm_state will be migrated to a wrong address,
    and sending as well as receiving packets wil be broken.
    
    This commit fixes it by breaking the original xfrm_state_clone
    method into two steps so as to update the props.family before
    running xfrm_init_state. As the result, xfrm_state's inner mode,
    outer mode, type and IP header length in xfrm_state_migrate can
    be updated with the new address family.
    
    Tested with additions to Android's kernel unit test suite:
    https://android-review.googlesource.com/c/kernel/tests/+/1885354
    
    Signed-off-by: Yan Yan <evitayan@xxxxxxxxxx>
    Signed-off-by: Steffen Klassert <steffen.klassert@xxxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c
index 83ee3d337a60..268bba29bb60 100644
--- a/net/xfrm/xfrm_state.c
+++ b/net/xfrm/xfrm_state.c
@@ -1539,9 +1539,6 @@ static struct xfrm_state *xfrm_state_clone(struct xfrm_state *orig,
 	memcpy(&x->mark, &orig->mark, sizeof(x->mark));
 	memcpy(&x->props.smark, &orig->props.smark, sizeof(x->props.smark));
 
-	if (xfrm_init_state(x) < 0)
-		goto error;
-
 	x->props.flags = orig->props.flags;
 	x->props.extra_flags = orig->props.extra_flags;
 
@@ -1625,6 +1622,11 @@ struct xfrm_state *xfrm_state_migrate(struct xfrm_state *x,
 	if (!xc)
 		return NULL;
 
+	xc->props.family = m->new_family;
+
+	if (xfrm_init_state(xc) < 0)
+		goto error;
+
 	memcpy(&xc->id.daddr, &m->new_daddr, sizeof(xc->id.daddr));
 	memcpy(&xc->props.saddr, &m->new_saddr, sizeof(xc->props.saddr));
 



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux