net: Fix module refcount leak in kernel_accept()
Subsystems (4)
PATCH 1/1 net: Fix module refcount leak in kernel_accept()
The kernel_accept() does not hold the module refcount of newsock->ops->owner, so we need __module_get(newsock->ops->owner) code after call kernel_accept() by hand.
In sunrpc, the module refcount is missing to hold. So this cause kernel panic.
Used following script to reproduct:
while [ 1 ];
do
mount -t nfs4 192.168.0.19:/ /mnt
touch /mnt/file
umount /mnt
lsmod | grep ipv6
done
This patch fixed the problem by add __module_get(newsock->ops->owner) to kernel_accept(). So we do not need to used __module_get(newsock->ops->owner) in every place when used kernel_accept().
--- net/bluetooth/rfcomm/core.c | 2 -- net/socket.c | 1 + 2 files changed, 1 insertions(+), 2 deletions(-)
net/bluetooth/rfcomm/core.c +0 -2
@@ -1786,8 +1786,6 @@ static inline void rfcomm_accept_connection(struct rfcomm_session *s)if (err <0 )return ; -__module_get (nsock->ops->owner); -/* Set our callbacks */ nsock->sk->sk_data_ready = rfcomm_l2data_ready; nsock->sk->sk_state_change = rfcomm_l2state_change;
net/socket.c +1 -0
@@ -2307,6 +2307,7 @@ int kernel_accept(struct socket *sock, struct socket **newsock, int flags) } (*newsock)->ops = sock->ops; +__module_get ((*newsock)->ops->owner); done:return err;
Signature · 1 line
1.5.3.8
David Miller
maintainerFrom: Wei Yongjun <[email protected]>
Date: Thu, 18 Dec 2008 18:20:46 +0800
Quoted 6 lines
The
kernel_accept()does not hold the module refcount ofnewsock->ops->owner, so we need__module_get(newsock->ops->owner)code after callkernel_accept()by hand.
In sunrpc, the module refcount is missing to hold. So this cause kernel panic.Used following script to reproduct:
...
Quoted 1 line
Signed-off-by Wei Yongjun <[email protected]>
Good fine, patch applied, thanks!
Marcel Holtmann
maintainerHi Wei,
Quoted 19 lines
The
kernel_accept()does not hold the module refcount ofnewsock->ops->owner, so we need__module_get(newsock->ops->owner)code after callkernel_accept()by hand.
In sunrpc, the module refcount is missing to hold. So this cause kernel panic.Used following script to reproduct:
while [ 1 ];
do
mount -t nfs4 192.168.0.19:/ /mnt
touch/mnt/file
umount /mnt
lsmod | grep ipv6
doneThis patch fixed the problem by add
__module_get(newsock->ops->owner)tokernel_accept(). So we do not need to used__module_get(newsock->ops->owner)in every place when usedkernel_accept().
Quoted 5 lines
Signed-off-by Wei Yongjun <[email protected]>--- net/bluetooth/rfcomm/core.c | 2 -- net/socket.c | 1 + 2 files changed, 1 insertions(+), 2 deletions(-)
I was just about to reply and ask you to double check the users since I know that I am using that API. Hey, but you already did that. Thanks.
Dave, for what its worth, Acked-by me.
Regards
Marcel
David Miller
maintainerFrom: Marcel Holtmann <[email protected]>
Date: Fri, 19 Dec 2008 07:35:37 +0100
Quoted 21 lines
Hi Wei,
Quoted 19 lines
The
kernel_accept()does not hold the module refcount ofnewsock->ops->owner, so we need__module_get(newsock->ops->owner)code after callkernel_accept()by hand.
In sunrpc, the module refcount is missing to hold. So this cause kernel panic.Used following script to reproduct:
while [ 1 ];
do
mount -t nfs4 192.168.0.19:/ /mnt
touch/mnt/file
umount /mnt
lsmod | grep ipv6
doneThis patch fixed the problem by add
__module_get(newsock->ops->owner)tokernel_accept(). So we do not need to used__module_get(newsock->ops->owner)in every place when usedkernel_accept().
Quoted 8 lines
Quoted 5 lines
Signed-off-by Wei Yongjun <[email protected]>--- net/bluetooth/rfcomm/core.c | 2 -- net/socket.c | 1 + 2 files changed, 1 insertions(+), 2 deletions(-)I was just about to reply and ask you to double check the users since I know that I am using that API. Hey, but you already did that. Thanks.
That's the exact audit I did before applying his patch :-)