gensec: clarify memory ownership for gensec_session_info() and gensec_session_key()
authorAndrew Bartlett <abartlet@samba.org>
Mon, 1 Aug 2011 05:39:01 +0000 (15:39 +1000)
committerAndrew Bartlett <abartlet@samba.org>
Wed, 3 Aug 2011 08:48:02 +0000 (18:48 +1000)
This is slightly less efficient, because we no longer keep a cache on
the gensec structures, but much clearer in terms of memory ownership.
Both gensec_session_info() and gensec_session_key() now take a mem_ctx
and put the result only on that context.

Some duplication of memory in the callers (who were rightly uncertain
about who was the rightful owner of the returned memory) has been
removed to compensate for the internal copy.

Andrew Bartlett

24 files changed:
auth/gensec/gensec.c
auth/gensec/gensec.h
source4/auth/gensec/gensec_gssapi.c
source4/auth/gensec/gensec_gssapi.h
source4/auth/gensec/gensec_krb5.c
source4/auth/gensec/pygensec.c
source4/auth/gensec/schannel.c
source4/auth/gensec/spnego.c
source4/auth/ntlmssp/ntlmssp.c
source4/auth/ntlmssp/ntlmssp_server.c
source4/dsdb/repl/drepl_out_helpers.c
source4/kdc/kpasswdd.c
source4/ldap_server/ldap_bind.c
source4/libcli/smb2/session.c
source4/libcli/smb_composite/sesssetup.c
source4/libnet/libnet_become_dc.c
source4/libnet/py_net.c
source4/rpc_server/dcesrv_auth.c
source4/smb_server/smb/sesssetup.c
source4/smb_server/smb2/sesssetup.c
source4/torture/drs/rpc/dssync.c
source4/torture/drs/rpc/msds_intid.c
source4/torture/rpc/remote_pac.c
source4/utils/ntlm_auth.c

index 4736e73d5a9f8fcfbbdda5997f3fb32d2e763fe5..417b05cf063c4dd6dae3ab594058b620e34ea603 100644 (file)
@@ -148,7 +148,8 @@ _PUBLIC_ NTSTATUS gensec_unwrap(struct gensec_security *gensec_security,
 }
 
 _PUBLIC_ NTSTATUS gensec_session_key(struct gensec_security *gensec_security,
-                           DATA_BLOB *session_key)
+                                    TALLOC_CTX *mem_ctx,
+                                    DATA_BLOB *session_key)
 {
        if (!gensec_security->ops->session_key) {
                return NT_STATUS_NOT_IMPLEMENTED;
@@ -157,7 +158,7 @@ _PUBLIC_ NTSTATUS gensec_session_key(struct gensec_security *gensec_security,
                return NT_STATUS_NO_USER_SESSION_KEY;
        }
 
-       return gensec_security->ops->session_key(gensec_security, session_key);
+       return gensec_security->ops->session_key(gensec_security, mem_ctx, session_key);
 }
 
 /**
@@ -171,12 +172,13 @@ _PUBLIC_ NTSTATUS gensec_session_key(struct gensec_security *gensec_security,
  */
 
 _PUBLIC_ NTSTATUS gensec_session_info(struct gensec_security *gensec_security,
-                            struct auth_session_info **session_info)
+                                     TALLOC_CTX *mem_ctx,
+                                     struct auth_session_info **session_info)
 {
        if (!gensec_security->ops->session_info) {
                return NT_STATUS_NOT_IMPLEMENTED;
        }
-       return gensec_security->ops->session_info(gensec_security, session_info);
+       return gensec_security->ops->session_info(gensec_security, mem_ctx, session_info);
 }
 
 /**
index 852618c1af4260f74727b0ad77db9b8612e16fdc..38f2513742512240fcbacc333bbed3d832237014 100644 (file)
@@ -132,8 +132,9 @@ struct gensec_security_ops {
                                   size_t *len_processed);
        NTSTATUS (*packet_full_request)(struct gensec_security *gensec_security,
                                        DATA_BLOB blob, size_t *size);
-       NTSTATUS (*session_key)(struct gensec_security *gensec_security, DATA_BLOB *session_key);
-       NTSTATUS (*session_info)(struct gensec_security *gensec_security,
+       NTSTATUS (*session_key)(struct gensec_security *gensec_security, TALLOC_CTX *mem_ctx,
+                               DATA_BLOB *session_key);
+       NTSTATUS (*session_info)(struct gensec_security *gensec_security, TALLOC_CTX *mem_ctx,
                                 struct auth_session_info **session_info);
        void (*want_feature)(struct gensec_security *gensec_security,
                                    uint32_t feature);
@@ -233,6 +234,7 @@ const char *gensec_get_target_service(struct gensec_security *gensec_security);
 NTSTATUS gensec_set_target_hostname(struct gensec_security *gensec_security, const char *hostname);
 const char *gensec_get_target_hostname(struct gensec_security *gensec_security);
 NTSTATUS gensec_session_key(struct gensec_security *gensec_security,
+                           TALLOC_CTX *mem_ctx,
                            DATA_BLOB *session_key);
 NTSTATUS gensec_start_mech_by_oid(struct gensec_security *gensec_security,
                                  const char *mech_oid);
@@ -269,6 +271,7 @@ NTSTATUS gensec_server_start(TALLOC_CTX *mem_ctx,
                             struct auth4_context *auth_context,
                             struct gensec_security **gensec_security);
 NTSTATUS gensec_session_info(struct gensec_security *gensec_security,
+                            TALLOC_CTX *mem_ctx,
                             struct auth_session_info **session_info);
 
 NTSTATUS gensec_set_local_address(struct gensec_security *gensec_security,
index 4dd809856ceffe6bbc1716d18a2dc19368a0da91..55610f57425ee69308e80e493e47f2027b070c7f 100644 (file)
@@ -169,9 +169,6 @@ static NTSTATUS gensec_gssapi_start(struct gensec_security *gensec_security)
                break;
        }
 
-       gensec_gssapi_state->session_key = data_blob(NULL, 0);
-       gensec_gssapi_state->pac = data_blob(NULL, 0);
-
        ret = smb_krb5_init_context(gensec_gssapi_state,
                                    NULL,
                                    gensec_security->settings->lp_ctx,
@@ -1242,6 +1239,7 @@ static bool gensec_gssapi_have_feature(struct gensec_security *gensec_security,
  * This breaks all the abstractions, but what do you expect...
  */
 static NTSTATUS gensec_gssapi_session_key(struct gensec_security *gensec_security, 
+                                         TALLOC_CTX *mem_ctx,
                                          DATA_BLOB *session_key) 
 {
        struct gensec_gssapi_state *gensec_gssapi_state
@@ -1253,11 +1251,6 @@ static NTSTATUS gensec_gssapi_session_key(struct gensec_security *gensec_securit
                return NT_STATUS_NO_USER_SESSION_KEY;
        }
 
-       if (gensec_gssapi_state->session_key.data) {
-               *session_key = gensec_gssapi_state->session_key;
-               return NT_STATUS_OK;
-       }
-
        maj_stat = gsskrb5_get_subkey(&min_stat,
                                      gensec_gssapi_state->gssapi_context,
                                      &subkey);
@@ -1269,10 +1262,9 @@ static NTSTATUS gensec_gssapi_session_key(struct gensec_security *gensec_securit
        DEBUG(10, ("Got KRB5 session key of length %d%s\n",
                   (int)KRB5_KEY_LENGTH(subkey),
                   (gensec_gssapi_state->sasl_state == STAGE_DONE)?" (done)":""));
-       *session_key = data_blob_talloc(gensec_gssapi_state,
+       *session_key = data_blob_talloc(mem_ctx,
                                        KRB5_KEY_DATA(subkey), KRB5_KEY_LENGTH(subkey));
        krb5_free_keyblock(gensec_gssapi_state->smb_krb5_context->krb5_context, subkey);
-       gensec_gssapi_state->session_key = *session_key;
        dump_data_pw("KRB5 Session Key:\n", session_key->data, session_key->length);
 
        return NT_STATUS_OK;
@@ -1282,6 +1274,7 @@ static NTSTATUS gensec_gssapi_session_key(struct gensec_security *gensec_securit
  * this session.  This uses either the PAC (if present) or a local
  * database lookup */
 static NTSTATUS gensec_gssapi_session_info(struct gensec_security *gensec_security,
+                                          TALLOC_CTX *mem_ctx_out,
                                           struct auth_session_info **_session_info) 
 {
        NTSTATUS nt_status;
@@ -1302,7 +1295,7 @@ static NTSTATUS gensec_gssapi_session_info(struct gensec_security *gensec_securi
                return NT_STATUS_INVALID_PARAMETER;
        }
                
-       mem_ctx = talloc_named(gensec_gssapi_state, 0, "gensec_gssapi_session_info context"); 
+       mem_ctx = talloc_named(mem_ctx_out, 0, "gensec_gssapi_session_info context");
        NT_STATUS_HAVE_NO_MEMORY(mem_ctx);
 
        nt_status = gssapi_obtain_pac_blob(mem_ctx,  gensec_gssapi_state->gssapi_context,
@@ -1391,7 +1384,7 @@ static NTSTATUS gensec_gssapi_session_info(struct gensec_security *gensec_securi
                return nt_status;
        }
 
-       nt_status = gensec_gssapi_session_key(gensec_security, &session_info->session_key);
+       nt_status = gensec_gssapi_session_key(gensec_security, session_info, &session_info->session_key);
        if (!NT_STATUS_IS_OK(nt_status)) {
                talloc_free(mem_ctx);
                return nt_status;
@@ -1436,9 +1429,8 @@ static NTSTATUS gensec_gssapi_session_info(struct gensec_security *gensec_securi
                /* It has been taken from this place... */
                gensec_gssapi_state->delegated_cred_handle = GSS_C_NO_CREDENTIAL;
        }
-       talloc_steal(gensec_gssapi_state, session_info);
+       *_session_info = talloc_steal(mem_ctx_out, session_info);
        talloc_free(mem_ctx);
-       *_session_info = session_info;
 
        return NT_STATUS_OK;
 }
index 1b826b963d797bebe8d15d0bf0e0dfac29e489ea..246fc99a72233ec791e763e92eef1532a9b388a7 100644 (file)
@@ -43,9 +43,6 @@ struct gensec_gssapi_state {
        OM_uint32 want_flags, got_flags;
        gss_OID gss_oid;
 
-       DATA_BLOB session_key;
-       DATA_BLOB pac;
-
        struct smb_krb5_context *smb_krb5_context;
        struct gssapi_creds_container *client_cred;
        struct gssapi_creds_container *server_cred;
index 90794b850c685d7c8d1399f60e8da0840740e5fe..b3a20e4b63d31b4edfda66083b18851b29d40098 100644 (file)
@@ -50,8 +50,6 @@ enum GENSEC_KRB5_STATE {
 };
 
 struct gensec_krb5_state {
-       DATA_BLOB session_key;
-       DATA_BLOB pac;
        enum GENSEC_KRB5_STATE state_position;
        struct smb_krb5_context *smb_krb5_context;
        krb5_auth_context auth_context;
@@ -115,8 +113,6 @@ static NTSTATUS gensec_krb5_start(struct gensec_security *gensec_security, bool
        gensec_krb5_state->ticket = NULL;
        ZERO_STRUCT(gensec_krb5_state->enc_ticket);
        gensec_krb5_state->keyblock = NULL;
-       gensec_krb5_state->session_key = data_blob(NULL, 0);
-       gensec_krb5_state->pac = data_blob(NULL, 0);
        gensec_krb5_state->gssapi = gssapi;
 
        talloc_set_destructor(gensec_krb5_state, gensec_krb5_destroy); 
@@ -559,6 +555,7 @@ static NTSTATUS gensec_krb5_update(struct gensec_security *gensec_security,
 }
 
 static NTSTATUS gensec_krb5_session_key(struct gensec_security *gensec_security, 
+                                       TALLOC_CTX *mem_ctx,
                                        DATA_BLOB *session_key) 
 {
        struct gensec_krb5_state *gensec_krb5_state = (struct gensec_krb5_state *)gensec_security->private_data;
@@ -571,11 +568,6 @@ static NTSTATUS gensec_krb5_session_key(struct gensec_security *gensec_security,
                return NT_STATUS_NO_USER_SESSION_KEY;
        }
 
-       if (gensec_krb5_state->session_key.data) {
-               *session_key = gensec_krb5_state->session_key;
-               return NT_STATUS_OK;
-       }
-
        switch (gensec_security->gensec_role) {
        case GENSEC_CLIENT:
                err = krb5_auth_con_getlocalsubkey(context, auth_context, &skey);
@@ -587,9 +579,8 @@ static NTSTATUS gensec_krb5_session_key(struct gensec_security *gensec_security,
        if (err == 0 && skey != NULL) {
                DEBUG(10, ("Got KRB5 session key of length %d\n",  
                           (int)KRB5_KEY_LENGTH(skey)));
-               gensec_krb5_state->session_key = data_blob_talloc(gensec_krb5_state, 
-                                               KRB5_KEY_DATA(skey), KRB5_KEY_LENGTH(skey));
-               *session_key = gensec_krb5_state->session_key;
+               *session_key = data_blob_talloc(mem_ctx,
+                                              KRB5_KEY_DATA(skey), KRB5_KEY_LENGTH(skey));
                dump_data_pw("KRB5 Session Key:\n", session_key->data, session_key->length);
 
                krb5_free_keyblock(context, skey);
@@ -601,6 +592,7 @@ static NTSTATUS gensec_krb5_session_key(struct gensec_security *gensec_security,
 }
 
 static NTSTATUS gensec_krb5_session_info(struct gensec_security *gensec_security,
+                                        TALLOC_CTX *mem_ctx_out,
                                         struct auth_session_info **_session_info) 
 {
        NTSTATUS nt_status = NT_STATUS_UNSUCCESSFUL;
@@ -618,7 +610,7 @@ static NTSTATUS gensec_krb5_session_info(struct gensec_security *gensec_security
 
        krb5_error_code ret;
 
-       TALLOC_CTX *mem_ctx = talloc_new(gensec_security);
+       TALLOC_CTX *mem_ctx = talloc_new(mem_ctx_out);
        if (!mem_ctx) {
                return NT_STATUS_NO_MEMORY;
        }
@@ -736,16 +728,15 @@ static NTSTATUS gensec_krb5_session_info(struct gensec_security *gensec_security
                return nt_status;
        }
 
-       nt_status = gensec_krb5_session_key(gensec_security, &session_info->session_key);
+       nt_status = gensec_krb5_session_key(gensec_security, session_info, &session_info->session_key);
 
        if (!NT_STATUS_IS_OK(nt_status)) {
                talloc_free(mem_ctx);
                return nt_status;
        }
 
-       *_session_info = session_info;
+       *_session_info = talloc_steal(mem_ctx_out, session_info);
 
-       talloc_steal(gensec_krb5_state, session_info);
        talloc_free(mem_ctx);
        return NT_STATUS_OK;
 }
index 102836533ca80c20ca06c4f24d6c3153c518627b..6a69fd3f9de856d59d31280407737fa9bf47d1ea 100644 (file)
@@ -257,6 +257,7 @@ static PyObject *py_gensec_set_credentials(PyObject *self, PyObject *args)
 
 static PyObject *py_gensec_session_info(PyObject *self)
 {
+       TALLOC_CTX *mem_ctx;
        NTSTATUS status;
        PyObject *py_session_info;
        struct gensec_security *security = py_talloc_get_type(self, struct gensec_security);
@@ -265,7 +266,9 @@ static PyObject *py_gensec_session_info(PyObject *self)
                PyErr_SetString(PyExc_RuntimeError, "no mechanism selected");
                return NULL;
        }
-       status = gensec_session_info(security, &info);
+       mem_ctx = talloc_new(NULL);
+
+       status = gensec_session_info(security, mem_ctx, &info);
        if (NT_STATUS_IS_ERR(status)) {
                PyErr_SetNTSTATUS(status);
                return NULL;
@@ -273,6 +276,7 @@ static PyObject *py_gensec_session_info(PyObject *self)
 
        py_session_info = py_return_ndr_struct("samba.dcerpc.auth", "session_info",
                                                 info, info);
+       talloc_free(mem_ctx);
        return py_session_info;
 }
 
index 8f9aa921a9ba257746185747e075fd2014645f85..67d928e710b639aa170dda08b98fdf456377fd68 100644 (file)
@@ -43,7 +43,8 @@ static size_t schannel_sig_size(struct gensec_security *gensec_security, size_t
 }
 
 static NTSTATUS schannel_session_key(struct gensec_security *gensec_security,
-                                           DATA_BLOB *session_key)
+                                    TALLOC_CTX *mem_ctx,
+                                    DATA_BLOB *session_key)
 {
        return NT_STATUS_NOT_IMPLEMENTED;
 }
@@ -215,10 +216,11 @@ _PUBLIC_ NTSTATUS dcerpc_schannel_creds(struct gensec_security *gensec_security,
  */
 
 static NTSTATUS schannel_session_info(struct gensec_security *gensec_security,
-                                        struct auth_session_info **_session_info)
+                                     TALLOC_CTX *mem_ctx,
+                                     struct auth_session_info **_session_info)
 {
        struct schannel_state *state = talloc_get_type(gensec_security->private_data, struct schannel_state);
-       return auth_anonymous_session_info(state, gensec_security->settings->lp_ctx, _session_info);
+       return auth_anonymous_session_info(mem_ctx, gensec_security->settings->lp_ctx, _session_info);
 }
 
 static NTSTATUS schannel_start(struct gensec_security *gensec_security)
index c48e87e8b5866063f775b1da79caef00718e54e7..66204ee26217adfb8c82b149a440539d58cd08b8 100644 (file)
@@ -295,6 +295,7 @@ static size_t gensec_spnego_max_wrapped_size(struct gensec_security *gensec_secu
 }
 
 static NTSTATUS gensec_spnego_session_key(struct gensec_security *gensec_security, 
+                                         TALLOC_CTX *mem_ctx,
                                          DATA_BLOB *session_key)
 {
        struct spnego_state *spnego_state = (struct spnego_state *)gensec_security->private_data;
@@ -303,11 +304,13 @@ static NTSTATUS gensec_spnego_session_key(struct gensec_security *gensec_securit
        }
        
        return gensec_session_key(spnego_state->sub_sec_security, 
+                                 mem_ctx,
                                  session_key);
 }
 
 static NTSTATUS gensec_spnego_session_info(struct gensec_security *gensec_security,
-                                                                     struct auth_session_info **session_info) 
+                                          TALLOC_CTX *mem_ctx,
+                                          struct auth_session_info **session_info)
 {
        struct spnego_state *spnego_state = (struct spnego_state *)gensec_security->private_data;
        if (!spnego_state->sub_sec_security) {
@@ -315,6 +318,7 @@ static NTSTATUS gensec_spnego_session_info(struct gensec_security *gensec_securi
        }
        
        return gensec_session_info(spnego_state->sub_sec_security, 
+                                  mem_ctx,
                                   session_info);
 }
 
index 1a15d319a95f0a5f2939b95a5b2e51c304accd40..a53e5547ab21b7f13cfec6ab99d36b425e2ca9bd 100644 (file)
@@ -181,6 +181,7 @@ static NTSTATUS gensec_ntlmssp_update(struct gensec_security *gensec_security,
  */
 
 NTSTATUS gensec_ntlmssp_session_key(struct gensec_security *gensec_security, 
+                                   TALLOC_CTX *mem_ctx,
                                    DATA_BLOB *session_key)
 {
        struct gensec_ntlmssp_context *gensec_ntlmssp =
@@ -195,7 +196,10 @@ NTSTATUS gensec_ntlmssp_session_key(struct gensec_security *gensec_security,
        if (!ntlmssp_state->session_key.data) {
                return NT_STATUS_NO_USER_SESSION_KEY;
        }
-       *session_key = ntlmssp_state->session_key;
+       *session_key = data_blob_talloc(mem_ctx, ntlmssp_state->session_key.data, ntlmssp_state->session_key.length);
+       if (!session_key->data) {
+               return NT_STATUS_NO_MEMORY;
+       }
 
        return NT_STATUS_OK;
 }
index 240edbeaadbafa6418db1e784fc8831f4b80bd74..477972d1d40969caeb232dd905bc6ed845ab6a69 100644 (file)
@@ -213,6 +213,7 @@ static NTSTATUS auth_ntlmssp_check_password(struct ntlmssp_state *ntlmssp_state,
  */
 
 NTSTATUS gensec_ntlmssp_session_info(struct gensec_security *gensec_security,
+                                    TALLOC_CTX *mem_ctx,
                                     struct auth_session_info **session_info) 
 {
        NTSTATUS nt_status;
@@ -221,17 +222,14 @@ NTSTATUS gensec_ntlmssp_session_info(struct gensec_security *gensec_security,
                                      struct gensec_ntlmssp_context);
        struct ntlmssp_state *ntlmssp_state = gensec_ntlmssp->ntlmssp_state;
 
-       nt_status = gensec_generate_session_info(ntlmssp_state,
+       nt_status = gensec_generate_session_info(mem_ctx,
                                                 gensec_security,
                                                 gensec_ntlmssp->user_info_dc,
                                                 session_info);
        NT_STATUS_NOT_OK_RETURN(nt_status);
 
-       (*session_info)->session_key = data_blob_talloc(*session_info, 
-                                                       ntlmssp_state->session_key.data,
-                                                       ntlmssp_state->session_key.length);
-
-       return NT_STATUS_OK;
+       return gensec_ntlmssp_session_key(gensec_security, *session_info,
+                                         &(*session_info)->session_key);
 }
 
 /**
index ebf2f77708123540aad734f79c84ebc52bae3a8e..7b513a805034e46c34967b4c58afe34305bbf3bd 100644 (file)
@@ -114,6 +114,7 @@ static void dreplsrv_out_drsuapi_connect_done(struct composite_context *creq)
        state->drsuapi->drsuapi_handle = state->drsuapi->pipe->binding_handle;
 
        status = gensec_session_key(state->drsuapi->pipe->conn->security_state.generic_state,
+                                   state->drsuapi,
                                    &state->drsuapi->gensec_skey);
        if (tevent_req_nterror(req, status)) {
                return;
index 5d288f69a7497f53d4f7c510a53ad33fdd768aec..478dcaf573249bc0f16d01cd96aeed7dce654382 100644 (file)
@@ -227,6 +227,7 @@ static bool kpasswd_process_request(struct kdc_server *kdc,
        size_t pw_len;
 
        if (!NT_STATUS_IS_OK(gensec_session_info(gensec_security,
+                                                mem_ctx,
                                                 &session_info))) {
                return kpasswdd_make_error_reply(kdc, mem_ctx,
                                                KRB5_KPASSWD_HARDERROR,
index 105e64078fd8e5fa75120fbd3c5ee211f1cb618c..fd7deda49903bb916d036c9619ae104fcb5bd63e 100644 (file)
@@ -68,8 +68,7 @@ static NTSTATUS ldapsrv_BindSimple(struct ldapsrv_call *call)
                errstr = NULL;
 
                talloc_unlink(call->conn, call->conn->session_info);
-               call->conn->session_info = session_info;
-               talloc_steal(call->conn, session_info);
+               call->conn->session_info = talloc_steal(call->conn, session_info);
 
                /* don't leak the old LDB */
                talloc_unlink(call->conn, call->conn->ldb);
@@ -277,7 +276,7 @@ static NTSTATUS ldapsrv_BindSASL(struct ldapsrv_call *call)
 
                        old_session_info = conn->session_info;
                        conn->session_info = NULL;
-                       status = gensec_session_info(conn->gensec, &conn->session_info);
+                       status = gensec_session_info(conn->gensec, conn, &conn->session_info);
                        if (!NT_STATUS_IS_OK(status)) {
                                conn->session_info = old_session_info;
                                result = LDAP_OPERATIONS_ERROR;
@@ -286,7 +285,6 @@ static NTSTATUS ldapsrv_BindSASL(struct ldapsrv_call *call)
                                                         req->creds.SASL.mechanism, nt_errstr(status));
                        } else {
                                talloc_unlink(conn, old_session_info);
-                               talloc_steal(conn, conn->session_info);
                                
                                /* don't leak the old LDB */
                                talloc_unlink(conn, conn->ldb);
index d46cdefc69a2c49a9a8554da41c438cdae8a6a35..0f749a0b6c2f1a31ca6fc02406b979b7844201cd 100644 (file)
@@ -233,8 +233,6 @@ static void smb2_session_setup_spnego_handler(struct smb2_request *subreq)
                tevent_req_data(req,
                struct smb2_session_setup_spnego_state);
        struct smb2_session *session = subreq->session;
-       NTSTATUS session_key_err;
-       DATA_BLOB session_key;
        NTSTATUS peer_status;
        NTSTATUS status;
 
@@ -267,10 +265,7 @@ static void smb2_session_setup_spnego_handler(struct smb2_request *subreq)
                return;
        }
 
-       session_key_err = gensec_session_key(session->gensec, &session_key);
-       if (NT_STATUS_IS_OK(session_key_err)) {
-               session->session_key = session_key;
-       }
+       gensec_session_key(session->gensec, session, &session->session_key);
 
        if (session->transport->signing_required) {
                if (session->session_key.length == 0) {
index ebc35983d213a00ca3b1134a39ee0d9f660494ac..d617055c41cafbfec42621197043862ad0de1b0a 100644 (file)
@@ -200,10 +200,9 @@ static void request_handler(struct smbcli_request *req)
                                c->status = NT_STATUS_INTERNAL_ERROR;
                                break;
                        }
-                       session_key_err = gensec_session_key(session->gensec, &session_key);
+                       session_key_err = gensec_session_key(session->gensec, session, &session->user_session_key);
                        if (NT_STATUS_IS_OK(session_key_err)) {
-                               set_user_session_key(session, &session_key);
-                               smbcli_transport_simple_set_signing(session->transport, session_key, null_data_blob);
+                               smbcli_transport_simple_set_signing(session->transport, session->user_session_key, null_data_blob);
                        }
                }
 
index 4d845ca1f088a837f5913692a0171178cf195b6d..aabb3b41a8b139d949e77909c6113365821b209c 100644 (file)
@@ -1595,6 +1595,7 @@ static void becomeDC_drsuapi1_connect_recv(struct composite_context *req)
        s->drsuapi1.drsuapi_handle = s->drsuapi1.pipe->binding_handle;
 
        c->status = gensec_session_key(s->drsuapi1.pipe->conn->security_state.generic_state,
+                                      s,
                                       &s->drsuapi1.gensec_skey);
        if (!composite_is_ok(c)) return;
 
@@ -2475,6 +2476,7 @@ static void becomeDC_drsuapi2_connect_recv(struct composite_context *req)
        s->drsuapi2.drsuapi_handle = s->drsuapi2.pipe->binding_handle;
 
        c->status = gensec_session_key(s->drsuapi2.pipe->conn->security_state.generic_state,
+                                      s,
                                       &s->drsuapi2.gensec_skey);
        if (!composite_is_ok(c)) return;
 
@@ -2535,6 +2537,7 @@ static void becomeDC_drsuapi3_connect_recv(struct composite_context *req)
        s->drsuapi3.drsuapi_handle = s->drsuapi3.pipe->binding_handle;
 
        c->status = gensec_session_key(s->drsuapi3.pipe->conn->security_state.generic_state,
+                                      s,
                                       &s->drsuapi3.gensec_skey);
        if (!composite_is_ok(c)) return;
 
index fdf21592ad7eeb3edd39c6e75c7931ea831670de..90fa1d56d665ec10841a1c43f042d57393d7bbdf 100644 (file)
@@ -434,6 +434,7 @@ static PyObject *py_net_replicate_init(py_net_Object *self, PyObject *args, PyOb
        }
 
        status = gensec_session_key(s->drs_pipe->pipe->conn->security_state.generic_state,
+                                   s,
                                    &s->gensec_skey);
        if (!NT_STATUS_IS_OK(status)) {
                PyErr_Format(PyExc_RuntimeError, "Unable to get session key from drspipe: %s",
index 0802cd4323de251408a387d778b9e785b35cd2e9..ee7a86ab853e931191f091d86812a22db08877f5 100644 (file)
@@ -119,6 +119,7 @@ NTSTATUS dcesrv_auth_bind_ack(struct dcesrv_call_state *call, struct ncacn_packe
        
        if (NT_STATUS_IS_OK(status)) {
                status = gensec_session_info(dce_conn->auth_state.gensec_security,
+                                            dce_conn,
                                             &dce_conn->auth_state.session_info);
                if (!NT_STATUS_IS_OK(status)) {
                        DEBUG(1, ("Failed to establish session_info: %s\n", nt_errstr(status)));
@@ -175,6 +176,7 @@ bool dcesrv_auth_auth3(struct dcesrv_call_state *call)
                               &dce_conn->auth_state.auth_info->credentials);
        if (NT_STATUS_IS_OK(status)) {
                status = gensec_session_info(dce_conn->auth_state.gensec_security,
+                                            dce_conn,
                                             &dce_conn->auth_state.session_info);
                if (!NT_STATUS_IS_OK(status)) {
                        DEBUG(1, ("Failed to establish session_info: %s\n", nt_errstr(status)));
@@ -254,6 +256,7 @@ NTSTATUS dcesrv_auth_alter_ack(struct dcesrv_call_state *call, struct ncacn_pack
 
        if (NT_STATUS_IS_OK(status)) {
                status = gensec_session_info(dce_conn->auth_state.gensec_security,
+                                            dce_conn,
                                             &dce_conn->auth_state.session_info);
                if (!NT_STATUS_IS_OK(status)) {
                        DEBUG(1, ("Failed to establish session_info: %s\n", nt_errstr(status)));
index 116f2cd958473ff51773fb7811518655a343067f..c84be7f79b055b8c376304466133ceea5f63c9bf 100644 (file)
@@ -379,10 +379,11 @@ static void sesssetup_spnego_send(struct tevent_req *subreq)
                goto failed;
        }
 
-       status = gensec_session_info(smb_sess->gensec_ctx, &session_info);
+       status = gensec_session_info(smb_sess->gensec_ctx, smb_sess, &session_info);
        if (!NT_STATUS_IS_OK(status)) goto failed;
 
-       skey_status = gensec_session_key(smb_sess->gensec_ctx, &session_key);
+       /* The session_key is only needed until the end of the smbsrv_setup_signing() call */
+       skey_status = gensec_session_key(smb_sess->gensec_ctx, req, &session_key);
        if (NT_STATUS_IS_OK(skey_status)) {
                smbsrv_setup_signing(req->smb_conn, &session_key, NULL);
        }
index 94fe0da9fadc18b81f9336708c3fbbc93dbddaeb..60e5500ee75984dc574f533b85aed4ccb4f03dae 100644 (file)
@@ -79,7 +79,7 @@ static void smb2srv_sesssetup_callback(struct tevent_req *subreq)
                goto failed;
        }
 
-       status = gensec_session_info(smb_sess->gensec_ctx, &session_info);
+       status = gensec_session_info(smb_sess->gensec_ctx, smb_sess, &session_info);
        if (!NT_STATUS_IS_OK(status)) {
                goto failed;
        }
index 8279e736b19357e9e9ccced144118ad449895915..7149da4a856c3638c7c5269f3fed5a5c3179a11f 100644 (file)
@@ -678,7 +678,7 @@ static bool test_GetNCChanges(struct torture_context *tctx,
                }
        }
        status = gensec_session_key(ctx->new_dc.drsuapi.drs_pipe->conn->security_state.generic_state,
-                                   &gensec_skey);
+                                   ctx, &gensec_skey);
        if (!NT_STATUS_IS_OK(status)) {
                printf("failed to get gensec session key: %s\n", nt_errstr(status));
                return false;
index 14c6454abe14b33e36c333265143de8a0088754e..c866c2181b8f400302d2adbeafb93b4070dc6848 100644 (file)
@@ -185,7 +185,7 @@ static bool _test_DsaBind(struct torture_context *tctx,
        bi->drs_handle = bi->drs_pipe->binding_handle;
 
        status = gensec_session_key(bi->drs_pipe->conn->security_state.generic_state,
-                                   &bi->gensec_skey);
+                                   mem_ctx, &bi->gensec_skey);
        torture_assert_ntstatus_ok(tctx, status, "failed to get gensec session key");
 
        /* Bind to DRSUAPI interface */
index 37fb8af1478af83a3b6e35d714e59e9f13306667..88a40b4fe4d8ff3f9014a504b5f07632865b3f97 100644 (file)
@@ -129,7 +129,7 @@ static bool test_PACVerify(struct torture_context *tctx,
 
        /* Extract the PAC using Samba's code */
 
-       status = gensec_session_info(gensec_server_context, &session_info);
+       status = gensec_session_info(gensec_server_context, gensec_server_context, &session_info);
        torture_assert_ntstatus_ok(tctx, status, "gensec_session_info failed");
        torture_assert(tctx, session_info->torture != NULL, "gensec_session_info failed to fill in torture sub struct");
        torture_assert(tctx, session_info->torture->pac_srv_sig != NULL, "pac_srv_sig not present");
@@ -468,7 +468,7 @@ static bool test_S2U4Self(struct torture_context *tctx,
 
        /* Extract the PAC using Samba's code */
 
-       status = gensec_session_info(gensec_server_context, &kinit_session_info);
+       status = gensec_session_info(gensec_server_context, gensec_server_context, &kinit_session_info);
        torture_assert_ntstatus_ok(tctx, status, "gensec_session_info failed");
 
 
@@ -530,7 +530,7 @@ static bool test_S2U4Self(struct torture_context *tctx,
 
        /* Extract the PAC using Samba's code */
 
-       status = gensec_session_info(gensec_server_context, &s2u4self_session_info);
+       status = gensec_session_info(gensec_server_context, gensec_server_context, &s2u4self_session_info);
        torture_assert_ntstatus_ok(tctx, status, "gensec_session_info failed");
 
        cli_credentials_get_ntlm_username_domain(cmdline_credentials, tctx,
index d5c385cbc68a9f4660893efe47638729686fb532..465d9b59829231a0cf4f9d87c796b0629b704ea6 100644 (file)
@@ -575,7 +575,7 @@ static void manage_gensec_request(enum stdio_helper_mode stdio_helper_mode,
                char *grouplist = NULL;
                struct auth_session_info *session_info;
 
-               nt_status = gensec_session_info(state->gensec_state, &session_info); 
+               nt_status = gensec_session_info(state->gensec_state, mem_ctx, &session_info);
                if (!NT_STATUS_IS_OK(nt_status)) {
                        DEBUG(1, ("gensec_session_info failed: %s\n", nt_errstr(nt_status)));
                        mux_printf(mux_id, "BH %s\n", nt_errstr(nt_status));
@@ -604,7 +604,7 @@ static void manage_gensec_request(enum stdio_helper_mode stdio_helper_mode,
        if (strncmp(buf, "GK", 2) == 0) {
                char *base64_key;
                DEBUG(10, ("Requested session key\n"));
-               nt_status = gensec_session_key(state->gensec_state, &session_key);
+               nt_status = gensec_session_key(state->gensec_state, mem_ctx, &session_key);
                if(!NT_STATUS_IS_OK(nt_status)) {
                        DEBUG(1, ("gensec_session_key failed: %s\n", nt_errstr(nt_status)));
                        mux_printf(mux_id, "BH No session key\n");
@@ -671,7 +671,7 @@ static void manage_gensec_request(enum stdio_helper_mode stdio_helper_mode,
        } else if /* OK */ (state->gensec_state->gensec_role == GENSEC_SERVER) {
                struct auth_session_info *session_info;
 
-               nt_status = gensec_session_info(state->gensec_state, &session_info);
+               nt_status = gensec_session_info(state->gensec_state, mem_ctx, &session_info);
                if (!NT_STATUS_IS_OK(nt_status)) {
                        reply_code = "BH Failed to retrive session info";
                        reply_arg = nt_errstr(nt_status);