r11655: Two small fixes
authorGerald Carter <jerry@samba.org>
Thu, 10 Nov 2005 21:10:24 +0000 (21:10 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 16:05:23 +0000 (11:05 -0500)
* remove redundant call to sub_set_smb_name() in session setup code.
* Fix lockup when running 'wbinfo -t' on a Samba PDC.  Cause
  was new authenticated session setup from winbindd which
  resulted in a mangled username (machine_) that was not found
  in the local files and so was queiued up to nss_winbindd.
  Deadlock....
  So now make sure to keep the trailing '$' for machine account
  names when calling sub_set_smb_name().
(This used to be commit b0a2d43b603c2e230da6ada73587696605102e8f)

source3/lib/substitute.c
source3/smbd/sesssetup.c

index 884f038e6db89f20dcd68d1b1633c1c1250d3ce3..4d22518230ff01c216dadc346b05801b25fd2e07 100644 (file)
@@ -107,15 +107,37 @@ const char* get_local_machine_name(void)
 void sub_set_smb_name(const char *name)
 {
        fstring tmp;
+       int len;
+       BOOL is_machine_account = False;
 
        /* don't let anonymous logins override the name */
        if (! *name)
                return;
 
-       fstrcpy(tmp,name);
-       trim_char(tmp,' ',' ');
-       strlower_m(tmp);
-       alpha_strcpy(smb_user_name,tmp,SAFE_NETBIOS_CHARS,sizeof(smb_user_name)-1);
+
+       fstrcpy( tmp, name );
+       trim_char( tmp, ' ', ' ' );
+       strlower_m( tmp );
+
+       len = strlen( tmp );
+
+       if ( len == 0 )
+               return;
+
+       /* long story but here goes....we have to allow usernames
+          ending in '$' as they are valid machine account names.
+          So check for a machine account and re-add the '$'
+          at the end after the call to alpha_strcpy().   --jerry  */
+          
+       if ( tmp[len-1] == '$' )
+               is_machine_account = True;
+       
+       alpha_strcpy( smb_user_name, tmp, SAFE_NETBIOS_CHARS, sizeof(smb_user_name)-1 );
+
+       if ( is_machine_account ) {
+               len = strlen( smb_user_name );
+               smb_user_name[len-1] = '$';
+       }
 }
 
 char* sub_get_smb_name( void )
index 34b161c92ff968393d30527fc3844b5d8a4acb18..9ac258cb5e9dd68e309aa30cbc66903c21817f89 100644 (file)
@@ -954,9 +954,6 @@ int reply_sesssetup_and_X(connection_struct *conn, char *inbuf,char *outbuf,
                        return ERROR_NT(NT_STATUS_LOGON_FAILURE);
                }
                fstrcpy(sub_user, user);
-
-               /* setup the string used by %U */
-               sub_set_smb_name(user);
        } else {
                fstrcpy(sub_user, lp_guestaccount());
        }