The 0xc018 and 0xc022 are most likely string deliminators and a one byte
flag.  This makes sense since it always seems to be either 0xc018 or 0xc022
(0xc022 == 0xc018 | 0x04)  What the meaning of these flags is remains to be
seen.

The net ads lookup code is really out of date anyway.  I've construct a
patch that reworks most of the parsing such and I think we're at a point
where every field we have a least a pretty good guess as to what it is.

I'll submit the patch once I get an opportunity to test it.

Anthony Liguori
Linux/Active Directory Interoperability
Linux Technology Center (LTC) - IBM Austin
E-mail: [EMAIL PROTECTED]
Phone: (512) 838-1208
Tie Line: 678-1208


                                                                                       
                    
                      Chere Zhou                                                       
                    
                      <[EMAIL PROTECTED]        To:       Anthony 
Liguori/Austin/[EMAIL PROTECTED]                  
                      >                        cc:       [EMAIL PROTECTED]             
      
                                               Subject:  [PATCH] Re: 3.0a21: "net ads 
lookup" for a child  
                      02/24/2003 02:00          domain got messy output                
                    
                      PM                                                               
                    
                      Please respond to                                                
                    
                      qzhou                                                            
                    
                                                                                       
                    
                                                                                       
                    



With the following patch, it works for me now.   However, there are still
mysteries like what 0xc018 and 0xc022 means in the received netlogon
responses.  My fix is to split the "domain" into "forest" and "domain",
where
the new "domain" is the child/grandchild under "forest".  The ultimate
domain
name should be domain+'.'+forest.

Even if this does not go into the sources eventually, I hope it can be
helpful for other people who had the same problem as I did.

Chere


--- utils/net_ads_cldap.c.orig  Fri Feb 21 15:34:18 2003
+++ utils/net_ads_cldap.c       Mon Feb 24 11:27:47 2003
@@ -27,6 +27,7 @@
        uint32 version;
        uint32 flags;
        GUID guid;
+        char *forest;
        char *domain;
        char *server_name;
        char *domain_flatname;
@@ -42,11 +43,13 @@
 */
 static unsigned pull_len_string(char **ret, const char *p)
 {
-       unsigned len = *p;
+       unsigned char len = *p;
        (*ret) = NULL;
        if (len == 0) return 1;
+       if ((len == 0xc0) && ((unsigned char)(*(p+1)) == 0x18))
+               return 1;
        (*ret) = smb_xstrndup(p+1, len);
-       return len+1;
+       return (unsigned)(len+1);
 }

 /*
@@ -194,8 +197,13 @@
        reply->flags = IVAL(p, 0); p += 4;
        memcpy(&reply->guid.info, p, GUID_SIZE);
        p += GUID_SIZE;
-       p += pull_dotted_string(&reply->domain, p);
-       p += 2; /* 0xc018 - whats this? */
+       p += pull_dotted_string(&reply->forest, p);
+       if ((unsigned char)*p == 0xc0)
+               p += 2; /* 0xc018 - whats this? */
+       else {
+               p += pull_dotted_string(&reply->domain, p);
+               p += 1;
+       }
        p += pull_len_string(&reply->server_name, p);
        p += 2; /* 0xc018 - whats this? */
        p += pull_len_string(&reply->domain_flatname, p);
@@ -218,6 +226,7 @@
 */
 static void cldap_reply_free(struct cldap_netlogon_reply *reply)
 {
+       SAFE_FREE(reply->forest);
        SAFE_FREE(reply->domain);
        SAFE_FREE(reply->server_name);
        SAFE_FREE(reply->domain_flatname);
@@ -258,6 +267,7 @@
        d_printf("GUID: ");
        print_guid(&reply.guid);
        d_printf("Flags:   0x%x\n", reply.flags);
+       d_printf("Forest root: %s\n", reply.forest);
        d_printf("Domain: %s\n", reply.domain);
        d_printf("Server Name: %s\n", reply.server_name);
        d_printf("Flatname: %s\n", reply.domain_flatname);



Reply via email to