xfrm: Fix error reporting in xfrm_state_construct.
[ Upstream commit 6fd06963fa ]
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:
committed by
Greg Kroah-Hartman
parent
a5f8862967
commit
57f7ed25bd
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user