r23020: a better fix for the memory leak - this one doesn't stuff up spnego :)
authorAndrew Tridgell <tridge@samba.org>
Sun, 20 May 2007 09:44:03 +0000 (09:44 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 19:52:40 +0000 (14:52 -0500)
(This used to be commit 9a8da730a725fc9fc1a3e407273e688f44eadfe1)

source4/smb_server/session.c
source4/smb_server/smb/sesssetup.c
source4/smb_server/smb2/sesssetup.c

index e95dc9e85625d4cf7019ad182db42c308cceb740..bd5660e481124bd535d546ce227f8872eb41be4f 100644 (file)
@@ -136,6 +136,7 @@ static int smbsrv_session_destructor(struct smbsrv_session *sess)
  * gensec_ctx is optional, but talloc_steal'ed when present
  */
 struct smbsrv_session *smbsrv_session_new(struct smbsrv_connection *smb_conn,
+                                         TALLOC_CTX *mem_ctx,
                                          struct gensec_security *gensec_ctx)
 {
        struct smbsrv_session *sess = NULL;
@@ -144,7 +145,7 @@ struct smbsrv_session *smbsrv_session_new(struct smbsrv_connection *smb_conn,
        /* Ensure no vuid gets registered in share level security. */
        if (smb_conn->config.security == SEC_SHARE) return NULL;
 
-       sess = talloc_zero(smb_conn, struct smbsrv_session);
+       sess = talloc_zero(mem_ctx, struct smbsrv_session);
        if (!sess) return NULL;
        sess->smb_conn = smb_conn;
 
index b6bddaa5b1d95ae56fb7a14fd25b75489b22a3c0..2e9403b10ae722c949a579a1cf07c68126637f39 100644 (file)
@@ -49,6 +49,8 @@ static void smbsrv_sesssetup_backend_send(struct smbsrv_request *req,
 {
        if (NT_STATUS_IS_OK(status)) {
                req->smb_conn->negotiate.done_sesssetup = True;
+               /* we need to keep the session long term */
+               req->session = talloc_steal(req->smb_conn, req->session);
        }
        smbsrv_reply_sesssetup_send(req, sess, status);
 }
@@ -71,7 +73,7 @@ static void sesssetup_old_send(struct auth_check_password_request *areq,
        if (!NT_STATUS_IS_OK(status)) goto failed;
 
        /* allocate a new session */
-       smb_sess = smbsrv_session_new(req->smb_conn, NULL);
+       smb_sess = smbsrv_session_new(req->smb_conn, req, NULL);
        if (!smb_sess) {
                status = NT_STATUS_INSUFFICIENT_RESOURCES;
                goto failed;
@@ -166,7 +168,7 @@ static void sesssetup_nt1_send(struct auth_check_password_request *areq,
        if (!NT_STATUS_IS_OK(status)) goto failed;
 
        /* allocate a new session */
-       smb_sess = smbsrv_session_new(req->smb_conn, NULL);
+       smb_sess = smbsrv_session_new(req->smb_conn, req, NULL);
        if (!smb_sess) {
                status = NT_STATUS_INSUFFICIENT_RESOURCES;
                goto failed;
@@ -339,6 +341,10 @@ done:
 failed:
        status = auth_nt_status_squash(status);
        smbsrv_sesssetup_backend_send(req, sess, status);
+       if (!NT_STATUS_IS_OK(status) && 
+           !NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
+               talloc_free(smb_sess);
+       }
 }
 
 /*
@@ -394,7 +400,7 @@ static void sesssetup_spnego(struct smbsrv_request *req, union smb_sesssetup *se
                }
 
                /* allocate a new session */
-               smb_sess = smbsrv_session_new(req->smb_conn, gensec_ctx);
+               smb_sess = smbsrv_session_new(req->smb_conn, req->smb_conn, gensec_ctx);
                if (!smb_sess) {
                        status = NT_STATUS_INSUFFICIENT_RESOURCES;
                        goto failed;
index c99b443a35a7195c9513661fd5ba25c8d952988f..3439f2f068d06d1efe48e93238bf1d24413bb20c 100644 (file)
@@ -95,6 +95,10 @@ done:
 failed:
        req->status = auth_nt_status_squash(status);
        smb2srv_sesssetup_send(req, io);
+       if (!NT_STATUS_IS_OK(status) && !
+           NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
+               talloc_free(smb_sess);
+       }
 }
 
 static void smb2srv_sesssetup_backend(struct smb2srv_request *req, union smb_sesssetup *io)
@@ -138,7 +142,7 @@ static void smb2srv_sesssetup_backend(struct smb2srv_request *req, union smb_ses
                }
 
                /* allocate a new session */
-               smb_sess = smbsrv_session_new(req->smb_conn, gensec_ctx);
+               smb_sess = smbsrv_session_new(req->smb_conn, req->smb_conn, gensec_ctx);
                if (!smb_sess) {
                        status = NT_STATUS_INSUFFICIENT_RESOURCES;
                        goto failed;