summaryrefslogtreecommitdiff
path: root/fs
diff options
context:
space:
mode:
authorWang Zhaolong <wangzhaolong1@huawei.com>2025-04-30 11:16:23 +0800
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2025-05-18 08:24:04 +0200
commitaf9e2d4732a548db8f6f5a90c2c20a789a3d7240 (patch)
tree450625f0359cd5e04a68c82d4e5f82216356680e /fs
parent0236742bd959332181c1fcc41a05b7b709180501 (diff)
downloadlinux-af9e2d4732a548db8f6f5a90c2c20a789a3d7240.tar.gz
linux-af9e2d4732a548db8f6f5a90c2c20a789a3d7240.tar.bz2
linux-af9e2d4732a548db8f6f5a90c2c20a789a3d7240.zip
ksmbd: fix memory leak in parse_lease_state()
[ Upstream commit eb4447bcce915b43b691123118893fca4f372a8f ] The previous patch that added bounds check for create lease context introduced a memory leak. When the bounds check fails, the function returns NULL without freeing the previously allocated lease_ctx_info structure. This patch fixes the issue by adding kfree(lreq) before returning NULL in both boundary check cases. Fixes: bab703ed8472 ("ksmbd: add bounds check for create lease context") Signed-off-by: Wang Zhaolong <wangzhaolong1@huawei.com> Acked-by: Namjae Jeon <linkinjeon@kernel.org> Signed-off-by: Steve French <stfrench@microsoft.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
Diffstat (limited to 'fs')
-rw-r--r--fs/smb/server/oplock.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/fs/smb/server/oplock.c b/fs/smb/server/oplock.c
index 5a5277b4b53b..72294764d4c2 100644
--- a/fs/smb/server/oplock.c
+++ b/fs/smb/server/oplock.c
@@ -1496,7 +1496,7 @@ struct lease_ctx_info *parse_lease_state(void *open_req)
if (le16_to_cpu(cc->DataOffset) + le32_to_cpu(cc->DataLength) <
sizeof(struct create_lease_v2) - 4)
- return NULL;
+ goto err_out;
memcpy(lreq->lease_key, lc->lcontext.LeaseKey, SMB2_LEASE_KEY_SIZE);
lreq->req_state = lc->lcontext.LeaseState;
@@ -1512,7 +1512,7 @@ struct lease_ctx_info *parse_lease_state(void *open_req)
if (le16_to_cpu(cc->DataOffset) + le32_to_cpu(cc->DataLength) <
sizeof(struct create_lease))
- return NULL;
+ goto err_out;
memcpy(lreq->lease_key, lc->lcontext.LeaseKey, SMB2_LEASE_KEY_SIZE);
lreq->req_state = lc->lcontext.LeaseState;
@@ -1521,6 +1521,9 @@ struct lease_ctx_info *parse_lease_state(void *open_req)
lreq->version = 1;
}
return lreq;
+err_out:
+ kfree(lreq);
+ return NULL;
}
/**