OSDN Git Service

SMB3: passthru query info doesn't check for SMB3 FSCTL passthru
authorSteve French <stfrench@microsoft.com>
Wed, 13 Mar 2019 07:40:07 +0000 (02:40 -0500)
committerSteve French <stfrench@microsoft.com>
Fri, 15 Mar 2019 00:32:36 +0000 (19:32 -0500)
The passthrough queries from user space tools like smbinfo can be either
SMB3 QUERY_INFO or SMB3 FSCTL, but we are not checking for the latter.
Temporarily we return EOPNOTSUPP for SMB3 FSCTL passthrough requests
but once compounding fsctls is fixed can enable.

Signed-off-by: Steve French <stfrench@microsoft.com>
Reviewed-by: Ronnie Sahlberg <lsahlber@redhat.com>
fs/cifs/cifs_ioctl.h
fs/cifs/smb2ops.c

index d8bce2f..086ddc5 100644 (file)
@@ -43,6 +43,9 @@ struct smb_snapshot_array {
        /*      snapshots[]; */
 } __packed;
 
+/* query_info flags */
+#define PASSTHRU_QUERY_INFO    0x00000000
+#define PASSTHRU_FSCTL         0x00000001
 struct smb_query_info {
        __u32   info_type;
        __u32   file_info_class;
index 823a585..32dde87 100644 (file)
@@ -1390,15 +1390,27 @@ smb2_ioctl_query_info(const unsigned int xid,
        smb2_set_next_command(tcon, &rqst[0]);
 
        /* Query */
-       memset(&qi_iov, 0, sizeof(qi_iov));
-       rqst[1].rq_iov = qi_iov;
-       rqst[1].rq_nvec = 1;
-
-       rc = SMB2_query_info_init(tcon, &rqst[1], COMPOUND_FID, COMPOUND_FID,
-                                 qi.file_info_class, qi.info_type,
-                                 qi.additional_information,
+       if (qi.flags & PASSTHRU_FSCTL) {
+               /* Can eventually relax perm check since server enforces too */
+               if (!capable(CAP_SYS_ADMIN))
+                       rc = -EPERM;
+               else  /* TBD: Add code to compound FSCTL */
+                       rc = -EOPNOTSUPP;
+       } else if (qi.flags == PASSTHRU_QUERY_INFO) {
+               memset(&qi_iov, 0, sizeof(qi_iov));
+               rqst[1].rq_iov = qi_iov;
+               rqst[1].rq_nvec = 1;
+
+               rc = SMB2_query_info_init(tcon, &rqst[1], COMPOUND_FID,
+                                 COMPOUND_FID, qi.file_info_class,
+                                 qi.info_type, qi.additional_information,
                                  qi.input_buffer_length,
                                  qi.output_buffer_length, buffer);
+       } else { /* unknown flags */
+               cifs_dbg(VFS, "invalid passthru query flags: 0x%x\n", qi.flags);
+               rc = -EINVAL;
+       }
+
        if (rc)
                goto iqinf_exit;
        smb2_set_next_command(tcon, &rqst[1]);