On 10/31/18 12:42 AM, Alexey Kodanev wrote: > cb->args[2] can store the pointer to the struct fib6_walker, > allocated in inet6_dump_fib(). On the next loop iteration in > rtnl_dump_all(), 'memset(&cb, 0, sizeof(cb->args))' can reset > that pointer, leaking the memory [1]. > > Fix it by calling cb->done, if it is set, before filling 'cb->args' > with zeros. > > Looks like the recent changes in rtnl_dump_all() contributed to > the appearance of this kmemleak [1], commit c63586dc9b3e ("net: > rtnl_dump_all needs to propagate error from dumpit function") > breaks the loop only on an error now. > ...
It is more efficient to keep going. I think the simplest fix for 4.20 is to break the loop if ret is non-0 - restore the previous behavior. For net-next I think the done callback is not needed for ipv6; I think there is a simpler way to do it.