Also accept 0x15 getdc replies
authorVolker Lendecke <vl@samba.org>
Thu, 10 Apr 2008 09:52:44 +0000 (11:52 +0200)
committerVolker Lendecke <vl@samba.org>
Thu, 10 Apr 2008 09:53:43 +0000 (11:53 +0200)
My NT4SP6 which my DC here trusts sends 0x15 instead of 0x13, from looking at
the sniff at least the DC name is at the same place.

source/winbindd/winbindd_cm.c

index 80261862b10d9816fd6fd4d5e154e78f5086b3d0..8e275b22698f7ebe813bac5ace7516986cc4dcb8 100644 (file)
@@ -1145,28 +1145,31 @@ static bool receive_getdc_response(struct sockaddr_storage *dc_ss,
        /* This should be (buf-4)+SVAL(buf-4, smb_vwv12)... */
        p = buf+SVAL(buf, smb_vwv10);
 
-       if (CVAL(p,0) != SAMLOGON_R) {
-               DEBUG(8, ("GetDC got invalid response type %d\n", CVAL(p, 0)));
-               return False;
-       }
+       switch (CVAL(p, 0)) {
+       case SAMLOGON_R:
+       case SAMLOGON_UNK_R:
+               p+=2;
+               pull_ucs2(buf, dcname, p, sizeof(dcname), PTR_DIFF(buf+len, p),
+                         STR_TERMINATE|STR_NOALIGN);
+               p = skip_unibuf(p, PTR_DIFF(buf+len, p));
+               pull_ucs2(buf, user, p, sizeof(user), PTR_DIFF(buf+len, p),
+                         STR_TERMINATE|STR_NOALIGN);
+               p = skip_unibuf(p, PTR_DIFF(buf+len, p));
+               pull_ucs2(buf, domain, p, sizeof(domain), PTR_DIFF(buf+len, p),
+                         STR_TERMINATE|STR_NOALIGN);
+               p = skip_unibuf(p, PTR_DIFF(buf+len, p));
+
+               if (!strequal(domain, domain_name)) {
+                       DEBUG(3, ("GetDC: Expected domain %s, got %s\n",
+                                 domain_name, domain));
+                       return False;
+               }
+               break;
 
-       p+=2;
-       pull_ucs2(buf, dcname, p, sizeof(dcname), PTR_DIFF(buf+len, p),
-                 STR_TERMINATE|STR_NOALIGN);
-       p = skip_unibuf(p, PTR_DIFF(buf+len, p));
-       pull_ucs2(buf, user, p, sizeof(dcname), PTR_DIFF(buf+len, p),
-                 STR_TERMINATE|STR_NOALIGN);
-       p = skip_unibuf(p, PTR_DIFF(buf+len, p));
-       pull_ucs2(buf, domain, p, sizeof(dcname), PTR_DIFF(buf+len, p),
-                 STR_TERMINATE|STR_NOALIGN);
-       p = skip_unibuf(p, PTR_DIFF(buf+len, p));
-
-       if (!strequal(domain, domain_name)) {
-               DEBUG(3, ("GetDC: Expected domain %s, got %s\n",
-                         domain_name, domain));
+       default:
+               DEBUG(8, ("GetDC got invalid response type %d\n", CVAL(p, 0)));
                return False;
        }
-
        p = dcname;
        if (*p == '\\') p += 1;
        if (*p == '\\') p += 1;