s3:smbd: move sconn->smb1.signing_state to xconn->smb1.signing_state
authorStefan Metzmacher <metze@samba.org>
Wed, 21 May 2014 12:44:01 +0000 (14:44 +0200)
committerMichael Adam <obnox@samba.org>
Wed, 6 Aug 2014 07:51:11 +0000 (09:51 +0200)
This prepares the structures for multi-channel support.

Signed-off-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Michael Adam <obnox@samba.org>
source3/smbd/globals.h
source3/smbd/negprot.c
source3/smbd/nttrans.c
source3/smbd/process.c
source3/smbd/proto.h
source3/smbd/reply.c
source3/smbd/service.c
source3/smbd/sesssetup.c
source3/smbd/signing.c
source3/smbd/trans2.c

index e077133d25d06032eb7a4b4d6e5434461ef670ac..63bd731719faa5389484f1d53105fca87df4536c 100644 (file)
@@ -375,6 +375,7 @@ struct smbXsrv_connection {
                         */
                        int max_send;
                } sessions;
+               struct smb_signing_state *signing_state;
        } smb1;
        struct {
                struct {
@@ -764,8 +765,6 @@ struct smbd_server_connection {
                        uint32_t client_cap_high;
                } unix_info;
 
-               struct smb_signing_state *signing_state;
-
                struct notify_mid_map *notify_mid_maps;
 
                struct {
index 4a109cd19460aa8985ae993f2d21c6bacbcd077d..67b66b8b981752f078eaec31afba91796e1fde2c 100644 (file)
@@ -319,8 +319,8 @@ static void reply_nt1(struct smb_request *req, uint16 choice)
                secword |= NEGOTIATE_SECURITY_CHALLENGE_RESPONSE;
        }
 
-       signing_desired = smb_signing_is_desired(req->sconn->smb1.signing_state);
-       signing_required = smb_signing_is_mandatory(req->sconn->smb1.signing_state);
+       signing_desired = smb_signing_is_desired(xconn->smb1.signing_state);
+       signing_required = smb_signing_is_mandatory(xconn->smb1.signing_state);
 
        if (signing_desired) {
                secword |= NEGOTIATE_SECURITY_SIGNATURES_ENABLED;
index 018a89db7440de9c0eb4b0a2099e8b5c623dc717..57c41597dceba40e85f259b4fa4c87c660f3b97a 100644 (file)
@@ -1339,12 +1339,14 @@ static void call_nt_transact_create(connection_struct *conn,
 
 void reply_ntcancel(struct smb_request *req)
 {
+       struct smbXsrv_connection *xconn = req->sconn->conn;
+
        /*
         * Go through and cancel any pending change notifies.
         */
 
        START_PROFILE(SMBntcancel);
-       srv_cancel_sign_response(req->sconn);
+       srv_cancel_sign_response(xconn);
        remove_pending_change_notify_requests_by_mid(req->sconn, req->mid);
        remove_pending_lock_requests_by_mid_smb1(req->sconn, req->mid);
 
index c78915723ecd9aed88b29603749b6c493463d6fc..188d619e7db8599856230edc34ecf339637dd371 100644 (file)
@@ -231,7 +231,7 @@ bool srv_send_smb(struct smbd_server_connection *sconn, char *buffer,
 
        if (do_signing) {
                /* Sign the outgoing packet if required. */
-               srv_calculate_sign_mac(sconn, buf_out, seqnum);
+               srv_calculate_sign_mac(xconn, buf_out, seqnum);
        }
 
        if (do_encrypt) {
@@ -480,6 +480,7 @@ static NTSTATUS receive_smb_raw_talloc(TALLOC_CTX *mem_ctx,
                                       char **buffer, unsigned int timeout,
                                       size_t *p_unread, size_t *plen)
 {
+       struct smbXsrv_connection *xconn = sconn->conn;
        char lenbuf[4];
        size_t len;
        int min_recv_size = lp_min_receive_file_size();
@@ -496,7 +497,7 @@ static NTSTATUS receive_smb_raw_talloc(TALLOC_CTX *mem_ctx,
        if (CVAL(lenbuf,0) == 0 && min_recv_size &&
            (smb_len_large(lenbuf) > /* Could be a UNIX large writeX. */
                (min_recv_size + STANDARD_WRITE_AND_X_HEADER_SIZE)) &&
-           !srv_is_signing_active(sconn) &&
+           !srv_is_signing_active(xconn) &&
            sconn->smb1.echo_handler.trusted_fde == NULL) {
 
                return receive_smb_raw_talloc_partial_read(
@@ -540,6 +541,7 @@ static NTSTATUS receive_smb_talloc(TALLOC_CTX *mem_ctx,
                                   uint32_t *seqnum,
                                   bool trusted_channel)
 {
+       struct smbXsrv_connection *xconn = sconn->conn;
        size_t len = 0;
        NTSTATUS status;
 
@@ -569,7 +571,7 @@ static NTSTATUS receive_smb_talloc(TALLOC_CTX *mem_ctx,
        }
 
        /* Check the incoming SMB signature. */
-       if (!srv_check_sign_mac(sconn, *buffer, seqnum, trusted_channel)) {
+       if (!srv_check_sign_mac(xconn, *buffer, seqnum, trusted_channel)) {
                DEBUG(0, ("receive_smb: SMB Signature verification failed on "
                          "incoming packet!\n"));
                return NT_STATUS_INVALID_NETWORK_RESPONSE;
@@ -3738,7 +3740,7 @@ void smbd_process(struct tevent_context *ev_ctx,
                DEBUG(0,("Changed root to %s\n", lp_root_directory(talloc_tos())));
        }
 
-       if (!srv_init_signing(sconn)) {
+       if (!srv_init_signing(conn)) {
                exit_server("Failed to init smb_signing");
        }
 
index eab05c2e2cb0d080286f7fa3c1a6ce7963dfa754..efabfad331b5aabd5c9cfe1fd362eab6bd68a460 100644 (file)
 
 /* The following definitions come from smbd/signing.c  */
 
-bool srv_check_sign_mac(struct smbd_server_connection *conn,
+struct smbXsrv_connection;
+
+bool srv_check_sign_mac(struct smbXsrv_connection *conn,
                        const char *inbuf, uint32_t *seqnum, bool trusted_channel);
-void srv_calculate_sign_mac(struct smbd_server_connection *conn,
+void srv_calculate_sign_mac(struct smbXsrv_connection *conn,
                            char *outbuf, uint32_t seqnum);
-void srv_cancel_sign_response(struct smbd_server_connection *conn);
-bool srv_init_signing(struct smbd_server_connection *conn);
-void srv_set_signing_negotiated(struct smbd_server_connection *conn,
+void srv_cancel_sign_response(struct smbXsrv_connection *conn);
+bool srv_init_signing(struct smbXsrv_connection *conn);
+void srv_set_signing_negotiated(struct smbXsrv_connection *conn,
                                bool allowed, bool mandatory);
-bool srv_is_signing_active(struct smbd_server_connection *conn);
-bool srv_is_signing_negotiated(struct smbd_server_connection *conn);
-void srv_set_signing(struct smbd_server_connection *conn,
+bool srv_is_signing_active(struct smbXsrv_connection *conn);
+bool srv_is_signing_negotiated(struct smbXsrv_connection *conn);
+void srv_set_signing(struct smbXsrv_connection *conn,
                     const DATA_BLOB user_session_key,
                     const DATA_BLOB response);
 
index f15e69953a9bbd709475e131d49d60170231f314..d41f4adbdfe39fb6544f043578958920d7e24358 100644 (file)
@@ -3212,7 +3212,7 @@ static void send_file_readbraw(connection_struct *conn,
 
        if ( !req_is_in_chain(req) && (nread > 0) && (fsp->base_fsp == NULL) &&
            (fsp->wcp == NULL) &&
-           lp_use_sendfile(SNUM(conn), req->sconn->smb1.signing_state) ) {
+           lp_use_sendfile(SNUM(conn), xconn->smb1.signing_state) ) {
                ssize_t sendfile_read = -1;
                char header[4];
                DATA_BLOB header_blob;
@@ -3323,6 +3323,7 @@ void reply_readbraw(struct smb_request *req)
 {
        connection_struct *conn = req->conn;
        struct smbd_server_connection *sconn = req->sconn;
+       struct smbXsrv_connection *xconn = sconn->conn;
        ssize_t maxcount,mincount;
        size_t nread = 0;
        off_t startpos;
@@ -3332,7 +3333,7 @@ void reply_readbraw(struct smb_request *req)
 
        START_PROFILE(SMBreadbraw);
 
-       if (srv_is_signing_active(sconn) || req->encrypted) {
+       if (srv_is_signing_active(xconn) || req->encrypted) {
                exit_server_cleanly("reply_readbraw: SMB signing/sealing is active - "
                        "raw reads/writes are disallowed.");
        }
@@ -3726,7 +3727,7 @@ static void send_file_readX(connection_struct *conn, struct smb_request *req,
            !req->encrypted &&
            (fsp->base_fsp == NULL) &&
            (fsp->wcp == NULL) &&
-           lp_use_sendfile(SNUM(conn), req->sconn->smb1.signing_state) ) {
+           lp_use_sendfile(SNUM(conn), xconn->smb1.signing_state) ) {
                uint8 headerbuf[smb_size + 12 * 2];
                DATA_BLOB header;
 
@@ -3925,7 +3926,7 @@ static size_t calc_max_read_pdu(const struct smb_request *req)
                return xconn->smb1.sessions.max_send;
        }
 
-       if (srv_is_signing_active(req->sconn)) {
+       if (srv_is_signing_active(xconn)) {
                return 0x1FFFF;
        }
 
@@ -4148,7 +4149,7 @@ void reply_writebraw(struct smb_request *req)
         */
        SCVAL(discard_const_p(uint8_t, req->inbuf),smb_com,SMBwritec);
 
-       if (srv_is_signing_active(req->sconn)) {
+       if (srv_is_signing_active(xconn)) {
                END_PROFILE(SMBwritebraw);
                exit_server_cleanly("reply_writebraw: SMB signing is active - "
                                "raw reads/writes are disallowed.");
index d3eabf8e3600daa87af8155188bc273c813b748b..e7a55a483f6a15cc1f3bfb15eeb587f75ddfb968 100644 (file)
@@ -522,6 +522,7 @@ static NTSTATUS make_connection_snum(struct smbd_server_connection *sconn,
                                        int snum, struct user_struct *vuser,
                                        const char *pdev)
 {
+       struct smbXsrv_connection *xconn = sconn->conn;
        struct smb_filename *smb_fname_cpath = NULL;
        fstring dev;
        int ret;
@@ -858,7 +859,7 @@ static NTSTATUS make_connection_snum(struct smbd_server_connection *sconn,
                dbgtext( "%s (%s) ", get_remote_machine_name(),
                         tsocket_address_string(conn->sconn->remote_address,
                                                talloc_tos()) );
-               dbgtext( "%s", srv_is_signing_active(sconn) ? "signed " : "");
+               dbgtext( "%s", srv_is_signing_active(xconn) ? "signed " : "");
                dbgtext( "connect to service %s ",
                         lp_servicename(talloc_tos(), snum) );
                dbgtext( "initially as user %s ",
index 75da143a28d4435bcb6740748cafb112f90cd2c8..43be24a889d494aefbef374e63495241158ed3c9 100644 (file)
@@ -331,7 +331,7 @@ static void reply_sesssetup_and_X_spnego(struct smb_request *req)
                                register_homes_share(session_info->unix_info->unix_name);
                }
 
-               if (srv_is_signing_negotiated(sconn) &&
+               if (srv_is_signing_negotiated(xconn) &&
                    action == 0 &&
                    session->global->signing_key.length > 0)
                {
@@ -339,7 +339,7 @@ static void reply_sesssetup_and_X_spnego(struct smb_request *req)
                         * Try and turn on server signing on the first non-guest
                         * sessionsetup.
                         */
-                       srv_set_signing(sconn,
+                       srv_set_signing(xconn,
                                session->global->signing_key,
                                data_blob_null);
                }
@@ -618,7 +618,7 @@ void reply_sesssetup_and_X(struct smb_request *req)
         * It finds out when it needs to turn into a noop
         * itself.
         */
-       srv_set_signing_negotiated(req->sconn,
+       srv_set_signing_negotiated(xconn,
                                   signing_allowed,
                                   signing_mandatory);
 
@@ -1029,7 +1029,7 @@ void reply_sesssetup_and_X(struct smb_request *req)
                        register_homes_share(session_info->unix_info->unix_name);
        }
 
-       if (srv_is_signing_negotiated(sconn) &&
+       if (srv_is_signing_negotiated(xconn) &&
            action == 0 &&
            session->global->signing_key.length > 0)
        {
@@ -1037,7 +1037,7 @@ void reply_sesssetup_and_X(struct smb_request *req)
                 * Try and turn on server signing on the first non-guest
                 * sessionsetup.
                 */
-               srv_set_signing(sconn,
+               srv_set_signing(xconn,
                        session->global->signing_key,
                        nt_resp.data ? nt_resp : lm_resp);
        }
index b7683cdc9d0d87399e904999ced18ab8b3dd692d..9fac87b508137c9d9f09d04c31d604b3be8d2b6e 100644 (file)
@@ -29,7 +29,7 @@
  Called to validate an incoming packet from the client.
 ************************************************************/
 
-bool srv_check_sign_mac(struct smbd_server_connection *conn,
+bool srv_check_sign_mac(struct smbXsrv_connection *conn,
                        const char *inbuf, uint32_t *seqnum,
                        bool trusted_channel)
 {
@@ -75,7 +75,7 @@ bool srv_check_sign_mac(struct smbd_server_connection *conn,
  Called to sign an outgoing packet to the client.
 ************************************************************/
 
-void srv_calculate_sign_mac(struct smbd_server_connection *conn,
+void srv_calculate_sign_mac(struct smbXsrv_connection *conn,
                            char *outbuf, uint32_t seqnum)
 {
        uint8_t *outhdr;
@@ -96,7 +96,7 @@ void srv_calculate_sign_mac(struct smbd_server_connection *conn,
 /***********************************************************
  Called to indicate a oneway request
 ************************************************************/
-void srv_cancel_sign_response(struct smbd_server_connection *conn)
+void srv_cancel_sign_response(struct smbXsrv_connection *conn)
 {
        smb_signing_cancel_reply(conn->smb1.signing_state, true);
 }
@@ -167,7 +167,7 @@ static void smbd_shm_signing_free(TALLOC_CTX *mem_ctx, void *ptr)
  Called by server negprot when signing has been negotiated.
 ************************************************************/
 
-bool srv_init_signing(struct smbd_server_connection *conn)
+bool srv_init_signing(struct smbXsrv_connection *conn)
 {
        bool allowed = true;
        bool desired;
@@ -229,7 +229,7 @@ bool srv_init_signing(struct smbd_server_connection *conn)
        return true;
 }
 
-void srv_set_signing_negotiated(struct smbd_server_connection *conn,
+void srv_set_signing_negotiated(struct smbXsrv_connection *conn,
                                bool allowed, bool mandatory)
 {
        smb_signing_set_negotiated(conn->smb1.signing_state,
@@ -241,7 +241,7 @@ void srv_set_signing_negotiated(struct smbd_server_connection *conn,
  reads/writes if it is.
 ************************************************************/
 
-bool srv_is_signing_active(struct smbd_server_connection *conn)
+bool srv_is_signing_active(struct smbXsrv_connection *conn)
 {
        return smb_signing_is_active(conn->smb1.signing_state);
 }
@@ -252,7 +252,7 @@ bool srv_is_signing_active(struct smbd_server_connection *conn)
  in the negprot.
 ************************************************************/
 
-bool srv_is_signing_negotiated(struct smbd_server_connection *conn)
+bool srv_is_signing_negotiated(struct smbXsrv_connection *conn)
 {
        return smb_signing_is_negotiated(conn->smb1.signing_state);
 }
@@ -261,7 +261,7 @@ bool srv_is_signing_negotiated(struct smbd_server_connection *conn)
  Turn on signing from this packet onwards.
 ************************************************************/
 
-void srv_set_signing(struct smbd_server_connection *conn,
+void srv_set_signing(struct smbXsrv_connection *conn,
                     const DATA_BLOB user_session_key,
                     const DATA_BLOB response)
 {
index 76e410f87b14572e5a593766066e778dbda36e01..d00a6db6ee1265b675180c10c1546b4390e2e8e6 100644 (file)
@@ -3074,6 +3074,7 @@ NTSTATUS smbd_do_qfsinfo(connection_struct *conn,
                         char **ppdata,
                         int *ret_data_len)
 {
+       struct smbXsrv_connection *xconn = conn->sconn->conn;
        char *pdata, *end_data;
        int data_len = 0, len;
        const char *vname = volume_label(talloc_tos(), SNUM(conn));
@@ -3446,8 +3447,8 @@ cBytesSector=%u, cUnitTotal=%u, cUnitAvail=%d\n", (unsigned int)bsize, (unsigned
                case SMB_QUERY_CIFS_UNIX_INFO:
                {
                        bool large_write = lp_min_receive_file_size() &&
-                                       !srv_is_signing_active(conn->sconn);
-                       bool large_read = !srv_is_signing_active(conn->sconn);
+                                       !srv_is_signing_active(xconn);
+                       bool large_read = !srv_is_signing_active(xconn);
                        int encrypt_caps = 0;
 
                        if (!lp_unix_extensions()) {