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.
(This used to be commit 79bc6796b81395d591fc6ef389f153dd981fe68b)

source3/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;