]> exis.tech > repos - linux.git/blobdiff - fs/smb/client/misc.c
Merge tag 'hwmon-for-v7.2-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/groec...
[linux.git] / fs / smb / client / misc.c
index 0c54b9b79a2ce5b40b2543277f0b299bed3b1251..e4bac2a0b85dcfead7812fa811b53f8ff3871b19 100644 (file)
@@ -278,7 +278,7 @@ dump_smb(void *buf, int smb_buf_length)
 }
 
 void
-cifs_autodisable_serverino(struct cifs_sb_info *cifs_sb)
+cifs_autodisable_serverino(struct cifs_sb_info *cifs_sb, const char *reason, int rc)
 {
        unsigned int sbflags = cifs_sb_flags(cifs_sb);
 
@@ -290,6 +290,10 @@ cifs_autodisable_serverino(struct cifs_sb_info *cifs_sb)
 
                atomic_andnot(CIFS_MOUNT_SERVER_INUM, &cifs_sb->mnt_cifs_flags);
                cifs_sb->mnt_cifs_serverino_autodisabled = true;
+               if (rc)
+                       cifs_dbg(VFS, "%s: %d\n", reason, rc);
+               else
+                       cifs_dbg(VFS, "%s\n", reason);
                cifs_dbg(VFS, "Autodisabling the use of server inode numbers on %s\n",
                         tcon ? tcon->tree_name : "new server");
                cifs_dbg(VFS, "The server doesn't seem to support them properly or the files might be on different servers (DFS)\n");
@@ -752,6 +756,10 @@ parse_dfs_referrals(struct get_dfs_referral_rsp *rsp, u32 rsp_size,
                node->ref_flag = le16_to_cpu(ref->ReferralEntryFlags);
 
                /* copy DfsPath */
+               if (le16_to_cpu(ref->DfsPathOffset) > data_end - (char *)ref) {
+                       rc = -EINVAL;
+                       goto parse_DFS_referrals_exit;
+               }
                temp = (char *)ref + le16_to_cpu(ref->DfsPathOffset);
                max_len = data_end - temp;
                node->path_name = cifs_strndup_from_utf16(temp, max_len,
@@ -762,6 +770,10 @@ parse_dfs_referrals(struct get_dfs_referral_rsp *rsp, u32 rsp_size,
                }
 
                /* copy link target UNC */
+               if (le16_to_cpu(ref->NetworkAddressOffset) > data_end - (char *)ref) {
+                       rc = -EINVAL;
+                       goto parse_DFS_referrals_exit;
+               }
                temp = (char *)ref + le16_to_cpu(ref->NetworkAddressOffset);
                max_len = data_end - temp;
                node->node_name = cifs_strndup_from_utf16(temp, max_len,