sk_clone_lock() needs to call get_net() and sock_inuse_inc() together, or
socket_seq_show() will underflow when __sk_free() from sk_free() from
sk_free_unlock_clone() is called.
Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
---
net/core/sock.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
From: Eric Dumazet <hidden> Date: 2021-11-14 20:02:00
On 11/13/21 10:02 PM, Tetsuo Handa wrote:
sk_clone_lock() needs to call get_net() and sock_inuse_inc() together, or
socket_seq_show() will underflow when __sk_free() from sk_free() from
sk_free_unlock_clone() is called.
IMO, a "sock_inuse_get() underflow" is a very different problem,
I suspect this should be fixed with the following patch.
@@ -3573,7 +3573,7 @@ int sock_inuse_get(struct net *net)for_each_possible_cpu(cpu)res+=*per_cpu_ptr(net->core.sock_inuse,cpu);-returnres;+returnmax(res,0);}EXPORT_SYMBOL_GPL(sock_inuse_get);
Bug added in commit 648845ab7e200993dccd3948c719c858368c91e7
Author: Tonghao Zhang [off-list ref]
Date: Thu Dec 14 05:51:58 2017 -0800
sock: Move the socket inuse to namespace.
sk_clone_lock() needs to call get_net() and sock_inuse_inc() together, or
s/sock_inuse_inc/sock_inuse_add/
quoted
socket_seq_show() will underflow when __sk_free() from sk_free() from
sk_free_unlock_clone() is called.
IMO, a "sock_inuse_get() underflow" is a very different problem,
Yes, a different problem. I found this problem while trying to examine
https://syzkaller.appspot.com/bug?extid=694120e1002c117747ed where
somebody might be failing to call get_net() or we might be failing to
make sure that all timers are synchronously stopped before put_net().
I suspect this should be fixed with the following patch.
My patch addresses a permanent underflow problem which remains as long as
that namespace exists. Your patch addresses a temporal underflow problem
which happens due to calculating the sum without locks. Therefore, we can
apply both patches if we want.
@@ -3573,7 +3573,7 @@ int sock_inuse_get(struct net *net)for_each_possible_cpu(cpu)res+=*per_cpu_ptr(net->core.sock_inuse,cpu);-returnres;+returnmax(res,0);}EXPORT_SYMBOL_GPL(sock_inuse_get);
Bug added in commit 648845ab7e200993dccd3948c719c858368c91e7
Author: Tonghao Zhang [off-list ref]
Date: Thu Dec 14 05:51:58 2017 -0800
sock: Move the socket inuse to namespace.
From: Eric Dumazet <hidden> Date: 2021-11-14 23:54:24
On 11/14/21 2:43 PM, Tetsuo Handa wrote:
On 2021/11/15 5:01, Eric Dumazet wrote:
quoted
On 11/13/21 10:02 PM, Tetsuo Handa wrote:
quoted
sk_clone_lock() needs to call get_net() and sock_inuse_inc() together, or
s/sock_inuse_inc/sock_inuse_add/
quoted
quoted
socket_seq_show() will underflow when __sk_free() from sk_free() from
sk_free_unlock_clone() is called.
IMO, a "sock_inuse_get() underflow" is a very different problem,
Yes, a different problem. I found this problem while trying to examine
https://syzkaller.appspot.com/bug?extid=694120e1002c117747ed where
somebody might be failing to call get_net() or we might be failing to
make sure that all timers are synchronously stopped before put_net().
quoted
I suspect this should be fixed with the following patch.
My patch addresses a permanent underflow problem which remains as long as
that namespace exists. Your patch addresses a temporal underflow problem
which happens due to calculating the sum without locks. Therefore, we can
apply both patches if we want.
I think your changelog is a bit confusing.
It would really help if you add the Fixes: tag, because if you do
1) It makes the patch much easier to understand, by reading again the the old patch.
2) We can tell if we can merge both fixes in the same submission (if they share the same bug origin)
Thanks !
Hello:
This patch was applied to netdev/net.git (master)
by David S. Miller [off-list ref]:
On Mon, 15 Nov 2021 19:16:56 +0900 you wrote:
sk_clone_lock() needs to call sock_inuse_add(1) before entering the
sk_free_unlock_clone() error path, for __sk_free() from sk_free() from
sk_free_unlock_clone() calls sock_inuse_add(-1).
Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
Fixes: 648845ab7e200993 ("sock: Move the socket inuse to namespace.")
[...]