Linux Headquarters
[ Register ]
[ About us ] [ Home Page ]

Advertisement
[ Kernel ] [ Documentation ] [ Links ] [ Books ]

Advertisement

Kernel v2.6.24 /fs/cifs/asn1.c

Filename:/fs/cifs/asn1.c
Lines Added:28
Lines Deleted:17
Also changed in: (Previous) 2.6.24-rc8  2.6.24-rc7  2.6.24-rc6  2.6.24-rc5  2.6.24-rc4  2.6.24-rc3 
(Following) 2.6.25.5  2.6.25.6  2.6.25.7  2.6.25.8  2.6.25.9  2.6.25.10 

Location
[  2.6.24
  [  fs
    [  cifs
       o  asn1.c

Patch

diff --git a/fs/cifs/asn1.c b/fs/cifs/asn1.c
index f50a88d..bcda2c6 100644
--- a/fs/cifs/asn1.c
+++ b/fs/cifs/asn1.c
@@ -77,8 +77,12 @@
 
 #define SPNEGO_OID_LEN 7
 #define NTLMSSP_OID_LEN  10
+#define KRB5_OID_LEN  7
+#define MSKRB5_OID_LEN  7
 static unsigned long SPNEGO_OID[7] = { 1, 3, 6, 1, 5, 5, 2 };
 static unsigned long NTLMSSP_OID[10] = { 1, 3, 6, 1, 4, 1, 311, 2, 2, 10 };
+static unsigned long KRB5_OID[7] = { 1, 2, 840, 113554, 1, 2, 2 };
+static unsigned long MSKRB5_OID[7] = { 1, 2, 840, 48018, 1, 2, 2 };
 
 /*
  * ASN.1 context.
@@ -385,10 +389,9 @@ asn1_oid_decode(struct asn1_ctx *ctx,
    unsigned long *optr;
 
    size = eoc - ctx->pointer + 1;
-   *oid = kmalloc(size * sizeof (unsigned long), GFP_ATOMIC);
-   if (*oid == NULL) {
+   *oid = kmalloc(size * sizeof(unsigned long), GFP_ATOMIC);
+   if (*oid == NULL)
       return 0;
-   }
 
    optr = *oid;
 
@@ -458,6 +461,7 @@ decode_negTokenInit(unsigned char *security_blob, int length,
    unsigned long *oid = NULL;
    unsigned int cls, con, tag, oidlen, rc;
    int use_ntlmssp = FALSE;
+   int use_kerberos = FALSE;
 
    *secType = NTLM; /* BB eventually make Kerberos or NLTMSSP the default*/
 
@@ -546,18 +550,28 @@ decode_negTokenInit(unsigned char *security_blob, int length,
             return 0;
          }
          if ((tag == ASN1_OJI) && (con == ASN1_PRI)) {
-            rc = asn1_oid_decode(&ctx, end, &oid, &oidlen);
-            if (rc) {
+            if (asn1_oid_decode(&ctx, end, &oid, &oidlen)) {
+
                cFYI(1,
                  ("OID len = %d oid = 0x%lx 0x%lx "
                   "0x%lx 0x%lx",
                   oidlen, *oid, *(oid + 1),
                   *(oid + 2), *(oid + 3)));
-               rc = compare_oid(oid, oidlen,
-                   NTLMSSP_OID, NTLMSSP_OID_LEN);
-               kfree(oid);
-               if (rc)
+
+               if (compare_oid(oid, oidlen,
+                     MSKRB5_OID,
+                     MSKRB5_OID_LEN))
+                  use_kerberos = TRUE;
+               else if (compare_oid(oid, oidlen,
+                          KRB5_OID,
+                          KRB5_OID_LEN))
+                  use_kerberos = TRUE;
+               else if (compare_oid(oid, oidlen,
+                          NTLMSSP_OID,
+                          NTLMSSP_OID_LEN))
                   use_ntlmssp = TRUE;
+
+               kfree(oid);
             }
          } else {
             cFYI(1, ("Should be an oid what is going on?"));
@@ -581,9 +595,8 @@ decode_negTokenInit(unsigned char *security_blob, int length,
          return 0;
       } else if ((cls != ASN1_UNI) || (con != ASN1_CON)
             || (tag != ASN1_SEQ)) {
-         cFYI(1,
-              ("Exit 6 cls = %d con = %d tag = %d end = %p (%d)",
-               cls, con, tag, end, *end));
+         cFYI(1, ("cls = %d con = %d tag = %d end = %p (%d)",
+            cls, con, tag, end, *end));
       }
 
       if (asn1_header_decode(&ctx, &end, &cls, &con, &tag) == 0) {
@@ -611,12 +624,10 @@ decode_negTokenInit(unsigned char *security_blob, int length,
           ctx.pointer));   /* is this UTF-8 or ASCII? */
    }
 
-   /* if (use_kerberos)
-      *secType = Kerberos
-      else */
-   if (use_ntlmssp) {
+   if (use_kerberos)
+      *secType = Kerberos;
+   else if (use_ntlmssp)
       *secType = NTLMSSP;
-   }
 
    return 1;
 }


Comments: webmaster (at) linuxhq.com.
Advertising: banners (at) linuxhq.com.
Compilation ©1998-2008 Linux Headquarters, Inc.