connection_struct *make_connection(struct smb_request *req, NTTIME now, const char *service_in, const char *pdev, uint64_t vuid, NTSTATUS *status) { struct smbd_server_connection *sconn = req->sconn; uid_t euid; struct user_struct *vuser = NULL; char *service = NULL; fstring dev; int snum = -1; fstrcpy(dev, pdev); /* This must ONLY BE CALLED AS ROOT. As it exits this function as * root. */ if (!non_root_mode() && (euid = geteuid()) != 0) { DEBUG(0,("make_connection: PANIC ERROR. Called as nonroot " "(%u)\n", (unsigned int)euid )); smb_panic("make_connection: PANIC ERROR. Called as nonroot\n"); } if (conn_num_open(sconn) > 2047) { *status = NT_STATUS_INSUFF_SERVER_RESOURCES; return NULL; } vuser = get_valid_user_struct(sconn, vuid); if (!vuser) { DEBUG(1,("make_connection: refusing to connect with " "no session setup\n")); *status = NT_STATUS_ACCESS_DENIED; return NULL; } /* Logic to try and connect to the correct [homes] share, preferably without too many getpwnam() lookups. This is particulary nasty for winbind usernames, where the share name isn't the same as unix username. The snum of the homes share is stored on the vuser at session setup time. */ if (strequal(service_in,HOMES_NAME)) { if (vuser->homes_snum == -1) { DEBUG(2, ("[homes] share not available for " "this user because it was not found " "or created at session setup " "time\n")); *status = NT_STATUS_BAD_NETWORK_NAME; return NULL; } DEBUG(5, ("making a connection to [homes] service " "created at session setup time\n")); return make_connection_smb1(req, now, vuser->homes_snum, vuser, dev, status); } else if ((vuser->homes_snum != -1) && strequal(service_in, lp_servicename(talloc_tos(), vuser->homes_snum))) { DEBUG(5, ("making a connection to 'homes' service [%s] " "created at session setup time\n", service_in)); return make_connection_smb1(req, now, vuser->homes_snum, vuser, dev, status); } service = talloc_strdup(talloc_tos(), service_in); if (!service) { *status = NT_STATUS_NO_MEMORY; return NULL; } if (!strlower_m(service)) { DEBUG(2, ("strlower_m %s failed\n", service)); *status = NT_STATUS_INVALID_PARAMETER; return NULL; } snum = find_service(talloc_tos(), service, &service); if (!service) { *status = NT_STATUS_NO_MEMORY; return NULL; } if (snum < 0) { if (strequal(service,"IPC$") || (lp_enable_asu_support() && strequal(service,"ADMIN$"))) { DEBUG(3,("refusing IPC connection to %s\n", service)); *status = NT_STATUS_ACCESS_DENIED; return NULL; } DEBUG(3,("%s (%s) couldn't find service %s\n", get_remote_machine_name(), tsocket_address_string( sconn->remote_address, talloc_tos()), service)); *status = NT_STATUS_BAD_NETWORK_NAME; return NULL; } /* Handle non-Dfs clients attempting connections to msdfs proxy */ if (lp_host_msdfs() && (*lp_msdfs_proxy(talloc_tos(), snum) != '\0')) { DEBUG(3, ("refusing connection to dfs proxy share '%s' " "(pointing to %s)\n", service, lp_msdfs_proxy(talloc_tos(), snum))); *status = NT_STATUS_BAD_NETWORK_NAME; return NULL; } DEBUG(5, ("making a connection to 'normal' service %s\n", service)); return make_connection_smb1(req, now, snum, vuser, dev, status); }
connection_struct *make_connection(struct smbd_server_connection *sconn, const char *service_in, DATA_BLOB password, const char *pdev, uint16 vuid, NTSTATUS *status) { uid_t euid; user_struct *vuser = NULL; fstring service; fstring dev; int snum = -1; char addr[INET6_ADDRSTRLEN]; fstrcpy(dev, pdev); /* This must ONLY BE CALLED AS ROOT. As it exits this function as * root. */ if (!non_root_mode() && (euid = geteuid()) != 0) { DEBUG(0,("make_connection: PANIC ERROR. Called as nonroot " "(%u)\n", (unsigned int)euid )); smb_panic("make_connection: PANIC ERROR. Called as nonroot\n"); } if (conn_num_open(sconn) > 2047) { *status = NT_STATUS_INSUFF_SERVER_RESOURCES; return NULL; } if(lp_security() != SEC_SHARE) { vuser = get_valid_user_struct(sconn, vuid); if (!vuser) { DEBUG(1,("make_connection: refusing to connect with " "no session setup\n")); *status = NT_STATUS_ACCESS_DENIED; return NULL; } } /* Logic to try and connect to the correct [homes] share, preferably without too many getpwnam() lookups. This is particulary nasty for winbind usernames, where the share name isn't the same as unix username. The snum of the homes share is stored on the vuser at session setup time. */ if (strequal(service_in,HOMES_NAME)) { if(lp_security() != SEC_SHARE) { DATA_BLOB no_pw = data_blob_null; if (vuser->homes_snum == -1) { DEBUG(2, ("[homes] share not available for " "this user because it was not found " "or created at session setup " "time\n")); *status = NT_STATUS_BAD_NETWORK_NAME; return NULL; } DEBUG(5, ("making a connection to [homes] service " "created at session setup time\n")); return make_connection_snum(sconn, vuser->homes_snum, vuser, no_pw, dev, status); } else { /* Security = share. Try with * current_user_info.smb_name as the username. */ if (*current_user_info.smb_name) { fstring unix_username; fstrcpy(unix_username, current_user_info.smb_name); map_username(sconn, unix_username); snum = find_service(unix_username); } if (snum != -1) { DEBUG(5, ("making a connection to 'homes' " "service %s based on " "security=share\n", service_in)); return make_connection_snum(sconn, snum, NULL, password, dev, status); } } } else if ((lp_security() != SEC_SHARE) && (vuser->homes_snum != -1) && strequal(service_in, lp_servicename(vuser->homes_snum))) { DATA_BLOB no_pw = data_blob_null; DEBUG(5, ("making a connection to 'homes' service [%s] " "created at session setup time\n", service_in)); return make_connection_snum(sconn, vuser->homes_snum, vuser, no_pw, dev, status); } fstrcpy(service, service_in); strlower_m(service); snum = find_service(service); if (snum < 0) { if (strequal(service,"IPC$") || (lp_enable_asu_support() && strequal(service,"ADMIN$"))) { DEBUG(3,("refusing IPC connection to %s\n", service)); *status = NT_STATUS_ACCESS_DENIED; return NULL; } DEBUG(3,("%s (%s) couldn't find service %s\n", get_remote_machine_name(), client_addr(get_client_fd(),addr,sizeof(addr)), service)); *status = NT_STATUS_BAD_NETWORK_NAME; return NULL; } /* Handle non-Dfs clients attempting connections to msdfs proxy */ if (lp_host_msdfs() && (*lp_msdfs_proxy(snum) != '\0')) { DEBUG(3, ("refusing connection to dfs proxy share '%s' " "(pointing to %s)\n", service, lp_msdfs_proxy(snum))); *status = NT_STATUS_BAD_NETWORK_NAME; return NULL; } DEBUG(5, ("making a connection to 'normal' service %s\n", service)); return make_connection_snum(sconn, snum, vuser, password, dev, status); }
static int timeout_processing(int deadtime, int threadid) { //0703 extern int Client; //0703 static time_t last_keepalive_sent_time = 0; static time_t last_idle_closed_check[NUM_SMBTHREAD] = {0}; time_t t; int allidle = True; //0703 extern int keepalive; if (_forceclosethread[threadid] ==1) return 0; //force closed this thread ....By Ron 3/11/2002 //0705 *last_timeout_processing_time = t = (msclock()/1000); t = (msclock()/1000); //0703 if(last_keepalive_sent_time == 0) // last_keepalive_sent_time = t; if(last_idle_closed_check[threadid] == 0) last_idle_closed_check[threadid] = t; /* automatic timeout if all connections are closed */ //0705 if (conn_num_open()==0 && (t - last_idle_closed_check) >= IDLE_CLOSED_TIMEOUT) // DEBUG( 2, ( "Closing idle connection\n" ) ); // return False; //0705 else // last_idle_closed_check = t; if (conn_num_open(threadid)==0 && (t - last_idle_closed_check[threadid]) >= IDLE_CLOSED_TIMEOUT) { // DEBUG( 2, ( "Closing idle connection\n" ) ); last_idle_closed_check[threadid] = 0; //reset static variable return False; } else if (conn_num_open(threadid) > 0) last_idle_closed_check[threadid] = t; /* check for connection timeouts */ allidle = conn_idle_all(t, deadtime, threadid); //0705 if (allidle && conn_num_open()>0) { // DEBUG(2,("Closing idle connection 2.\n")); if (allidle && conn_num_open(threadid) > 0) { last_idle_closed_check[threadid] = 0; //reset static variable return False; } if (smb_read_error[threadid] == READ_EOF) { // DEBUG(3,("end of file from client\n")); last_idle_closed_check[threadid] = 0; //reset static variable return False; } if (smb_read_error[threadid] == READ_ERROR) { // DEBUG(3,("receive_smb error (%s) exiting\n", // strerror(errno))); last_idle_closed_check[threadid] = 0; //reset static variable return False; } //0703 *select_timeout = setup_select_timeout(); return True; }