]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
ipv6_route_seq_next should increase position index
authorVasily Averin <vvs@virtuozzo.com>
Thu, 23 Jan 2020 07:12:06 +0000 (10:12 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 1 Oct 2020 11:17:25 +0000 (13:17 +0200)
[ Upstream commit 4fc427e0515811250647d44de38d87d7b0e0790f ]

if seq_file .next fuction does not change position index,
read after some lseek can generate unexpected output.

https://bugzilla.kernel.org/show_bug.cgi?id=206283
Signed-off-by: Vasily Averin <vvs@virtuozzo.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sasha Levin <sashal@kernel.org>
net/ipv6/ip6_fib.c

index 96d80e50bf35be15539d24dbf97d4a6781ebe773..9ca6c32065ec6802369fd50f7f449b40d20cefc6 100644 (file)
@@ -2479,14 +2479,13 @@ static void *ipv6_route_seq_next(struct seq_file *seq, void *v, loff_t *pos)
        struct net *net = seq_file_net(seq);
        struct ipv6_route_iter *iter = seq->private;
 
+       ++(*pos);
        if (!v)
                goto iter_table;
 
        n = rcu_dereference_bh(((struct fib6_info *)v)->fib6_next);
-       if (n) {
-               ++*pos;
+       if (n)
                return n;
-       }
 
 iter_table:
        ipv6_route_check_sernum(iter);
@@ -2494,8 +2493,6 @@ iter_table:
        r = fib6_walk_continue(&iter->w);
        spin_unlock_bh(&iter->tbl->tb6_lock);
        if (r > 0) {
-               if (v)
-                       ++*pos;
                return iter->w.leaf;
        } else if (r < 0) {
                fib6_walker_unlink(net, &iter->w);