lkml.org 
[lkml]   [2022]   [Jan]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.16 0302/1039] xfrm: state and policy should fail if XFRMA_IF_ID 0
    Date
    From: Antony Antony <antony.antony@secunet.com>

    [ Upstream commit 68ac0f3810e76a853b5f7b90601a05c3048b8b54 ]

    xfrm ineterface does not allow xfrm if_id = 0
    fail to create or update xfrm state and policy.

    With this commit:
    ip xfrm policy add src 192.0.2.1 dst 192.0.2.2 dir out if_id 0
    RTNETLINK answers: Invalid argument

    ip xfrm state add src 192.0.2.1 dst 192.0.2.2 proto esp spi 1 \
    reqid 1 mode tunnel aead 'rfc4106(gcm(aes))' \
    0x1111111111111111111111111111111111111111 96 if_id 0
    RTNETLINK answers: Invalid argument

    v1->v2 change:
    - add Fixes: tag

    Fixes: 9f8550e4bd9d ("xfrm: fix disable_xfrm sysctl when used on xfrm interfaces")
    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>
    ---
    net/xfrm/xfrm_user.c | 21 ++++++++++++++++++---
    1 file changed, 18 insertions(+), 3 deletions(-)

    diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c
    index 0a2d2bae28316..b571892fe10f5 100644
    --- a/net/xfrm/xfrm_user.c
    +++ b/net/xfrm/xfrm_user.c
    @@ -621,8 +621,13 @@ static struct xfrm_state *xfrm_state_construct(struct net *net,

    xfrm_smark_init(attrs, &x->props.smark);

    - if (attrs[XFRMA_IF_ID])
    + if (attrs[XFRMA_IF_ID]) {
    x->if_id = nla_get_u32(attrs[XFRMA_IF_ID]);
    + if (!x->if_id) {
    + err = -EINVAL;
    + goto error;
    + }
    + }

    err = __xfrm_init_state(x, false, attrs[XFRMA_OFFLOAD_DEV]);
    if (err)
    @@ -1413,8 +1418,13 @@ static int xfrm_alloc_userspi(struct sk_buff *skb, struct nlmsghdr *nlh,

    mark = xfrm_mark_get(attrs, &m);

    - if (attrs[XFRMA_IF_ID])
    + if (attrs[XFRMA_IF_ID]) {
    if_id = nla_get_u32(attrs[XFRMA_IF_ID]);
    + if (!if_id) {
    + err = -EINVAL;
    + goto out_noput;
    + }
    + }

    if (p->info.seq) {
    x = xfrm_find_acq_byseq(net, mark, p->info.seq);
    @@ -1727,8 +1737,13 @@ static struct xfrm_policy *xfrm_policy_construct(struct net *net, struct xfrm_us

    xfrm_mark_get(attrs, &xp->mark);

    - if (attrs[XFRMA_IF_ID])
    + if (attrs[XFRMA_IF_ID]) {
    xp->if_id = nla_get_u32(attrs[XFRMA_IF_ID]);
    + if (!xp->if_id) {
    + err = -EINVAL;
    + goto error;
    + }
    + }

    return xp;
    error:
    --
    2.34.1


    \
     
     \ /
      Last update: 2022-01-24 23:09    [W:3.080 / U:0.976 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site