| From 89bb430f621124af39bb31763c4a8b504c9651e2 Mon Sep 17 00:00:00 2001 |
| From: Ziyan Xu <ziyan@securitygossip.com> |
| Date: Sat, 16 Aug 2025 10:20:05 +0900 |
| Subject: ksmbd: fix refcount leak causing resource not released |
| |
| From: Ziyan Xu <ziyan@securitygossip.com> |
| |
| commit 89bb430f621124af39bb31763c4a8b504c9651e2 upstream. |
| |
| When ksmbd_conn_releasing(opinfo->conn) returns true,the refcount was not |
| decremented properly, causing a refcount leak that prevents the count from |
| reaching zero and the memory from being released. |
| |
| Cc: stable@vger.kernel.org |
| Signed-off-by: Ziyan Xu <ziyan@securitygossip.com> |
| Signed-off-by: Namjae Jeon <linkinjeon@kernel.org> |
| Signed-off-by: Steve French <stfrench@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| fs/smb/server/oplock.c | 13 ++++++++++--- |
| 1 file changed, 10 insertions(+), 3 deletions(-) |
| |
| --- a/fs/smb/server/oplock.c |
| +++ b/fs/smb/server/oplock.c |
| @@ -1102,8 +1102,10 @@ void smb_send_parent_lease_break_noti(st |
| if (!atomic_inc_not_zero(&opinfo->refcount)) |
| continue; |
| |
| - if (ksmbd_conn_releasing(opinfo->conn)) |
| + if (ksmbd_conn_releasing(opinfo->conn)) { |
| + opinfo_put(opinfo); |
| continue; |
| + } |
| |
| oplock_break(opinfo, SMB2_OPLOCK_LEVEL_NONE, NULL); |
| opinfo_put(opinfo); |
| @@ -1139,8 +1141,11 @@ void smb_lazy_parent_lease_break_close(s |
| if (!atomic_inc_not_zero(&opinfo->refcount)) |
| continue; |
| |
| - if (ksmbd_conn_releasing(opinfo->conn)) |
| + if (ksmbd_conn_releasing(opinfo->conn)) { |
| + opinfo_put(opinfo); |
| continue; |
| + } |
| + |
| oplock_break(opinfo, SMB2_OPLOCK_LEVEL_NONE, NULL); |
| opinfo_put(opinfo); |
| } |
| @@ -1343,8 +1348,10 @@ void smb_break_all_levII_oplock(struct k |
| if (!atomic_inc_not_zero(&brk_op->refcount)) |
| continue; |
| |
| - if (ksmbd_conn_releasing(brk_op->conn)) |
| + if (ksmbd_conn_releasing(brk_op->conn)) { |
| + opinfo_put(brk_op); |
| continue; |
| + } |
| |
| if (brk_op->is_lease && (brk_op->o_lease->state & |
| (~(SMB2_LEASE_READ_CACHING_LE | |