xfrm: Fix error reporting in xfrm_state_construct.
authorSteffen Klassert <steffen.klassert@secunet.com>
Mon, 7 Jun 2021 13:21:49 +0000 (15:21 +0200)
committerSteffen Klassert <steffen.klassert@secunet.com>
Mon, 14 Jun 2021 09:58:43 +0000 (11:58 +0200)
When memory allocation for XFRMA_ENCAP or XFRMA_COADDR fails,
the error will not be reported because the -ENOMEM assignment
to the err variable is overwritten before. Fix this by moving
these two in front of the function so that memory allocation
failures will be reported.

Reported-by: Tobias Brunner <tobias@strongswan.org>
Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
net/xfrm/xfrm_user.c

index 5a0ef43..817e714 100644 (file)
@@ -580,6 +580,20 @@ static struct xfrm_state *xfrm_state_construct(struct net *net,
 
        copy_from_user_state(x, p);
 
+       if (attrs[XFRMA_ENCAP]) {
+               x->encap = kmemdup(nla_data(attrs[XFRMA_ENCAP]),
+                                  sizeof(*x->encap), GFP_KERNEL);
+               if (x->encap == NULL)
+                       goto error;
+       }
+
+       if (attrs[XFRMA_COADDR]) {
+               x->coaddr = kmemdup(nla_data(attrs[XFRMA_COADDR]),
+                                   sizeof(*x->coaddr), GFP_KERNEL);
+               if (x->coaddr == NULL)
+                       goto error;
+       }
+
        if (attrs[XFRMA_SA_EXTRA_FLAGS])
                x->props.extra_flags = nla_get_u32(attrs[XFRMA_SA_EXTRA_FLAGS]);
 
@@ -600,23 +614,9 @@ static struct xfrm_state *xfrm_state_construct(struct net *net,
                                   attrs[XFRMA_ALG_COMP])))
                goto error;
 
-       if (attrs[XFRMA_ENCAP]) {
-               x->encap = kmemdup(nla_data(attrs[XFRMA_ENCAP]),
-                                  sizeof(*x->encap), GFP_KERNEL);
-               if (x->encap == NULL)
-                       goto error;
-       }
-
        if (attrs[XFRMA_TFCPAD])
                x->tfcpad = nla_get_u32(attrs[XFRMA_TFCPAD]);
 
-       if (attrs[XFRMA_COADDR]) {
-               x->coaddr = kmemdup(nla_data(attrs[XFRMA_COADDR]),
-                                   sizeof(*x->coaddr), GFP_KERNEL);
-               if (x->coaddr == NULL)
-                       goto error;
-       }
-
        xfrm_mark_get(attrs, &x->mark);
 
        xfrm_smark_init(attrs, &x->props.smark);