lkml.org 
[lkml]   [2018]   [Oct]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.18 011/135] net/ipv6: Display all addresses in output of /proc/net/if_inet6
    Date
    4.18-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Jeff Barnhill <0xeffeff@gmail.com>

    [ Upstream commit 86f9bd1ff61c413a2a251fa736463295e4e24733 ]

    The backend handling for /proc/net/if_inet6 in addrconf.c doesn't properly
    handle starting/stopping the iteration. The problem is that at some point
    during the iteration, an overflow is detected and the process is
    subsequently stopped. The item being shown via seq_printf() when the
    overflow occurs is not actually shown, though. When start() is
    subsequently called to resume iterating, it returns the next item, and
    thus the item that was being processed when the overflow occurred never
    gets printed.

    Alter the meaning of the private data member "offset". Currently, when it
    is not 0 (which only happens at the very beginning), "offset" represents
    the next hlist item to be printed. After this change, "offset" always
    represents the current item.

    This is also consistent with the private data member "bucket", which
    represents the current bucket, and also the use of "pos" as defined in
    seq_file.txt:
    The pos passed to start() will always be either zero, or the most
    recent pos used in the previous session.

    Signed-off-by: Jeff Barnhill <0xeffeff@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    net/ipv6/addrconf.c | 4 +---
    1 file changed, 1 insertion(+), 3 deletions(-)

    --- a/net/ipv6/addrconf.c
    +++ b/net/ipv6/addrconf.c
    @@ -4203,7 +4203,6 @@ static struct inet6_ifaddr *if6_get_firs
    p++;
    continue;
    }
    - state->offset++;
    return ifa;
    }

    @@ -4227,13 +4226,12 @@ static struct inet6_ifaddr *if6_get_next
    return ifa;
    }

    + state->offset = 0;
    while (++state->bucket < IN6_ADDR_HSIZE) {
    - state->offset = 0;
    hlist_for_each_entry_rcu(ifa,
    &inet6_addr_lst[state->bucket], addr_lst) {
    if (!net_eq(dev_net(ifa->idev->dev), net))
    continue;
    - state->offset++;
    return ifa;
    }
    }

    \
     
     \ /
      Last update: 2018-10-16 19:47    [W:4.132 / U:0.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site