This is a patch consisting of various fixes. Short list
includes:
 - using user_info.client_domain structure (from user supplied auth info)
   instead of user_info.domain
 - new (and soon completely rewritten when generic cache comes
   up) make_user_info_map function
 - return type NTSTATUS instead of BOOL for make_user_info_map
   make_user_info and make_user_info_for_reply_encI
   (the rest of these routines should do the same, imho)
 - occasional segfault fix in local groups fetching code when
   no uid to unix name can be found by winbind
 - additional degug lines for soon-to-be-changed namecache
 - samr_r_enum_dom_users parsing fix
 - a bit more aesthetics for 'net rpc trustdom list'


Some changes are quite radical, so I expect criticism, especially
from some of the Team members ;-) 
Part of this patch is a draft rather than completed proposition
and as such, much of the code may yet be changed.
   

-- 
cheers,
+------------------------------------------------------------+
|Rafal 'Mimir' Szczesniak <[EMAIL PROTECTED]>   |
|*BSD, GNU/Linux and Samba                                  /
|__________________________________________________________/
Index: Makefile.in
===================================================================
RCS file: /cvsroot/samba/source/Makefile.in,v
retrieving revision 1.527
diff -u -r1.527 Makefile.in
--- Makefile.in 30 Aug 2002 12:46:54 -0000      1.527
+++ Makefile.in 2 Sep 2002 10:37:24 -0000
@@ -242,7 +242,8 @@
 
 AUTH_OBJ = auth/auth.o auth/auth_sam.o auth/auth_server.o auth/auth_domain.o \
           auth/auth_rhosts.o auth/auth_unix.o auth/auth_util.o auth/auth_winbind.o \
-          auth/auth_builtin.o auth/auth_compat.o $(PLAINTEXT_AUTH_OBJ) $(UNIGRP_OBJ)
+          auth/auth_builtin.o auth/auth_compat.o \
+          $(PLAINTEXT_AUTH_OBJ) $(UNIGRP_OBJ)
 
 MANGLE_OBJ = smbd/mangle.o smbd/mangle_hash.o smbd/mangle_map.o smbd/mangle_hash2.o
 
Index: auth/auth.c
===================================================================
RCS file: /cvsroot/samba/source/auth/auth.c,v
retrieving revision 1.41
diff -u -r1.41 auth.c
--- auth/auth.c 31 Jul 2002 12:17:32 -0000      1.41
+++ auth/auth.c 2 Sep 2002 10:37:26 -0000
@@ -211,7 +211,7 @@
        if (!check_domain_match(user_info->smb_name.str, user_info->domain.str)) {
                return NT_STATUS_LOGON_FAILURE;
        }
-
+       
        for (auth_method = auth_context->auth_method_list;auth_method; auth_method = 
auth_method->next)
        {
                mem_ctx = talloc_init_named("%s authentication for user %s\\%s", 
auth_method->name, 
Index: auth/auth_domain.c
===================================================================
RCS file: /cvsroot/samba/source/auth/auth_domain.c,v
retrieving revision 1.57
diff -u -r1.57 auth_domain.c
--- auth/auth_domain.c  30 Aug 2002 10:46:58 -0000      1.57
+++ auth/auth_domain.c  2 Sep 2002 10:37:27 -0000
@@ -164,13 +164,13 @@
         * With NT4.x DC's *all* authentication must be serialized to avoid
         * ACCESS_DENIED errors if 2 auths are done from the same machine. JRA.
         */
-
+       
        if (!grab_server_mutex(server))
                return NT_STATUS_NO_LOGON_SERVERS;
        
        /* Attempt connection */
        result = cli_full_connection(cli, global_myname, remote_machine,
-                                    &dest_ip, 0, "IPC$", "IPC", "", "", "",0);
+                                    &dest_ip, 0, "IPC$", "IPC", "", "", "",0);
 
        if (!NT_STATUS_IS_OK(result)) {
                release_server_mutex();
@@ -251,7 +251,7 @@
 }
 
 /***********************************************************************
- We have been asked to dynamcially determine the IP addresses of
+ We have been asked to dynamically determine the IP addresses of
  the PDC and BDC's for DOMAIN, and query them in turn.
 ************************************************************************/
 static NTSTATUS find_connect_pdc(struct cli_state **cli, 
@@ -388,7 +388,7 @@
          */
 
        nt_status = cli_netlogon_sam_network_logon(cli, mem_ctx,
-                                                  user_info->smb_name.str, 
user_info->domain.str, 
+                                                  user_info->smb_name.str, 
+user_info->client_domain.str, 
                                                   user_info->wksta_name.str, chal, 
                                                   user_info->lm_resp, 
user_info->nt_resp, 
                                                   &info3);
@@ -552,7 +552,7 @@
         * If it is, we should use our own local password file.
         */
 
-       if(strequal(lp_workgroup(), (user_info->domain.str))) {
+       if(strequal(lp_workgroup(), (user_info->client_domain.str))) {
                DEBUG(3,("check_trustdomain_security: Requested domain was for this 
domain.\n"));
                return NT_STATUS_LOGON_FAILURE;
        }
@@ -562,14 +562,14 @@
         * No need to become_root() as secrets_init() is done at startup.
         */
 
-       if (!secrets_fetch_trusted_domain_password(user_info->domain.str, 
&trust_password, &sid, &last_change_time))
+       if (!secrets_fetch_trusted_domain_password(user_info->client_domain.str, 
+&trust_password, &sid, &last_change_time))
        {
                DEBUG(0, ("check_trustdomain_security: could not fetch trust account 
password for domain %s\n", user_info->domain.str));
                return NT_STATUS_CANT_ACCESS_DOMAIN_INFO;
        }
 
 #ifdef DEBUG_PASSWORD
-       DEBUG(100, ("Trust password for domain %s is %s\n", user_info->domain.str, 
trust_password));
+       DEBUG(100, ("Trust password for domain %s is: %s\n", 
+user_info->client_domain.str, trust_password));
 #endif
        E_md4hash(trust_password, trust_md4_password);
        SAFE_FREE(trust_password);
@@ -582,7 +582,7 @@
        }
 #endif
 
-       nt_status = domain_client_validate(mem_ctx, user_info, user_info->domain.str,
+       nt_status = domain_client_validate(mem_ctx, user_info, 
+user_info->client_domain.str,
                                           (uchar *)auth_context->challenge.data, 
                                           server_info, "*" /* Do a lookup */, 
                                           lp_workgroup(), SEC_CHAN_DOMAIN, 
trust_md4_password, last_change_time);
Index: auth/auth_sam.c
===================================================================
RCS file: /cvsroot/samba/source/auth/auth_sam.c,v
retrieving revision 1.44
diff -u -r1.44 auth_sam.c
--- auth/auth_sam.c     26 Aug 2002 03:08:37 -0000      1.44
+++ auth/auth_sam.c     2 Sep 2002 10:37:28 -0000
@@ -368,7 +368,7 @@
        NTSTATUS nt_status;
        uint8 user_sess_key[16];
        const uint8* lm_hash;
-
+       
        if (!user_info || !auth_context) {
                return NT_STATUS_UNSUCCESSFUL;
        }
Index: auth/auth_util.c
===================================================================
RCS file: /cvsroot/samba/source/auth/auth_util.c,v
retrieving revision 1.50
diff -u -r1.50 auth_util.c
--- auth/auth_util.c    30 Aug 2002 18:56:46 -0000      1.50
+++ auth/auth_util.c    2 Sep 2002 10:37:30 -0000
@@ -4,6 +4,7 @@
    Copyright (C) Andrew Tridgell 1992-1998
    Copyright (C) Andrew Bartlett 2001
    Copyright (C) Jeremy Allison 2000-2001
+   Copyright (C) Rafal Szczesniak 2002
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -56,7 +57,7 @@
  Add and Delete UNIX users on demand, based on NTSTATUS codes.
 ****************************************************************************/
 
-void smb_user_control(const auth_usersupplied_info *user_info, 
auth_serversupplied_info *server_info, NTSTATUS nt_status) 
+void smb_user_control(const auth_usersupplied_info *user_info, 
+auth_serversupplied_info *server_info, NTSTATUS nt_status)
 {
        struct passwd *pwd=NULL;
 
@@ -81,15 +82,15 @@
  Create an auth_usersupplied_data structure
 ****************************************************************************/
 
-static BOOL make_user_info(auth_usersupplied_info **user_info, 
-                          const char *smb_name, 
-                          const char *internal_username,
-                          const char *client_domain, 
-                          const char *domain,
-                          const char *wksta_name, 
-                          DATA_BLOB lm_pwd, DATA_BLOB nt_pwd,
-                          DATA_BLOB plaintext, 
-                          uint32 auth_flags, BOOL encrypted)
+static NTSTATUS make_user_info(auth_usersupplied_info **user_info, 
+                               const char *smb_name, 
+                               const char *internal_username,
+                               const char *client_domain, 
+                               const char *domain,
+                               const char *wksta_name, 
+                               DATA_BLOB lm_pwd, DATA_BLOB nt_pwd,
+                               DATA_BLOB plaintext, 
+                               uint32 auth_flags, BOOL encrypted)
 {
 
        DEBUG(5,("attempting to make a user_info for %s (%s)\n", internal_username, 
smb_name));
@@ -97,7 +98,7 @@
        *user_info = malloc(sizeof(**user_info));
        if (!user_info) {
                DEBUG(0,("malloc failed for user_info (size %d)\n", 
sizeof(*user_info)));
-               return False;
+               return NT_STATUS_NO_MEMORY;
        }
 
        ZERO_STRUCTP(*user_info);
@@ -109,7 +110,7 @@
                (*user_info)->smb_name.len = strlen(smb_name);
        } else {
                free_user_info(user_info);
-               return False;
+               return NT_STATUS_NO_MEMORY;
        }
        
        (*user_info)->internal_username.str = strdup(internal_username);
@@ -117,7 +118,7 @@
                (*user_info)->internal_username.len = strlen(internal_username);
        } else {
                free_user_info(user_info);
-               return False;
+               return NT_STATUS_NO_MEMORY;
        }
 
        (*user_info)->domain.str = strdup(domain);
@@ -125,7 +126,7 @@
                (*user_info)->domain.len = strlen(domain);
        } else {
                free_user_info(user_info);
-               return False;
+               return NT_STATUS_NO_MEMORY;
        }
 
        (*user_info)->client_domain.str = strdup(client_domain);
@@ -133,7 +134,7 @@
                (*user_info)->client_domain.len = strlen(client_domain);
        } else {
                free_user_info(user_info);
-               return False;
+               return NT_STATUS_NO_MEMORY;
        }
 
        (*user_info)->wksta_name.str = strdup(wksta_name);
@@ -141,7 +142,7 @@
                (*user_info)->wksta_name.len = strlen(wksta_name);
        } else {
                free_user_info(user_info);
-               return False;
+               return NT_STATUS_NO_MEMORY;
        }
 
        DEBUG(5,("making blobs for %s's user_info struct\n", internal_username));
@@ -155,81 +156,143 @@
 
        DEBUG(10,("made an %sencrypted user_info for %s (%s)\n", encrypted ? "":"un" , 
internal_username, smb_name));
 
-       return True;
+       return NT_STATUS_OK;
 }
 
 /****************************************************************************
  Create an auth_usersupplied_data structure after appropriate mapping.
 ****************************************************************************/
 
-BOOL make_user_info_map(auth_usersupplied_info **user_info, 
-                       const char *smb_name, 
-                       const char *client_domain, 
-                       const char *wksta_name, 
-                       DATA_BLOB lm_pwd, DATA_BLOB nt_pwd,
-                       DATA_BLOB plaintext, 
-                       uint32 ntlmssp_flags, BOOL encrypted)
+NTSTATUS make_user_info_map(auth_usersupplied_info **user_info,
+                            const char *smb_name,
+                            const char *client_domain,
+                            const char *wksta_name,
+                            DATA_BLOB lm_pwd, DATA_BLOB nt_pwd,
+                            DATA_BLOB plaintext, uint32 ntlmssp_flags,
+                            BOOL encrypted)
 {
-       const char *domain;
+       const char *domain = NULL;
        fstring internal_username;
        fstrcpy(internal_username, smb_name);
-       map_username(internal_username); 
-
+       map_username(internal_username);
+       
        DEBUG(5, ("make_user_info_map: Mapping user [%s]\\[%s] from workstation 
[%s]\n",
              client_domain, smb_name, wksta_name));
        
-       if (lp_allow_trusted_domains() && *client_domain) {
+       if (*client_domain) {
 
                /* the client could have given us a workstation name
                   or other crap for the workgroup - we really need a
                   way of telling if this domain name is one of our
-                  trusted domain names 
-
-                  Also don't allow "" as a domain, fixes a Win9X bug 
-                  where it doens't supply a domain for logon script
-                  'net use' commands.
-
-                  The way I do it here is by checking if the fully
-                  qualified username exists. This is rather reliant
-                  on winbind, but until we have a better method this
-                  will have to do 
+                  trusted domain names...
+                  ... and here we do such a check (mimir)
                */
-
-               domain = client_domain;
-
-               if ((smb_name) && (*smb_name)) { /* Don't do this for guests */
-                       char *user = NULL;
-                       if (asprintf(&user, "%s%s%s", 
-                                client_domain, lp_winbind_separator(), 
-                                smb_name) < 0) {
-                               DEBUG(0, ("make_user_info_map: asprintf() failed!\n"));
-                               return False;
+               
+               if (lp_server_role() == ROLE_DOMAIN_PDC || lp_server_role() == 
+ROLE_DOMAIN_BDC) {
+               
+                       if (strequal(client_domain, lp_workgroup())) {
+                               /*
+                                * This is the simplest case - our domain's user 
+attempts
+                                * to access this server
+                                */
+                                
+                               domain = lp_workgroup();                               
+  
+                               return make_user_info(user_info, smb_name, 
+internal_username,
+                                                     client_domain, domain, 
+wksta_name, 
+                                                     lm_pwd, nt_pwd, plaintext, 
+ntlmssp_flags,
+                                                     encrypted);
+                       
+                       } else if (lp_allow_trusted_domains()) {
+                               /*
+                                * Since we're our domain's DC, just make a lookup in 
+secrets.tdb.
+                                * If domain name matches to one of a trusted domains, 
+pass
+                                * the args to make_user_info(). If not, return false.
+                                */
+
+                               int enum_ctx, num_domains, max_num_domains = 5;
+                               TRUSTDOM **trust_doms;
+                               NTSTATUS nt_status = NT_STATUS_NO_MORE_ENTRIES;
+                               
+                               TALLOC_CTX* mem_ctx = talloc_init_named("client's 
+domain trust checking");
+                               enum_ctx = 0;
+               
+                               do {
+                                       nt_status = 
+secrets_get_trusted_domains(mem_ctx, &enum_ctx, max_num_domains,
+                                                                               
+&num_domains, &trust_doms);
+                                       while (num_domains--) {
+                                               fstring trust_domain;
+                                               pull_string(NULL, trust_domain, 
+trust_doms[num_domains]->name,
+                                                           FSTRING_LEN, 32, 
+STR_UNICODE);
+                                       
+                                               if (strequal(trust_domain, 
+client_domain)) {
+       
+                                                       talloc_destroy(mem_ctx);
+                                                       domain = lp_workgroup();
+                                                       
+                                                       return 
+make_user_info(user_info, smb_name, internal_username,
+                                                                             
+client_domain, domain, wksta_name, 
+                                                                             lm_pwd, 
+nt_pwd, plaintext, ntlmssp_flags,
+                                                                             
+encrypted);
+                                               }
+                                       }
+                               } while (NT_STATUS_EQUAL(nt_status, 
+STATUS_MORE_ENTRIES));
+                       
+                               /* no matching trusted domain found */
+                               return NT_STATUS_NO_TRUST_LSA_SECRET;
                        }
+               } else {
+                       /*
+                        * We're only a domain member server, so lookup in cache shared
+                        * together with winbind. If domain name does not match to one 
+of
+                        * our trusted domains, return false.
+                        *
+                        * TODO: implement the cache, of course!
+                        * Right now it's done by testing user name against winbind
+                        */
+                        
+                       /*
+                          Also don't allow "" as a domain, fixes a Win9X bug 
+                          where it doesn't supply a domain for logon script
+                          'net use' commands.
+       
+                          The way I do it here is by checking if the fully
+                          qualified username exists. This is rather reliant
+                          on winbind, but until we have a better method this
+                          will have to do 
+                       */
+               
+                       if ((smb_name) && (*smb_name)) { /* Don't do this for guests */
+                               char *user = NULL;
+                               if (asprintf(&user, "%s%s%s", client_domain,
+                                            lp_winbind_separator(), smb_name) < 0) {
+                                       DEBUG(0, ("make_user_info_map: asprintf() 
+failed!\n"));
+                                       return NT_STATUS_UNSUCCESSFUL;
+                               }
 
-                       DEBUG(5, ("make_user_info_map: testing for user %s\n", user));
+                               DEBUG(5, ("make_user_info_map: testing for user %s\n", 
+user));
                        
-                       if (Get_Pwnam(user) == NULL) {
-                               DEBUG(5, ("make_user_info_map: test for user %s 
failed\n", user));
-                               domain = lp_workgroup();
-                               DEBUG(5, ("make_user_info_map: trusted domain %s 
doesn't appear to exist, using %s\n", 
-                                         client_domain, domain));
+                               if (Get_Pwnam(user) == NULL) {
+                                       DEBUG(5, ("make_user_info_map: test for user 
+%s failed\n", user));
+                                       domain = lp_workgroup();
+                                       DEBUG(5, ("make_user_info_map: trusted domain 
+%s doesn't appear to exist, using %s\n", 
+                                                 client_domain, domain));
+                               } else {
+                                       DEBUG(5, ("make_user_info_map: using trusted 
+domain %s\n", domain));
+                               }
+                               SAFE_FREE(user);
                        } else {
-                               DEBUG(5, ("make_user_info_map: using trusted domain 
%s\n", domain));
-                       }
-                       SAFE_FREE(user);
+                               domain = lp_workgroup();
+                       };
+       
+                       return make_user_info(user_info, smb_name, internal_username,
+                                             client_domain, domain, wksta_name, 
+                                             lm_pwd, nt_pwd, plaintext, ntlmssp_flags,
+                                             encrypted);
                }
-       } else {
-               domain = lp_workgroup();
        }
        
-       return make_user_info(user_info, 
-                             smb_name, internal_username,
-                             client_domain, domain,
-                             wksta_name, 
-                             lm_pwd, nt_pwd,
-                             plaintext, 
-                             ntlmssp_flags, encrypted);
-       
+       /* if flow control ends up here, there must be something wrong */       
+       return NT_STATUS_UNSUCCESSFUL;
 }
 
 /****************************************************************************
@@ -245,6 +308,7 @@
                                     const uchar *nt_network_pwd, int nt_pwd_len)
 {
        BOOL ret;
+       NTSTATUS nt_status;
        DATA_BLOB lm_blob = data_blob(lm_network_pwd, lm_pwd_len);
        DATA_BLOB nt_blob = data_blob(nt_network_pwd, nt_pwd_len);
        DATA_BLOB plaintext_blob = data_blob(NULL, 0);
@@ -258,12 +322,14 @@
                auth_flags |= AUTH_FLAG_NTLMv2_RESP; 
        }
 
-       ret = make_user_info_map(user_info, 
-                                smb_name, client_domain, 
-                                wksta_name, 
-                                lm_blob, nt_blob,
-                                plaintext_blob, 
-                                auth_flags, True);
+       nt_status = make_user_info_map(user_info,
+                                     smb_name, client_domain, 
+                                  wksta_name, 
+                                     lm_blob, nt_blob,
+                                     plaintext_blob, 
+                                     auth_flags, True);
+       
+       ret = NT_STATUS_IS_OK(nt_status) ? True : False;
                
        data_blob_free(&lm_blob);
        data_blob_free(&nt_blob);
@@ -329,6 +395,7 @@
 
        {
                BOOL ret;
+               NTSTATUS nt_status;
                DATA_BLOB local_lm_blob = data_blob(local_lm_response, 
sizeof(local_lm_response));
                DATA_BLOB local_nt_blob = data_blob(local_nt_response, 
sizeof(local_nt_response));
                DATA_BLOB plaintext_blob = data_blob(NULL, 0);
@@ -338,14 +405,15 @@
                if (nt_interactive_pwd)
                        auth_flags |= AUTH_FLAG_NTLM_RESP; 
 
-               ret = make_user_info_map(user_info, 
-                                        smb_name, client_domain, 
-                                        wksta_name, 
-                                        local_lm_blob,
-                                        local_nt_blob,
-                                        plaintext_blob, 
-                                        auth_flags, True);
+               nt_status = make_user_info_map(user_info, 
+                                              smb_name, client_domain, 
+                                              wksta_name, 
+                                              local_lm_blob,
+                                              local_nt_blob,
+                                              plaintext_blob, 
+                                              auth_flags, True);
                
+               ret = NT_STATUS_IS_OK(nt_status) ? True : False;
                data_blob_free(&local_lm_blob);
                data_blob_free(&local_nt_blob);
                return ret;
@@ -366,7 +434,7 @@
 
        DATA_BLOB local_lm_blob;
        DATA_BLOB local_nt_blob;
-       BOOL ret = False;
+       NTSTATUS ret = NT_STATUS_UNSUCCESSFUL;
        uint32 auth_flags = AUTH_FLAG_NONE;
                        
        /*
@@ -397,25 +465,25 @@
        }
        
        ret = make_user_info_map(user_info, smb_name,
-                                client_domain, 
-                                get_remote_machine_name(),
-                                local_lm_blob,
-                                local_nt_blob,
-                                plaintext_password, 
-                                auth_flags, False);
+                                client_domain, 
+                                get_remote_machine_name(),
+                                local_lm_blob,
+                                local_nt_blob,
+                                plaintext_password, 
+                                auth_flags, False);
        
        data_blob_free(&local_lm_blob);
-       return ret;
+       return NT_STATUS_IS_OK(ret) ? True : False;
 }
 
 /****************************************************************************
  Create an auth_usersupplied_data structure
 ****************************************************************************/
 
-BOOL make_user_info_for_reply_enc(auth_usersupplied_info **user_info, 
-                                 const char *smb_name,
-                                 const char *client_domain, 
-                                 DATA_BLOB lm_resp, DATA_BLOB nt_resp)
+NTSTATUS make_user_info_for_reply_enc(auth_usersupplied_info **user_info, 
+                                      const char *smb_name,
+                                      const char *client_domain, 
+                                      DATA_BLOB lm_resp, DATA_BLOB nt_resp)
 {
        uint32 auth_flags = AUTH_FLAG_NONE;
 
@@ -450,14 +518,17 @@
        DATA_BLOB nt_blob = data_blob(NULL, 0);
        DATA_BLOB plaintext_blob = data_blob(NULL, 0);
        uint32 auth_flags = AUTH_FLAG_NONE;
+       NTSTATUS nt_status;
 
-       return make_user_info(user_info, 
+       nt_status = make_user_info(user_info, 
                              "","", 
                              "","", 
                              "", 
                              nt_blob, lm_blob,
                              plaintext_blob, 
                              auth_flags, True);
+                             
+       return NT_STATUS_IS_OK(nt_status) ? True : False;
 }
 
 /****************************************************************************
@@ -633,7 +704,14 @@
                return NT_STATUS_OK;
        }
 
-       usr = getpwuid_alloc(uid);
+       /*
+        * This is _essential_ to prevent occasional segfaults when
+        * winbind can't find uid -> username mapping
+        */
+       if (!(usr = getpwuid_alloc(uid))) {
+               DEBUG(0, ("Couldn't find passdb structure for UID = %d ! Aborting.\n", 
+uid));
+               return NT_STATUS_NO_SUCH_USER;
+       };
        
        n_unix_groups = groups_max();
        if ((*unix_groups = malloc( sizeof(gid_t) * groups_max() ) ) == NULL) {
@@ -840,7 +918,7 @@
           trusted domains, and verify that the SID 
           matches.
        */
-
+       
        sid_copy(&user_sid, &info3->dom_sid.sid);
        if (!sid_append_rid(&user_sid, info3->user_rid)) {
                return NT_STATUS_INVALID_PARAMETER;
@@ -860,7 +938,7 @@
                /* If the server didn't give us one, just use the one we sent them */
                domain = domain;
        }
-
+       
        if (winbind_sid_to_uid(&uid, &user_sid) 
            && winbind_sid_to_gid(&gid, &group_sid) 
            && ((passwd = getpwuid_alloc(uid)))) {
@@ -984,7 +1062,7 @@
                if (!sid_append_rid(&all_group_SIDs[i+n_lgroupSIDs], 
info3->gids[i].g_rid)) {
                        nt_status = NT_STATUS_INVALID_PARAMETER;
                        DEBUG(3,("create_nt_token_info3: could not append additional 
group rid 0x%x\n",
-                               info3->gids[i].g_rid));                 
+                               info3->gids[i].g_rid));
                        SAFE_FREE(lgroupSIDs);
                        return nt_status;
                }
Index: libsmb/cliconnect.c
===================================================================
RCS file: /cvsroot/samba/source/libsmb/cliconnect.c,v
retrieving revision 1.97
diff -u -r1.97 cliconnect.c
--- libsmb/cliconnect.c 30 Aug 2002 06:59:52 -0000      1.97
+++ libsmb/cliconnect.c 2 Sep 2002 10:37:36 -0000
@@ -1003,7 +1003,7 @@
          * about this and accounts for those four bytes.
          * CRH.
          */
-        len -= 4;
+       len -= 4;
        _smb_setlen(cli->outbuf,len);
        SCVAL(cli->outbuf,0,0x81);
 
Index: libsmb/namequery.c
===================================================================
RCS file: /cvsroot/samba/source/libsmb/namequery.c,v
retrieving revision 1.111
diff -u -r1.111 namequery.c
--- libsmb/namequery.c  16 Aug 2002 00:25:47 -0000      1.111
+++ libsmb/namequery.c  2 Sep 2002 10:37:39 -0000
@@ -839,7 +839,7 @@
                          } else {
 
                                  /* Store negative lookup result */
-
+                                 DEBUG(100, ("Storing INVALID name %s of type %d in 
+namecache\n", name, name_type));
                                  namecache_store(name, name_type, 0, NULL);
                          }
                  }
@@ -915,7 +915,10 @@
   }
  
   /* Save in name cache */
-
+  for (i = 0; i < *return_count && DEBUGLEVEL == 100; i++)
+    DEBUG(100, ("Storing VALID name %s of type %d (ip: %s)\n", name,
+                name_type, inet_ntoa(*return_iplist[i])));
+    
   namecache_store(name, name_type, *return_count, *return_iplist);
 
   /* Display some debugging info */
Index: rpc_client/cli_lsarpc.c
===================================================================
RCS file: /cvsroot/samba/source/rpc_client/cli_lsarpc.c,v
retrieving revision 1.68
diff -u -r1.68 cli_lsarpc.c
--- rpc_client/cli_lsarpc.c     12 Aug 2002 13:40:59 -0000      1.68
+++ rpc_client/cli_lsarpc.c     2 Sep 2002 10:37:50 -0000
@@ -648,7 +648,7 @@
        /* Marshall data and send request */
 
        /* 64k is enough for about 2000 trusted domains */
-        init_q_enum_trust_dom(&q, pol, *enum_ctx, 0x10000);
+       init_q_enum_trust_dom(&q, pol, *enum_ctx, 0x10000);
 
        if (!lsa_io_q_enum_trust_dom("", &q, &qbuf, 0) ||
            !rpc_api_pipe_req(cli, LSA_ENUMTRUSTDOM, &qbuf, &rbuf)) {
Index: rpc_parse/parse_samr.c
===================================================================
RCS file: /cvsroot/samba/source/rpc_parse/parse_samr.c,v
retrieving revision 1.155
diff -u -r1.155 parse_samr.c
--- rpc_parse/parse_samr.c      15 Aug 2002 19:40:34 -0000      1.155
+++ rpc_parse/parse_samr.c      2 Sep 2002 10:37:56 -0000
@@ -1356,18 +1356,12 @@
 
        r_u->next_idx = next_idx;
 
-       if (num_sam_entries != 0) {
-               r_u->ptr_entries1 = 1;
-               r_u->ptr_entries2 = 1;
-               r_u->num_entries2 = num_sam_entries;
-               r_u->num_entries3 = num_sam_entries;
+       r_u->ptr_entries1 = 1;
+       r_u->ptr_entries2 = 2;
+       r_u->num_entries2 = num_sam_entries;
+       r_u->num_entries3 = num_sam_entries;
 
-               r_u->num_entries4 = num_sam_entries;
-       } else {
-               r_u->ptr_entries1 = 0;
-               r_u->num_entries2 = num_sam_entries;
-               r_u->ptr_entries2 = 1;
-       }
+       r_u->num_entries4 = num_sam_entries;
 }
 
 /*******************************************************************
Index: rpc_server/srv_lsa_nt.c
===================================================================
RCS file: /cvsroot/samba/source/rpc_server/srv_lsa_nt.c,v
retrieving revision 1.59
diff -u -r1.59 srv_lsa_nt.c
--- rpc_server/srv_lsa_nt.c     30 Jul 2002 17:23:07 -0000      1.59
+++ rpc_server/srv_lsa_nt.c     2 Sep 2002 10:37:58 -0000
@@ -473,6 +473,8 @@
        /*
         * preferred length is set to 5 as a "our" preferred length
         * nt sets this parameter to 2
+        * update (20.08.2002): it's not preferred length, but preferred size!
+        * it needs further investigation how to optimally choose this value
         */
        uint32 max_num_domains = q_u->preferred_len < 5 ? q_u->preferred_len : 10;
        TRUSTDOM **trust_doms;
Index: rpc_server/srv_samr.c
===================================================================
RCS file: /cvsroot/samba/source/rpc_server/srv_samr.c,v
retrieving revision 1.140
diff -u -r1.140 srv_samr.c
--- rpc_server/srv_samr.c       6 Aug 2002 18:02:56 -0000       1.140
+++ rpc_server/srv_samr.c       2 Sep 2002 10:38:00 -0000
@@ -202,7 +202,7 @@
 
        ZERO_STRUCT(q_u);
        ZERO_STRUCT(r_u);
-
+       
        /* grab the samr open */
        if(!samr_io_q_enum_dom_users("", &q_u, data, 0)) {
                DEBUG(0,("api_samr_enum_dom_users: unable to unmarshall 
SAMR_Q_ENUM_DOM_USERS.\n"));
Index: smbd/sesssetup.c
===================================================================
RCS file: /cvsroot/samba/source/smbd/sesssetup.c,v
retrieving revision 1.68
diff -u -r1.68 sesssetup.c
--- smbd/sesssetup.c    31 Aug 2002 06:59:00 -0000      1.68
+++ smbd/sesssetup.c    2 Sep 2002 10:38:02 -0000
@@ -439,14 +439,14 @@
                auth_flags |= AUTH_FLAG_NTLM_RESP;
        } else if (nthash.length > 24) {
                auth_flags |= AUTH_FLAG_NTLMv2_RESP;
-       }
+       };
+
+       nt_status = make_user_info_map(&user_info, user, workgroup, machine, 
+                                      lmhash, nthash, plaintext_password, 
+                                      auth_flags, True);
 
-       if (!make_user_info_map(&user_info, 
-                               user, workgroup, 
-                               machine, 
-                               lmhash, nthash,
-                               plaintext_password, 
-                               auth_flags, True)) {
+       /* it looks a bit weird, but this function returns int type... */
+       if (!NT_STATUS_IS_OK(nt_status)) {
                return ERROR_NT(NT_STATUS_NO_MEMORY);
        }
 
@@ -621,7 +621,7 @@
        NTSTATUS nt_status;
 
        BOOL doencrypt = global_encrypted_passwords_negotiated;
-
+       
        START_PROFILE(SMBsesssetupX);
 
        ZERO_STRUCT(lm_resp);
@@ -776,11 +776,9 @@
                nt_status = check_guest_password(&server_info);
 
        } else if (doencrypt) {
-               if (!make_user_info_for_reply_enc(&user_info, 
-                                                 user, domain, 
-                                                 lm_resp, nt_resp)) {
-                       nt_status = NT_STATUS_NO_MEMORY;
-               } else {
+               nt_status = make_user_info_for_reply_enc(&user_info, user, domain,
+                                                        lm_resp, nt_resp);
+               if (NT_STATUS_IS_OK(nt_status)) {
                        nt_status = 
negprot_global_auth_context->check_ntlm_password(negprot_global_auth_context, 
                                                                                     
user_info, 
                                                                                     
&server_info);
Index: utils/net_rpc.c
===================================================================
RCS file: /cvsroot/samba/source/utils/net_rpc.c,v
retrieving revision 1.33
diff -u -r1.33 net_rpc.c
--- utils/net_rpc.c     28 Aug 2002 10:34:28 -0000      1.33
+++ utils/net_rpc.c     2 Sep 2002 10:38:05 -0000
@@ -1972,6 +1972,12 @@
                        
                        d_printf("%s%s%s\n", trusted_dom_names[i], padding, ascii_sid);
                };
+               
+               /*
+                * in case of no trusted domains say something rather
+                * than just display blank line
+                */
+               if (!num_domains) d_printf("none\n");
 
        } while (NT_STATUS_EQUAL(nt_status, STATUS_MORE_ENTRIES));
 
@@ -2025,7 +2031,7 @@
         
        enum_ctx = 0;   /* reset enumeration context from last enumeration */
        do {
-                       
+               
                nt_status = cli_samr_enum_dom_users(cli, mem_ctx, &domain_hnd,
                                                    &enum_ctx, ACB_DOMTRUST, 0xffff,
                                                    &trusting_dom_names, 
&trusting_dom_rids,
@@ -2037,7 +2043,7 @@
                };
                
                for (i = 0; i < num_domains; i++) {
-
+               
                        /*
                         * get each single domain's sid (do we _really_ need this ?):
                         *  1) connect to domain's pdc
@@ -2075,6 +2081,8 @@
                                d_printf("domain controller is not responding\n");
                        };
                };
+               
+               if (!num_domains) d_printf("none\n");
                
        } while (NT_STATUS_EQUAL(nt_status, STATUS_MORE_ENTRIES));
 

Reply via email to