diff options
author | Jeremy Allison <jra@samba.org> | 1998-05-06 01:34:51 +0000 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 1998-05-06 01:34:51 +0000 |
commit | a2bddb20ed078c3e1b9cb60a7420b3d107898f52 (patch) | |
tree | 4d79e33ce1cb534d287aa9ccbe8e6c10aa0ceb9b /source3/smbd/server.c | |
parent | 19f76f391b97b405879fd8574e711a6d59e4e60c (diff) | |
download | samba-a2bddb20ed078c3e1b9cb60a7420b3d107898f52.tar.gz samba-a2bddb20ed078c3e1b9cb60a7420b3d107898f52.tar.bz2 samba-a2bddb20ed078c3e1b9cb60a7420b3d107898f52.zip |
Fixes for the %U and %G problems people have reported.
Essentially, multiple session_setup_and_X's may be done
to an smbd. As there is only one global variable containing
the requested connection name (sessionsetup_user), then any
subsequent sessionsetups overwrite this name (causing %U
and %G to get the wrong name). This is particularly common
when an NT client does a null session setup to get a
browse list after the user has connected, but before
a share has been mounted.
These changes store the requested_name in the vuid structure
(so this only really works for user level and above security)
and copies this name back into the global variable before
the standard_sub call.
Jeremy.
(This used to be commit b5187ad6a3b3af9fbbeee8bced0ab16b41e9825b)
Diffstat (limited to 'source3/smbd/server.c')
-rw-r--r-- | source3/smbd/server.c | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/source3/smbd/server.c b/source3/smbd/server.c index b6d2b82705..29ee8c9fc5 100644 --- a/source3/smbd/server.c +++ b/source3/smbd/server.c @@ -3537,7 +3537,7 @@ int make_connection(char *service,char *user,char *password, int pwlen, char *de { pstring s; pstrcpy(s,lp_pathname(snum)); - standard_sub(cnum,s); + standard_sub(cnum,s,vuid); string_set(&pcon->connectpath,s); DEBUG(3,("Connect path is %s\n",s)); } @@ -3574,7 +3574,7 @@ int make_connection(char *service,char *user,char *password, int pwlen, char *de { pstring cmd; pstrcpy(cmd,lp_rootpreexec(SNUM(cnum))); - standard_sub(cnum,cmd); + standard_sub(cnum,cmd,vuid); DEBUG(5,("cmd=%s\n",cmd)); smbrun(cmd,NULL,False); } @@ -3628,7 +3628,7 @@ int make_connection(char *service,char *user,char *password, int pwlen, char *de { pstring cmd; pstrcpy(cmd,lp_preexec(SNUM(cnum))); - standard_sub(cnum,cmd); + standard_sub(cnum,cmd,vuid); smbrun(cmd,NULL,False); } @@ -4222,7 +4222,7 @@ void close_cnum(int cnum, uint16 vuid) { pstring cmd; strcpy(cmd,lp_postexec(SNUM(cnum))); - standard_sub(cnum,cmd); + standard_sub(cnum,cmd,vuid); smbrun(cmd,NULL,False); unbecome_user(); } @@ -4233,7 +4233,7 @@ void close_cnum(int cnum, uint16 vuid) { pstring cmd; strcpy(cmd,lp_rootpostexec(SNUM(cnum))); - standard_sub(cnum,cmd); + standard_sub(cnum,cmd,vuid); smbrun(cmd,NULL,False); } @@ -4338,8 +4338,10 @@ void exit_server(char *reason) /**************************************************************************** do some standard substitutions in a string ****************************************************************************/ -void standard_sub(int cnum,char *str) +void standard_sub(int cnum,char *str,uint16 vuid) { + user_struct *vuser = get_valid_user_struct(vuid); + if (VALID_CNUM(cnum)) { char *p, *s, *home; @@ -4368,6 +4370,9 @@ void standard_sub(int cnum,char *str) } } } + if(vuser != NULL) + pstrcpy( sesssetup_user, vuser->requested_name); + standard_sub_basic(str); } |