ipv6_route_seq_next should increase position index
[ Upstream commit 4fc427e051
]
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>
5.4-rM2-2.2.x-imx-squashed
parent
046e79cca2
commit
c89925822f
|
@ -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 net *net = seq_file_net(seq);
|
||||||
struct ipv6_route_iter *iter = seq->private;
|
struct ipv6_route_iter *iter = seq->private;
|
||||||
|
|
||||||
|
++(*pos);
|
||||||
if (!v)
|
if (!v)
|
||||||
goto iter_table;
|
goto iter_table;
|
||||||
|
|
||||||
n = rcu_dereference_bh(((struct fib6_info *)v)->fib6_next);
|
n = rcu_dereference_bh(((struct fib6_info *)v)->fib6_next);
|
||||||
if (n) {
|
if (n)
|
||||||
++*pos;
|
|
||||||
return n;
|
return n;
|
||||||
}
|
|
||||||
|
|
||||||
iter_table:
|
iter_table:
|
||||||
ipv6_route_check_sernum(iter);
|
ipv6_route_check_sernum(iter);
|
||||||
|
@ -2494,8 +2493,6 @@ iter_table:
|
||||||
r = fib6_walk_continue(&iter->w);
|
r = fib6_walk_continue(&iter->w);
|
||||||
spin_unlock_bh(&iter->tbl->tb6_lock);
|
spin_unlock_bh(&iter->tbl->tb6_lock);
|
||||||
if (r > 0) {
|
if (r > 0) {
|
||||||
if (v)
|
|
||||||
++*pos;
|
|
||||||
return iter->w.leaf;
|
return iter->w.leaf;
|
||||||
} else if (r < 0) {
|
} else if (r < 0) {
|
||||||
fib6_walker_unlink(net, &iter->w);
|
fib6_walker_unlink(net, &iter->w);
|
||||||
|
|
Loading…
Reference in New Issue