lkml.org 
[lkml]   [2020]   [Jun]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.14 001/190] ipv6: fix IPV6_ADDRFORM operation logic
    Date
    From: Hangbin Liu <liuhangbin@gmail.com>

    [ Upstream commit 79a1f0ccdbb4ad700590f61b00525b390cb53905 ]

    Socket option IPV6_ADDRFORM supports UDP/UDPLITE and TCP at present.
    Previously the checking logic looks like:
    if (sk->sk_protocol == IPPROTO_UDP || sk->sk_protocol == IPPROTO_UDPLITE)
    do_some_check;
    else if (sk->sk_protocol != IPPROTO_TCP)
    break;

    After commit b6f6118901d1 ("ipv6: restrict IPV6_ADDRFORM operation"), TCP
    was blocked as the logic changed to:
    if (sk->sk_protocol == IPPROTO_UDP || sk->sk_protocol == IPPROTO_UDPLITE)
    do_some_check;
    else if (sk->sk_protocol == IPPROTO_TCP)
    do_some_check;
    break;
    else
    break;

    Then after commit 82c9ae440857 ("ipv6: fix restrict IPV6_ADDRFORM operation")
    UDP/UDPLITE were blocked as the logic changed to:
    if (sk->sk_protocol == IPPROTO_UDP || sk->sk_protocol == IPPROTO_UDPLITE)
    do_some_check;
    if (sk->sk_protocol == IPPROTO_TCP)
    do_some_check;

    if (sk->sk_protocol != IPPROTO_TCP)
    break;

    Fix it by using Eric's code and simply remove the break in TCP check, which
    looks like:
    if (sk->sk_protocol == IPPROTO_UDP || sk->sk_protocol == IPPROTO_UDPLITE)
    do_some_check;
    else if (sk->sk_protocol == IPPROTO_TCP)
    do_some_check;
    else
    break;

    Fixes: 82c9ae440857 ("ipv6: fix restrict IPV6_ADDRFORM operation")
    Signed-off-by: Hangbin Liu <liuhangbin@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    net/ipv6/ipv6_sockglue.c | 13 +++++++------
    1 file changed, 7 insertions(+), 6 deletions(-)

    --- a/net/ipv6/ipv6_sockglue.c
    +++ b/net/ipv6/ipv6_sockglue.c
    @@ -185,14 +185,15 @@ static int do_ipv6_setsockopt(struct soc
    retv = -EBUSY;
    break;
    }
    - }
    - if (sk->sk_protocol == IPPROTO_TCP &&
    - sk->sk_prot != &tcpv6_prot) {
    - retv = -EBUSY;
    + } else if (sk->sk_protocol == IPPROTO_TCP) {
    + if (sk->sk_prot != &tcpv6_prot) {
    + retv = -EBUSY;
    + break;
    + }
    + } else {
    break;
    }
    - if (sk->sk_protocol != IPPROTO_TCP)
    - break;
    +
    if (sk->sk_state != TCP_ESTABLISHED) {
    retv = -ENOTCONN;
    break;

    \
     
     \ /
      Last update: 2020-06-19 18:41    [W:2.480 / U:0.312 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site