bool conn_idle_all(struct smbd_server_connection *sconn, time_t t);
void conn_clear_vuid_caches(struct smbd_server_connection *sconn, uint16 vuid);
void conn_free_internal(connection_struct *conn);
-void conn_free(struct smbd_server_connection *sconn,
- connection_struct *conn);
+void conn_free(connection_struct *conn);
void msg_force_tdis(struct messaging_context *msg,
void *private_data,
uint32_t msg_type,
const char *service_in, DATA_BLOB password,
const char *pdev, uint16 vuid,
NTSTATUS *status);
-void close_cnum(struct smbd_server_connection *sconn,
- connection_struct *conn, uint16 vuid);
+void close_cnum(connection_struct *conn, uint16 vuid);
/* The following definitions come from smbd/session.c */
typedef struct connection_struct {
struct connection_struct *next, *prev;
+ struct smbd_server_connection *sconn; /* can be NULL */
unsigned cnum; /* an index passed over the wire */
struct share_params *params;
bool force_user;
TALLOC_FREE(conn);
return NULL;
}
+ conn->sconn = sconn;
return conn;
}
TALLOC_FREE(conn);
return NULL;
}
+ conn->sconn = sconn;
conn->cnum = i;
conn->force_group_gid = (gid_t)-1;
for (conn=sconn->smb1.tcons.Connections;conn;conn=next) {
next=conn->next;
set_current_service(conn, 0, True);
- close_cnum(sconn, conn, conn->vuid);
+ close_cnum(conn, conn->vuid);
ret = true;
}
return ret;
Free a conn structure.
****************************************************************************/
-void conn_free(struct smbd_server_connection *sconn, connection_struct *conn)
+void conn_free(connection_struct *conn)
{
- if (sconn->allow_smb2) {
+ if (conn->sconn == NULL) {
+ conn_free_internal(conn);
+ return;
+ }
+
+ if (conn->sconn->allow_smb2) {
conn_free_internal(conn);
return;
}
- DLIST_REMOVE(sconn->smb1.tcons.Connections, conn);
+ DLIST_REMOVE(conn->sconn->smb1.tcons.Connections, conn);
- bitmap_clear(sconn->smb1.tcons.bmap, conn->cnum);
+ bitmap_clear(conn->sconn->smb1.tcons.bmap, conn->cnum);
- SMB_ASSERT(sconn->smb1.tcons.num_open > 0);
- sconn->smb1.tcons.num_open--;
+ SMB_ASSERT(conn->sconn->smb1.tcons.num_open > 0);
+ conn->sconn->smb1.tcons.num_open--;
conn_free_internal(conn);
}
if (strequal(lp_servicename(SNUM(conn)), sharename)) {
DEBUG(1,("Forcing close of share %s cnum=%d\n",
sharename, conn->cnum));
- close_cnum(sconn, conn, (uint16)-1);
+ close_cnum(conn, (uint16)-1);
}
}
}
static void handle_trans(connection_struct *conn, struct smb_request *req,
struct trans_state *state)
{
- struct smbd_server_connection *sconn = smbd_server_conn;
char *local_machine_name;
int name_offset = 0;
state->max_param_return);
if (state->close_on_completion) {
- close_cnum(sconn, conn,state->vuid);
+ close_cnum(conn,state->vuid);
req->conn = NULL;
}
/* we might have to close an old one */
if ((tcon_flags & 0x1) && conn) {
- close_cnum(sconn, conn,req->vuid);
+ close_cnum(conn,req->vuid);
req->conn = NULL;
conn = NULL;
}
void reply_tdis(struct smb_request *req)
{
- struct smbd_server_connection *sconn = smbd_server_conn;
connection_struct *conn = req->conn;
START_PROFILE(SMBtdis);
conn->used = False;
- close_cnum(sconn, conn,req->vuid);
+ close_cnum(conn,req->vuid);
req->conn = NULL;
reply_outbuf(req, 0, 0);
DEBUG(1, ("create_connection_server_info failed: %s\n",
nt_errstr(status)));
*pstatus = status;
- conn_free(sconn, conn);
+ conn_free(conn);
return NULL;
}
fuser = talloc_string_sub(conn, lp_force_user(snum), "%S",
lp_servicename(snum));
if (fuser == NULL) {
- conn_free(sconn, conn);
+ conn_free(conn);
*pstatus = NT_STATUS_NO_MEMORY;
return NULL;
}
conn, fuser, conn->server_info->guest,
&forced_serverinfo);
if (!NT_STATUS_IS_OK(status)) {
- conn_free(sconn, conn);
+ conn_free(conn);
*pstatus = status;
return NULL;
}
&conn->server_info->utok.gid);
if (!NT_STATUS_IS_OK(status)) {
- conn_free(sconn, conn);
+ conn_free(conn);
*pstatus = status;
return NULL;
}
pdb_get_domain(conn->server_info->sam_account),
lp_pathname(snum));
if (!s) {
- conn_free(sconn, conn);
+ conn_free(conn);
*pstatus = NT_STATUS_NO_MEMORY;
return NULL;
}
if (!set_conn_connectpath(conn,s)) {
TALLOC_FREE(s);
- conn_free(sconn, conn);
+ conn_free(conn);
*pstatus = NT_STATUS_NO_MEMORY;
return NULL;
}
"denied due to security "
"descriptor.\n",
lp_servicename(snum)));
- conn_free(sconn, conn);
+ conn_free(conn);
*pstatus = NT_STATUS_ACCESS_DENIED;
return NULL;
} else {
if (!smbd_vfs_init(conn)) {
DEBUG(0, ("vfs_init failed for service %s\n",
lp_servicename(snum)));
- conn_free(sconn, conn);
+ conn_free(conn);
*pstatus = NT_STATUS_BAD_NETWORK_NAME;
return NULL;
}
"for service %s, path %s\n",
lp_servicename(snum),
conn->connectpath));
- conn_free(sconn, conn);
+ conn_free(conn);
*pstatus = NT_STATUS_BAD_NETWORK_NAME;
return NULL;
}
DEBUG(1, ("Max connections (%d) exceeded for %s\n",
lp_max_connections(snum), lp_servicename(snum)));
- conn_free(sconn, conn);
+ conn_free(conn);
*pstatus = NT_STATUS_INSUFFICIENT_RESOURCES;
return NULL;
}
*/
if (!claim_connection(conn, lp_servicename(snum), 0)) {
DEBUG(1, ("Could not store connections entry\n"));
- conn_free(sconn, conn);
+ conn_free(conn);
*pstatus = NT_STATUS_INTERNAL_DB_ERROR;
return NULL;
}
DEBUG(1,("root preexec gave %d - failing "
"connection\n", ret));
yield_connection(conn, lp_servicename(snum));
- conn_free(sconn, conn);
+ conn_free(conn);
*pstatus = NT_STATUS_ACCESS_DENIED;
return NULL;
}
/* No point continuing if they fail the basic checks */
DEBUG(0,("Can't become connected user!\n"));
yield_connection(conn, lp_servicename(snum));
- conn_free(sconn, conn);
+ conn_free(conn);
*pstatus = NT_STATUS_LOGON_FAILURE;
return NULL;
}
SMB_VFS_DISCONNECT(conn);
}
yield_connection(conn, lp_servicename(snum));
- conn_free(sconn, conn);
+ conn_free(conn);
return NULL;
}
Close a cnum.
****************************************************************************/
-void close_cnum(struct smbd_server_connection *sconn,
- connection_struct *conn, uint16 vuid)
+void close_cnum(connection_struct *conn, uint16 vuid)
{
file_close_conn(conn);
TALLOC_FREE(cmd);
}
- conn_free(sconn, conn);
+ conn_free(conn);
}
idr_remove(tcon->session->tcons.idtree, tcon->tid);
DLIST_REMOVE(tcon->session->tcons.list, tcon);
- conn_free(tcon->session->conn, tcon->compat_conn);
+ conn_free(tcon->compat_conn);
tcon->compat_conn = NULL;
tcon->tid = 0;