xfrm: Fix error reporting in xfrm_state_construct.
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>
This commit is contained in:
parent
eebd49a4ff
commit
6fd06963fa
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue