perf cpumap: Add new map type for aggregation
[linux-2.6-microblaze.git] / fs / cifs / smb2misc.c
index d88e268..60d4bd1 100644 (file)
@@ -94,6 +94,8 @@ static const __le16 smb2_rsp_struct_sizes[NUMBER_OF_SMB2_COMMANDS] = {
        /* SMB2_OPLOCK_BREAK */ cpu_to_le16(24)
 };
 
+#define SMB311_NEGPROT_BASE_SIZE (sizeof(struct smb2_sync_hdr) + sizeof(struct smb2_negotiate_rsp))
+
 static __u32 get_neg_ctxt_len(struct smb2_sync_hdr *hdr, __u32 len,
                              __u32 non_ctxlen)
 {
@@ -107,13 +109,28 @@ static __u32 get_neg_ctxt_len(struct smb2_sync_hdr *hdr, __u32 len,
           (pneg_rsp->DialectRevision != cpu_to_le16(SMB311_PROT_ID)))
                return 0;
 
-       /* Make sure that negotiate contexts start after gss security blob */
+       /*
+        * if SPNEGO blob present (ie the RFC2478 GSS info which indicates
+        * which security mechanisms the server supports) make sure that
+        * the negotiate contexts start after it
+        */
        nc_offset = le32_to_cpu(pneg_rsp->NegotiateContextOffset);
-       if (nc_offset < non_ctxlen) {
-               pr_warn_once("Invalid negotiate context offset\n");
+       /*
+        * non_ctxlen is at least shdr->StructureSize + pdu->StructureSize2
+        * and the latter is 1 byte bigger than the fix-sized area of the
+        * NEGOTIATE response
+        */
+       if (nc_offset + 1 < non_ctxlen) {
+               pr_warn_once("Invalid negotiate context offset %d\n", nc_offset);
                return 0;
-       }
-       size_of_pad_before_neg_ctxts = nc_offset - non_ctxlen;
+       } else if (nc_offset + 1 == non_ctxlen) {
+               cifs_dbg(FYI, "no SPNEGO security blob in negprot rsp\n");
+               size_of_pad_before_neg_ctxts = 0;
+       } else if (non_ctxlen == SMB311_NEGPROT_BASE_SIZE)
+               /* has padding, but no SPNEGO blob */
+               size_of_pad_before_neg_ctxts = nc_offset - non_ctxlen + 1;
+       else
+               size_of_pad_before_neg_ctxts = nc_offset - non_ctxlen;
 
        /* Verify that at least minimal negotiate contexts fit within frame */
        if (len < nc_offset + (neg_count * sizeof(struct smb2_neg_context))) {
@@ -859,6 +876,10 @@ smb2_handle_cancelled_mid(char *buffer, struct TCP_Server_Info *server)
  *
  * Assumes @iov does not contain the rfc1002 length and iov[0] has the
  * SMB2 header.
+ *
+ * @ses:       server session structure
+ * @iov:       array containing the SMB request we will send to the server
+ * @nvec:      number of array entries for the iov
  */
 int
 smb311_update_preauth_hash(struct cifs_ses *ses, struct kvec *iov, int nvec)