diff options
Diffstat (limited to 'source3/smbd/service.c')
-rw-r--r-- | source3/smbd/service.c | 59 |
1 files changed, 26 insertions, 33 deletions
diff --git a/source3/smbd/service.c b/source3/smbd/service.c index 4d55977ad2..f4f6e9a45b 100644 --- a/source3/smbd/service.c +++ b/source3/smbd/service.c @@ -527,12 +527,11 @@ NTSTATUS set_conn_force_user_group(connection_struct *conn, int snum) connecting user if appropriate. ****************************************************************************/ -static connection_struct *make_connection_snum(struct smbd_server_connection *sconn, +static NTSTATUS make_connection_snum(struct smbd_server_connection *sconn, connection_struct *conn, int snum, user_struct *vuser, DATA_BLOB password, - const char *pdev, - NTSTATUS *pstatus) + const char *pdev) { struct smb_filename *smb_fname_cpath = NULL; fstring dev; @@ -545,11 +544,11 @@ static connection_struct *make_connection_snum(struct smbd_server_connection *sc fstrcpy(dev, pdev); - *pstatus = share_sanity_checks(sconn->remote_address, + status = share_sanity_checks(sconn->remote_address, sconn->remote_hostname, snum, dev); - if (NT_STATUS_IS_ERR(*pstatus)) { + if (NT_STATUS_IS_ERR(status)) { goto err_root_exit; } @@ -562,7 +561,6 @@ static connection_struct *make_connection_snum(struct smbd_server_connection *sc if (!NT_STATUS_IS_OK(status)) { DEBUG(1, ("create_connection_session_info failed: %s\n", nt_errstr(status))); - *pstatus = status; goto err_root_exit; } @@ -602,8 +600,7 @@ static connection_struct *make_connection_snum(struct smbd_server_connection *sc status = set_conn_force_user_group(conn, snum); if (!NT_STATUS_IS_OK(status)) { - *pstatus = status; - return NULL; + goto err_root_exit; } conn->vuid = (vuser != NULL) ? vuser->vuid : UID_FIELD_INVALID; @@ -618,13 +615,13 @@ static connection_struct *make_connection_snum(struct smbd_server_connection *sc conn->session_info->info->domain_name, lp_pathname(snum)); if (!s) { - *pstatus = NT_STATUS_NO_MEMORY; + status = NT_STATUS_NO_MEMORY; goto err_root_exit; } if (!set_conn_connectpath(conn,s)) { TALLOC_FREE(s); - *pstatus = NT_STATUS_NO_MEMORY; + status = NT_STATUS_NO_MEMORY; goto err_root_exit; } DEBUG(3,("Connect path is '%s' for service [%s]\n",s, @@ -650,7 +647,7 @@ static connection_struct *make_connection_snum(struct smbd_server_connection *sc "denied due to security " "descriptor.\n", lp_servicename(snum))); - *pstatus = NT_STATUS_ACCESS_DENIED; + status = NT_STATUS_ACCESS_DENIED; goto err_root_exit; } else { conn->read_only = True; @@ -661,7 +658,7 @@ static connection_struct *make_connection_snum(struct smbd_server_connection *sc if (!smbd_vfs_init(conn)) { DEBUG(0, ("vfs_init failed for service %s\n", lp_servicename(snum))); - *pstatus = NT_STATUS_BAD_NETWORK_NAME; + status = NT_STATUS_BAD_NETWORK_NAME; goto err_root_exit; } @@ -680,7 +677,7 @@ static connection_struct *make_connection_snum(struct smbd_server_connection *sc DEBUG(1, ("Max connections (%d) exceeded for %s\n", lp_max_connections(snum), lp_servicename(snum))); - *pstatus = NT_STATUS_INSUFFICIENT_RESOURCES; + status = NT_STATUS_INSUFFICIENT_RESOURCES; goto err_root_exit; } @@ -689,7 +686,7 @@ static connection_struct *make_connection_snum(struct smbd_server_connection *sc */ if (!claim_connection(conn, lp_servicename(snum))) { DEBUG(1, ("Could not store connections entry\n")); - *pstatus = NT_STATUS_INTERNAL_DB_ERROR; + status = NT_STATUS_INTERNAL_DB_ERROR; goto err_root_exit; } claimed_connection = true; @@ -700,7 +697,7 @@ static connection_struct *make_connection_snum(struct smbd_server_connection *sc if (SMB_VFS_CONNECT(conn, lp_servicename(snum), conn->session_info->unix_info->unix_name) < 0) { DEBUG(0,("make_connection: VFS make connection failed!\n")); - *pstatus = NT_STATUS_UNSUCCESSFUL; + status = NT_STATUS_UNSUCCESSFUL; goto err_root_exit; } @@ -745,7 +742,7 @@ static connection_struct *make_connection_snum(struct smbd_server_connection *sc if (ret != 0 && lp_rootpreexec_close(snum)) { DEBUG(1,("root preexec gave %d - failing " "connection\n", ret)); - *pstatus = NT_STATUS_ACCESS_DENIED; + status = NT_STATUS_ACCESS_DENIED; goto err_root_exit; } } @@ -754,7 +751,7 @@ static connection_struct *make_connection_snum(struct smbd_server_connection *sc if (!change_to_user(conn, conn->vuid)) { /* No point continuing if they fail the basic checks */ DEBUG(0,("Can't become connected user!\n")); - *pstatus = NT_STATUS_LOGON_FAILURE; + status = NT_STATUS_LOGON_FAILURE; goto err_root_exit; } @@ -782,7 +779,7 @@ static connection_struct *make_connection_snum(struct smbd_server_connection *sc if (ret != 0 && lp_preexec_close(snum)) { DEBUG(1,("preexec gave %d - failing connection\n", ret)); - *pstatus = NT_STATUS_ACCESS_DENIED; + status = NT_STATUS_ACCESS_DENIED; goto err_root_exit; } } @@ -814,7 +811,7 @@ static connection_struct *make_connection_snum(struct smbd_server_connection *sc "for service %s, path %s\n", lp_servicename(snum), conn->connectpath)); - *pstatus = NT_STATUS_BAD_NETWORK_NAME; + status = NT_STATUS_BAD_NETWORK_NAME; goto err_root_exit; } } @@ -830,7 +827,6 @@ static connection_struct *make_connection_snum(struct smbd_server_connection *sc status = create_synthetic_smb_fname(talloc_tos(), conn->connectpath, NULL, NULL, &smb_fname_cpath); if (!NT_STATUS_IS_OK(status)) { - *pstatus = status; goto err_root_exit; } @@ -852,7 +848,7 @@ static connection_struct *make_connection_snum(struct smbd_server_connection *sc conn->connectpath, lp_servicename(snum), strerror(errno) )); } - *pstatus = NT_STATUS_BAD_NETWORK_NAME; + status = NT_STATUS_BAD_NETWORK_NAME; goto err_root_exit; } conn->base_share_dev = smb_fname_cpath->st.st_ex_dev; @@ -884,9 +880,10 @@ static connection_struct *make_connection_snum(struct smbd_server_connection *sc dbgtext( "(pid %d)\n", (int)sys_getpid() ); } - return(conn); + return status; err_root_exit: + TALLOC_FREE(smb_fname_cpath); /* We must exit this function as root. */ if (geteuid() != 0) { @@ -899,7 +896,7 @@ static connection_struct *make_connection_snum(struct smbd_server_connection *sc if (claimed_connection) { yield_connection(conn, lp_servicename(snum)); } - return NULL; + return status; } /**************************************************************************** @@ -912,21 +909,19 @@ static connection_struct *make_connection_smb1(struct smbd_server_connection *sc const char *pdev, NTSTATUS *pstatus) { - connection_struct *ret_conn = NULL; connection_struct *conn = conn_new(sconn); if (!conn) { DEBUG(0,("make_connection_smb1: Couldn't find free connection.\n")); *pstatus = NT_STATUS_INSUFFICIENT_RESOURCES; return NULL; } - ret_conn = make_connection_snum(sconn, + *pstatus = make_connection_snum(sconn, conn, snum, vuser, password, - pdev, - pstatus); - if (ret_conn != conn) { + pdev); + if (!NT_STATUS_IS_OK(*pstatus)) { conn_free(conn); return NULL; } @@ -945,7 +940,6 @@ connection_struct *make_connection_smb2(struct smbd_server_connection *sconn, const char *pdev, NTSTATUS *pstatus) { - connection_struct *ret_conn = NULL; connection_struct *conn = conn_new(sconn); if (!conn) { DEBUG(0,("make_connection_smb2: Couldn't find free connection.\n")); @@ -953,14 +947,13 @@ connection_struct *make_connection_smb2(struct smbd_server_connection *sconn, return NULL; } conn->cnum = tcon->tid; - ret_conn = make_connection_snum(sconn, + *pstatus = make_connection_snum(sconn, conn, tcon->snum, vuser, password, - pdev, - pstatus); - if (ret_conn != conn) { + pdev); + if (!NT_STATUS_IS_OK(*pstatus)) { conn_free(conn); return NULL; } |