Patch "CIFS: Fix a possible invalid memory access in smb2_query_symlink()" has been added to the 4.4-stable tree
This is a note to let you know that I've just added the patch titled
CIFS: Fix a possible invalid memory access in smb2_query_symlink()
to the 4.4-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
cifs-fix-a-possible-invalid-memory-access-in-smb2_query_symlink.patch
and it can be found in the queue-4.4 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
7893242e2465aea6f2cbc2639da8fa5ce96e8cc2Mon Sep 17 00:00:00 2001
From: Pavel Shilovsky <[email protected]>
Date: Sun, 24 Jul 2016 10:37:38 +0300
Subject: CIFS: Fix a possible invalid memory access in smb2_query_symlink()
From: Pavel Shilovsky <[email protected]>
commit 7893242e2465aea6f2cbc2639da8fa5ce96e8cc2 upstream.
During following a symbolic link we received err_buf from SMB2_open(). While the validity of SMB2 error response is checked previously in smb2_check_message() a symbolic link payload is not checked at all. Fix it by adding such checks.
--- fs/cifs/smb2ops.c | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-)
fs/cifs/smb2ops.c +29 -1
@@ -1039,6 +1039,9 @@ smb2_new_lease_key(struct cifs_fid *fid)get_random_bytes (fid->lease_key,SMB2_LEASE_KEY_SIZE ); } +#define SMB2_SYMLINK_STRUCT_SIZE \ + (sizeof(struct smb2_err_rsp) - 1 + sizeof(struct smb2_symlink_err_rsp)) + static int smb2_query_symlink(const unsigned int xid, struct cifs_tcon *tcon, const char *full_path, char **target_path,
@@ -1051,7 +1054,10 @@ smb2_query_symlink(const unsigned int xistruct cifs_fid fid;struct smb2_err_rsp *err_buf =NULL ;struct smb2_symlink_err_rsp *symlink; -unsigned int sub_len, sub_offset; +unsigned int sub_len; +unsigned int sub_offset; +unsigned int print_len; +unsigned int print_offset;cifs_dbg (FYI ,"%s: path: %s\n" , __func__, full_path);
@@ -1072,11 +1078,33 @@ smb2_query_symlink(const unsigned int xikfree (utf16_path);return -ENOENT ; } + +if (le32_to_cpu (err_buf->ByteCount) <sizeof (struct smb2_symlink_err_rsp ) || +get_rfc1002_length (err_buf) +4 <SMB2_SYMLINK_STRUCT_SIZE ) { +kfree (utf16_path); +return -ENOENT ; + } +/* open must fail on symlink - reset rc */ rc =0 ; symlink = (struct smb2_symlink_err_rsp *)err_buf->ErrorData; sub_len =le16_to_cpu (symlink->SubstituteNameLength); sub_offset =le16_to_cpu (symlink->SubstituteNameOffset); + print_len =le16_to_cpu (symlink->PrintNameLength); + print_offset =le16_to_cpu (symlink->PrintNameOffset); + +if (get_rfc1002_length (err_buf) +4 < +SMB2_SYMLINK_STRUCT_SIZE + sub_offset + sub_len) { +kfree (utf16_path); +return -ENOENT ; + } + +if (get_rfc1002_length (err_buf) +4 < +SMB2_SYMLINK_STRUCT_SIZE + print_offset + print_len) { +kfree (utf16_path); +return -ENOENT ; + } + *target_path =cifs_strndup_from_utf16 ( (char *)symlink->PathBuffer + sub_offset, sub_len, true, cifs_sb->local_nls);
Patches currently in stable-queue which might be from [email protected] are
queue-4.4/cifs-fix-a-possible-invalid-memory-access-in-smb2_query_symlink.patch queue-4.4/fs-cifs-make-share-unaccessible-at-root-level-mountable.patch