diff options
Diffstat (limited to 'source/smbd/uid.c')
-rw-r--r-- | source/smbd/uid.c | 35 |
1 files changed, 30 insertions, 5 deletions
diff --git a/source/smbd/uid.c b/source/smbd/uid.c index bbaf73eef06..6b05cfda2f4 100644 --- a/source/smbd/uid.c +++ b/source/smbd/uid.c @@ -30,7 +30,17 @@ extern struct current_user current_user; ****************************************************************************/ BOOL become_user(connection_struct *conn, uint16 vuid) { - user_struct *vuser = get_valid_user_struct(vuid); + vuser_key key; + key.pid = getpid(); + key.vuid = vuid; + return become_userk(conn, &key); +} +/**************************************************************************** + Become the user of a connection number. +****************************************************************************/ +BOOL become_userk(connection_struct *conn, const vuser_key *key) +{ + user_struct *vuser = NULL; int snum; gid_t gid = -1; uid_t uid = -1; @@ -55,13 +65,21 @@ BOOL become_user(connection_struct *conn, uint16 vuid) (current_user.uid == conn->uid)) { DEBUG(4,("Skipping become_user - already user\n")); + return(True); } - else if ((current_user.conn == conn) && - (vuser != NULL) && (current_user.vuid == vuid) && + + vuser = get_valid_user_struct(key); + + if ((current_user.conn == conn) && + (vuser != NULL) && + (current_user.key.vuid == key->vuid) && + (current_user.key.pid == key->pid) && (current_user.uid == vuser->uid)) { DEBUG(4,("Skipping become_user - already user\n")); + vuid_free_user_struct(vuser); + safe_free(vuser); return(True); } @@ -70,7 +88,11 @@ BOOL become_user(connection_struct *conn, uint16 vuid) snum = SNUM(conn); if((vuser != NULL) && !check_vuser_ok(&conn->uid_cache, vuser, snum)) + { + vuid_free_user_struct(vuser); + safe_free(vuser); return False; + } if (conn->force_user || lp_security() == SEC_SHARE || @@ -81,7 +103,7 @@ BOOL become_user(connection_struct *conn, uint16 vuid) ngroups = conn->ngroups; } else { if (!vuser) { - DEBUG(2,("Invalid vuid used %d\n",vuid)); + DEBUG(2,("Invalid vuid used %d\n",key->vuid)); return(False); } uid = vuser->uid; @@ -118,7 +140,10 @@ BOOL become_user(connection_struct *conn, uint16 vuid) } } - return become_unix_sec_ctx(vuid, conn, uid, gid, ngroups, groups); + vuid_free_user_struct(vuser); + safe_free(vuser); + + return become_unix_sec_ctx(key, conn, uid, gid, ngroups, groups); } /**************************************************************************** |