Revert "smbd: add smbd_server_connection->raw_ev_ctx pointer"
[garming/samba-autobuild/.git] / source3 / smbd / process.c
index 6a3395ceabf503e842e242f042e2195cf8ba54d1..99693ed1315b98360ca164439b33d061d703b9a2 100644 (file)
@@ -274,10 +274,10 @@ out:
  Setup the word count and byte count for a smb message.
 ********************************************************************/
 
-int srv_set_message(char *buf,
-                        int num_words,
-                        int num_bytes,
-                        bool zero)
+size_t srv_set_message(char *buf,
+                      size_t num_words,
+                      size_t num_bytes,
+                      bool zero)
 {
        if (zero && (num_words || num_bytes)) {
                memset(buf + smb_size,'\0',num_words*2 + num_bytes);
@@ -822,7 +822,14 @@ bool schedule_deferred_open_message_smb(struct smbXsrv_connection *xconn,
                                "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,
@@ -966,7 +973,7 @@ static void smbd_sig_term_handler(struct tevent_context *ev,
        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;
 
@@ -996,7 +1003,7 @@ static void smbd_sig_hup_handler(struct tevent_context *ev,
        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;
 
@@ -1571,13 +1578,16 @@ static connection_struct *switch_message(uint8_t type, struct smb_request *req)
                }
        }
 
-       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,
@@ -1603,6 +1613,12 @@ static connection_struct *switch_message(uint8_t type, struct smb_request *req)
                        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",
@@ -1624,6 +1640,15 @@ static connection_struct *switch_message(uint8_t type, struct smb_request *req)
                        reply_nterror(req, NT_STATUS_ACCESS_DENIED);
                        return conn;
                }
+       } 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;
+               }
        } else {
                /* This call needs to be run as root */
                change_to_root_user();
@@ -1647,47 +1672,16 @@ static connection_struct *switch_message(uint8_t type, struct smb_request *req)
                        }
                }
 
-               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++;
        }
 
        /*
@@ -2751,8 +2745,10 @@ static int release_ip(struct tevent_context *ev,
                 * 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.
@@ -3401,14 +3397,16 @@ bool fork_echo_handler(struct smbXsrv_connection *xconn)
                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);
        }
@@ -3422,7 +3420,8 @@ bool fork_echo_handler(struct smbXsrv_connection *xconn)
         * 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,
@@ -3710,8 +3709,6 @@ NTSTATUS smbd_add_connection(struct smbXsrv_client *client, int sock_fd,
        }
        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;
@@ -3861,7 +3858,7 @@ NTSTATUS smbd_add_connection(struct smbXsrv_client *client, int sock_fd,
        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,