xfrm: Fix error reporting in xfrm_state_construct.
[ Upstream commit 6fd06963fa74197103cdbb4b494763127b3f2f34 ] 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> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
a6414f9351
commit
ecb8d2b65b
@ -566,6 +566,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]);
|
||||
|
||||
@ -586,23 +600,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);
|
||||
|
||||
err = __xfrm_init_state(x, false);
|
||||
|
Loading…
x
Reference in New Issue
Block a user