"scheduling mid %llu\n",
(unsigned long long)mid ));
- te = tevent_add_timer(pml->sconn->ev_ctx,
+ /*
+ * smbd_deferred_open_timer() calls
+ * process_smb() to redispatch the request
+ * including the required impersonation.
+ *
+ * So we can just use the raw tevent_context.
+ */
+ te = tevent_add_timer(xconn->client->raw_ev_ctx,
pml,
timeval_zero(),
smbd_deferred_open_timer,
exit_server_cleanly("termination signal");
}
-void smbd_setup_sig_term_handler(struct smbd_server_connection *sconn)
+static void smbd_setup_sig_term_handler(struct smbd_server_connection *sconn)
{
struct tevent_signal *se;
- se = tevent_add_signal(sconn->ev_ctx,
+ se = tevent_add_signal(sconn->root_ev_ctx,
sconn,
SIGTERM, 0,
smbd_sig_term_handler,
reload_services(sconn, conn_snum_used, false);
}
-void smbd_setup_sig_hup_handler(struct smbd_server_connection *sconn)
+static void smbd_setup_sig_hup_handler(struct smbd_server_connection *sconn)
{
struct tevent_signal *se;
- se = tevent_add_signal(sconn->ev_ctx,
+ se = tevent_add_signal(sconn->root_ev_ctx,
sconn,
SIGHUP, 0,
smbd_sig_hup_handler,
errno = 0;
+ req->ev_ctx = NULL;
+
if (!xconn->smb1.negprot.done) {
switch (type) {
/*
}
}
- if (session_tag != xconn->client->last_session_id) {
- struct user_struct *vuser = NULL;
+ if (session != NULL && !(flags & AS_USER)) {
+ struct user_struct *vuser = session->compat;
- xconn->client->last_session_id = session_tag;
- if (session) {
- vuser = session->compat;
- }
+ /*
+ * change_to_user() implies set_current_user_info()
+ * and chdir_connect_service().
+ *
+ * So we only call set_current_user_info if
+ * we don't have AS_USER specified.
+ */
if (vuser) {
set_current_user_info(
vuser->session_info->unix_info->sanitized_username,
return NULL;
}
+ set_current_case_sensitive(conn, SVAL(req->inbuf,smb_flg));
+
+ /*
+ * change_to_user() implies set_current_user_info()
+ * and chdir_connect_service().
+ */
if (!change_to_user(conn,session_tag)) {
DEBUG(0, ("Error: Could not change to user. Removing "
"deferred open, mid=%llu.\n",
reply_nterror(req, NT_STATUS_ACCESS_DENIED);
return conn;
}
+
+ req->ev_ctx = conn->user_ev_ctx;
+ } else if (flags & AS_GUEST) {
+ /*
+ * Does this protocol need to be run as guest? (Only archane
+ * messenger service requests have this...)
+ */
+ if (!change_to_guest()) {
+ reply_nterror(req, NT_STATUS_ACCESS_DENIED);
+ return conn;
+ }
+
+ req->ev_ctx = req->sconn->guest_ev_ctx;
} else {
/* This call needs to be run as root */
change_to_root_user();
+
+ req->ev_ctx = req->sconn->root_ev_ctx;
}
/* load service specific parameters */
}
}
- if (!set_current_service(conn,SVAL(req->inbuf,smb_flg),
- (flags & (AS_USER|DO_CHDIR)
- ?True:False))) {
- reply_nterror(req, NT_STATUS_ACCESS_DENIED);
- return conn;
- }
- conn->num_smb_operations++;
- }
-
- /*
- * Does this protocol need to be run as guest? (Only archane
- * messenger service requests have this...)
- */
- if (flags & AS_GUEST) {
- char *raddr;
- bool ok;
-
- if (!change_to_guest()) {
- reply_nterror(req, NT_STATUS_ACCESS_DENIED);
- return conn;
- }
-
- raddr = tsocket_address_inet_addr_string(xconn->remote_address,
- talloc_tos());
- if (raddr == NULL) {
- reply_nterror(req, NT_STATUS_NO_MEMORY);
- return conn;
- }
-
- /*
- * Haven't we checked this in smbd_process already???
- */
-
- ok = allow_access(lp_hosts_deny(-1), lp_hosts_allow(-1),
- xconn->remote_hostname, raddr);
- TALLOC_FREE(raddr);
+ if (flags & DO_CHDIR) {
+ bool ok;
- if (!ok) {
- reply_nterror(req, NT_STATUS_ACCESS_DENIED);
- return conn;
+ ok = chdir_current_service(conn);
+ if (!ok) {
+ reply_nterror(req, NT_STATUS_ACCESS_DENIED);
+ return conn;
+ }
}
+ conn->num_smb_operations++;
}
/*
* as we might be called from within ctdbd_migrate(),
* we need to defer our action to the next event loop
*/
- tevent_schedule_immediate(state->im, xconn->ev_ctx,
- smbd_release_ip_immediate, state);
+ tevent_schedule_immediate(state->im,
+ xconn->client->raw_ev_ctx,
+ smbd_release_ip_immediate,
+ state);
/*
* Make sure we don't get any io on the connection.
close(listener_pipe[0]);
set_blocking(listener_pipe[1], false);
- status = smbd_reinit_after_fork(xconn->msg_ctx, xconn->ev_ctx,
- true, "smbd-echo");
+ status = smbd_reinit_after_fork(xconn->client->msg_ctx,
+ xconn->client->raw_ev_ctx,
+ true,
+ "smbd-echo");
if (!NT_STATUS_IS_OK(status)) {
DEBUG(1, ("reinit_after_fork failed: %s\n",
nt_errstr(status)));
exit(1);
}
- initialize_password_db(true, xconn->ev_ctx);
+ initialize_password_db(true, xconn->client->raw_ev_ctx);
smbd_echo_loop(xconn, listener_pipe[1]);
exit(0);
}
* Without smb signing this is the same as the normal smbd
* listener. This needs to change once signing comes in.
*/
- xconn->smb1.echo_handler.trusted_fde = tevent_add_fd(xconn->ev_ctx,
+ xconn->smb1.echo_handler.trusted_fde = tevent_add_fd(
+ xconn->client->raw_ev_ctx,
xconn,
xconn->smb1.echo_handler.trusted_fd,
TEVENT_FD_READ,
}
talloc_steal(frame, xconn);
- xconn->ev_ctx = client->ev_ctx;
- xconn->msg_ctx = client->msg_ctx;
xconn->transport.sock = sock_fd;
smbd_echo_init(xconn);
xconn->protocol = PROTOCOL_NONE;
xconn->smb1.sessions.done_sesssetup = false;
xconn->smb1.sessions.max_send = SMB_BUFFER_SIZE_MAX;
- xconn->transport.fde = tevent_add_fd(client->ev_ctx,
+ xconn->transport.fde = tevent_add_fd(client->raw_ev_ctx,
xconn,
sock_fd,
TEVENT_FD_READ,
sconn->client = client;
sconn->ev_ctx = ev_ctx;
+ sconn->raw_ev_ctx = ev_ctx;
+ sconn->root_ev_ctx = ev_ctx;
+ sconn->guest_ev_ctx = ev_ctx;
sconn->msg_ctx = msg_ctx;
ret = pthreadpool_tevent_init(sconn, lp_aio_max_threads(),
ID_CACHE_KILL, smbd_id_cache_kill);
messaging_deregister(sconn->msg_ctx,
- MSG_SMB_CONF_UPDATED, sconn->ev_ctx);
+ MSG_SMB_CONF_UPDATED, sconn->raw_ev_ctx);
messaging_register(sconn->msg_ctx, sconn,
MSG_SMB_CONF_UPDATED, smbd_conf_updated);