r23018: fixed a memory leak in our server side session setup code for failed
authorAndrew Tridgell <tridge@samba.org>
Sun, 20 May 2007 08:43:03 +0000 (08:43 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 19:52:39 +0000 (14:52 -0500)
session setups

source/smb_server/smb/sesssetup.c

index b6bddaa5b1d95ae56fb7a14fd25b75489b22a3c0..56d9e64e31a24943dea8a5ba83ed4e7fc90790d0 100644 (file)
@@ -60,7 +60,7 @@ static void sesssetup_old_send(struct auth_check_password_request *areq,
        union smb_sesssetup *sess = talloc_get_type(req->io_ptr, union smb_sesssetup);
        struct auth_serversupplied_info *server_info = NULL;
        struct auth_session_info *session_info;
-       struct smbsrv_session *smb_sess;
+       struct smbsrv_session *smb_sess = NULL;
        NTSTATUS status;
 
        status = auth_check_password_recv(areq, req, &server_info);
@@ -88,6 +88,10 @@ static void sesssetup_old_send(struct auth_check_password_request *areq,
        sess->old.out.vuid = smb_sess->vuid;
 
 failed:
+       if (!NT_STATUS_IS_OK(status)) {
+               talloc_free(smb_sess);
+               req->session = NULL;
+       }
        status = auth_nt_status_squash(status);
        smbsrv_sesssetup_backend_send(req, sess, status);
 }
@@ -155,7 +159,7 @@ static void sesssetup_nt1_send(struct auth_check_password_request *areq,
        union smb_sesssetup *sess = talloc_get_type(req->io_ptr, union smb_sesssetup);
        struct auth_serversupplied_info *server_info = NULL;
        struct auth_session_info *session_info;
-       struct smbsrv_session *smb_sess;
+       struct smbsrv_session *smb_sess = NULL;
        NTSTATUS status;
 
        status = auth_check_password_recv(areq, req, &server_info);
@@ -204,6 +208,10 @@ static void sesssetup_nt1_send(struct auth_check_password_request *areq,
 done:
        status = NT_STATUS_OK;
 failed:
+       if (!NT_STATUS_IS_OK(status)) {
+               talloc_free(smb_sess);
+               req->session = NULL;
+       }
        status = auth_nt_status_squash(status);
        smbsrv_sesssetup_backend_send(req, sess, status);
 }
@@ -337,6 +345,10 @@ static void sesssetup_spnego_send(struct gensec_update_request *greq, void *priv
 done:
        sess->spnego.out.vuid = smb_sess->vuid;
 failed:
+       if (!NT_STATUS_IS_OK(status)) {
+               talloc_free(smb_sess);
+               req->session = NULL;
+       }
        status = auth_nt_status_squash(status);
        smbsrv_sesssetup_backend_send(req, sess, status);
 }