s3:smbd: add a smbd_server_connection pointer to connection_struct
authorStefan Metzmacher <metze@samba.org>
Thu, 6 Aug 2009 11:22:33 +0000 (13:22 +0200)
committerStefan Metzmacher <metze@samba.org>
Fri, 7 Aug 2009 12:18:14 +0000 (14:18 +0200)
This can be NULL for faked connection structs used in the rpc server
or printing code.

metze

source3/include/proto.h
source3/include/smb.h
source3/smbd/conn.c
source3/smbd/ipc.c
source3/smbd/reply.c
source3/smbd/service.c
source3/smbd/smb2_tcon.c

index ccd87466035263c06adf7ff51b761e7c7bb87d47..667e84748562d7e803b5af0e39fccfcd7cea1987 100644 (file)
@@ -6145,8 +6145,7 @@ bool conn_close_all(struct smbd_server_connection *sconn);
 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,
@@ -6984,8 +6983,7 @@ connection_struct *make_connection(struct smbd_server_connection *sconn,
                                   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  */
 
index e2d670fa04a96c35325f1fa6e3c643e43c98332d..c33c5363f3f3e46f39b06d1c946670652bb8e0bb 100644 (file)
@@ -546,6 +546,7 @@ struct share_iterator {
 
 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;
index af6e0919a4d531ff9869369bb4bfe79f70fe6797..9d1bbee8c9a3b3d2ec8073410ea304159433369a 100644 (file)
@@ -101,6 +101,7 @@ connection_struct *conn_new(struct smbd_server_connection *sconn)
                        TALLOC_FREE(conn);
                        return NULL;
                }
+               conn->sconn = sconn;
                return conn;
        }
 
@@ -154,6 +155,7 @@ find_again:
                TALLOC_FREE(conn);
                return NULL;
        }
+       conn->sconn = sconn;
        conn->cnum = i;
        conn->force_group_gid = (gid_t)-1;
 
@@ -181,7 +183,7 @@ bool conn_close_all(struct smbd_server_connection *sconn)
        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;
@@ -294,19 +296,24 @@ void conn_free_internal(connection_struct *conn)
  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);
 }
@@ -340,7 +347,7 @@ void msg_force_tdis(struct messaging_context *msg,
                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);
                }
        }
 }
index 96a411dd704d8bd042c07392e8b1605d15b59184..12d4922844a70abfdc821a29f6e4a7a3b4d4ea2e 100644 (file)
@@ -534,7 +534,6 @@ static void named_pipe(connection_struct *conn, uint16 vuid,
 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;
 
@@ -585,7 +584,7 @@ static void handle_trans(connection_struct *conn, struct smb_request *req,
                   state->max_param_return);
 
        if (state->close_on_completion) {
-               close_cnum(sconn, conn,state->vuid);
+               close_cnum(conn,state->vuid);
                req->conn = NULL;
        }
 
index 77e122a90c95c86f8b084b29370d01091b937264..750915b1cb4576b2c59f67beba4e8ad5ad421174 100644 (file)
@@ -703,7 +703,7 @@ void reply_tcon_and_X(struct smb_request *req)
 
        /* 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;
        }
@@ -4868,7 +4868,6 @@ void reply_unlock(struct smb_request *req)
 
 void reply_tdis(struct smb_request *req)
 {
-       struct smbd_server_connection *sconn = smbd_server_conn;
        connection_struct *conn = req->conn;
        START_PROFILE(SMBtdis);
 
@@ -4881,7 +4880,7 @@ void reply_tdis(struct smb_request *req)
 
        conn->used = False;
 
-       close_cnum(sconn, conn,req->vuid);
+       close_cnum(conn,req->vuid);
        req->conn = NULL;
 
        reply_outbuf(req, 0, 0);
index a043288bc90000bc35686b803ca1ba4985d2c122..c24b2264c1d0ecf17c4f88195d20e7ce5cf258bb 100644 (file)
@@ -673,7 +673,7 @@ connection_struct *make_connection_snum(struct smbd_server_connection *sconn,
                DEBUG(1, ("create_connection_server_info failed: %s\n",
                          nt_errstr(status)));
                *pstatus = status;
-               conn_free(sconn, conn);
+               conn_free(conn);
                return NULL;
        }
 
@@ -730,7 +730,7 @@ connection_struct *make_connection_snum(struct smbd_server_connection *sconn,
                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;
                }
@@ -739,7 +739,7 @@ connection_struct *make_connection_snum(struct smbd_server_connection *sconn,
                        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;
                }
@@ -764,7 +764,7 @@ connection_struct *make_connection_snum(struct smbd_server_connection *sconn,
                        &conn->server_info->utok.gid);
 
                if (!NT_STATUS_IS_OK(status)) {
-                       conn_free(sconn, conn);
+                       conn_free(conn);
                        *pstatus = status;
                        return NULL;
                }
@@ -790,14 +790,14 @@ connection_struct *make_connection_snum(struct smbd_server_connection *sconn,
                                        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;
                }
@@ -829,7 +829,7 @@ connection_struct *make_connection_snum(struct smbd_server_connection *sconn,
                                         "denied due to security "
                                         "descriptor.\n",
                                          lp_servicename(snum)));
-                               conn_free(sconn, conn);
+                               conn_free(conn);
                                *pstatus = NT_STATUS_ACCESS_DENIED;
                                return NULL;
                        } else {
@@ -842,7 +842,7 @@ connection_struct *make_connection_snum(struct smbd_server_connection *sconn,
        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;
        }
@@ -860,7 +860,7 @@ connection_struct *make_connection_snum(struct smbd_server_connection *sconn,
                        "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;
                }
@@ -884,7 +884,7 @@ connection_struct *make_connection_snum(struct smbd_server_connection *sconn,
 
                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;
        }  
@@ -894,7 +894,7 @@ connection_struct *make_connection_snum(struct smbd_server_connection *sconn,
         */
        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;
        }  
@@ -918,7 +918,7 @@ connection_struct *make_connection_snum(struct smbd_server_connection *sconn,
                        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;
                }
@@ -929,7 +929,7 @@ connection_struct *make_connection_snum(struct smbd_server_connection *sconn,
                /* 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;
        }
@@ -1072,7 +1072,7 @@ connection_struct *make_connection_snum(struct smbd_server_connection *sconn,
                SMB_VFS_DISCONNECT(conn);
        }
        yield_connection(conn, lp_servicename(snum));
-       conn_free(sconn, conn);
+       conn_free(conn);
        return NULL;
 }
 
@@ -1219,8 +1219,7 @@ connection_struct *make_connection(struct smbd_server_connection *sconn,
  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);
 
@@ -1274,5 +1273,5 @@ void close_cnum(struct smbd_server_connection *sconn,
                TALLOC_FREE(cmd);
        }
 
-       conn_free(sconn, conn);
+       conn_free(conn);
 }
index 8c4b1f1b6fbdb086ab366e19b6a6a2d2e81d1332..090f9b79086e044a4664ecb489dea7776c2a5f54 100644 (file)
@@ -127,7 +127,7 @@ static int smbd_smb2_tcon_destructor(struct smbd_smb2_tcon *tcon)
        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;