mirror of
https://github.com/torvalds/linux.git
synced 2026-06-07 22:14:04 +02:00
xfrm: clone XFRMA_SEC_CTX in xfrm_do_migrate
[ Upstream commit7aa05d3047] XFRMA_SEC_CTX was not cloned from the old to the new. Migrate this attribute during XFRMA_MSG_MIGRATE v1->v2: - return -ENOMEM on error v2->v3: - fix return type to int Fixes:80c9abaabf("[XFRM]: Extension for dynamic update of endpoint address(es)") Signed-off-by: Antony Antony <antony.antony@secunet.com> Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
fb48241729
commit
e4e0a05e10
|
|
@ -1341,6 +1341,30 @@ int xfrm_state_add(struct xfrm_state *x)
|
|||
EXPORT_SYMBOL(xfrm_state_add);
|
||||
|
||||
#ifdef CONFIG_XFRM_MIGRATE
|
||||
static inline int clone_security(struct xfrm_state *x, struct xfrm_sec_ctx *security)
|
||||
{
|
||||
struct xfrm_user_sec_ctx *uctx;
|
||||
int size = sizeof(*uctx) + security->ctx_len;
|
||||
int err;
|
||||
|
||||
uctx = kmalloc(size, GFP_KERNEL);
|
||||
if (!uctx)
|
||||
return -ENOMEM;
|
||||
|
||||
uctx->exttype = XFRMA_SEC_CTX;
|
||||
uctx->len = size;
|
||||
uctx->ctx_doi = security->ctx_doi;
|
||||
uctx->ctx_alg = security->ctx_alg;
|
||||
uctx->ctx_len = security->ctx_len;
|
||||
memcpy(uctx + 1, security->ctx_str, security->ctx_len);
|
||||
err = security_xfrm_state_alloc(x, uctx);
|
||||
kfree(uctx);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct xfrm_state *xfrm_state_clone(struct xfrm_state *orig,
|
||||
struct xfrm_encap_tmpl *encap)
|
||||
{
|
||||
|
|
@ -1397,6 +1421,10 @@ static struct xfrm_state *xfrm_state_clone(struct xfrm_state *orig,
|
|||
goto error;
|
||||
}
|
||||
|
||||
if (orig->security)
|
||||
if (clone_security(x, orig->security))
|
||||
goto error;
|
||||
|
||||
if (orig->coaddr) {
|
||||
x->coaddr = kmemdup(orig->coaddr, sizeof(*x->coaddr),
|
||||
GFP_KERNEL);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user