]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
smb: client: fix possible double free in smb2_set_ea()
authorSu Hui <suhui@nfschina.com>
Tue, 15 Oct 2024 10:20:37 +0000 (18:20 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 1 Nov 2024 01:02:30 +0000 (02:02 +0100)
[ Upstream commit 19ebc1e6cab334a8193398d4152deb76019b5d34 ]

Clang static checker(scan-build) warning:
fs/smb/client/smb2ops.c:1304:2: Attempt to free released memory.
 1304 |         kfree(ea);
      |         ^~~~~~~~~

There is a double free in such case:
'ea is initialized to NULL' -> 'first successful memory allocation for
ea' -> 'something failed, goto sea_exit' -> 'first memory release for ea'
-> 'goto replay_again' -> 'second goto sea_exit before allocate memory
for ea' -> 'second memory release for ea resulted in double free'.

Re-initialie 'ea' to NULL near to the replay_again label, it can fix this
double free problem.

Fixes: 4f1fffa23769 ("cifs: commands that are retried should have replay flag set")
Reviewed-by: Dan Carpenter <dan.carpenter@linaro.org>
Signed-off-by: Su Hui <suhui@nfschina.com>
Signed-off-by: Steve French <stfrench@microsoft.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
fs/smb/client/smb2ops.c

index e9be7b43bb6b8d8fd9798cdd87ad14da7b0ab954..b9e332443b0d90342ac04eca9026f3fca7a40fe4 100644 (file)
@@ -1156,7 +1156,7 @@ smb2_set_ea(const unsigned int xid, struct cifs_tcon *tcon,
        struct cifs_fid fid;
        unsigned int size[1];
        void *data[1];
-       struct smb2_file_full_ea_info *ea = NULL;
+       struct smb2_file_full_ea_info *ea;
        struct smb2_query_info_rsp *rsp;
        int rc, used_len = 0;
        int retries = 0, cur_sleep = 1;
@@ -1177,6 +1177,7 @@ replay_again:
        if (!utf16_path)
                return -ENOMEM;
 
+       ea = NULL;
        resp_buftype[0] = resp_buftype[1] = resp_buftype[2] = CIFS_NO_BUFFER;
        vars = kzalloc(sizeof(*vars), GFP_KERNEL);
        if (!vars) {