summaryrefslogtreecommitdiff
path: root/source4
diff options
context:
space:
mode:
authorAndrew Bartlett <abartlet@samba.org>2007-08-09 06:26:19 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 15:01:35 -0500
commit233e4f72d63e074692662ac4f6a523ad8a893c57 (patch)
tree4e1bb8beeb820d5a5616a4e38dce606a74a171a5 /source4
parent9fd3416452ac82d27dac7b8c16f6ad89f5551f6b (diff)
downloadsamba-233e4f72d63e074692662ac4f6a523ad8a893c57.tar.gz
samba-233e4f72d63e074692662ac4f6a523ad8a893c57.tar.bz2
samba-233e4f72d63e074692662ac4f6a523ad8a893c57.zip
r24282: Try to fix the occasional Samba4 crash in BASE-BENCH-READWRITE, as
seen in particular on opi. This looked like a Heimdal problem, but I think it was simply that we didn't do a talloc_reference() to keep tabs on the memory we were using, and in between obtaining the pointer and using it, it was assigned to unrelated memory. Andrew Bartlett (This used to be commit a650ad8b37d58ba64458a33313714d1abfc4850b)
Diffstat (limited to 'source4')
-rw-r--r--source4/auth/credentials/credentials_krb5.c10
-rw-r--r--source4/auth/gensec/gensec_gssapi.c5
2 files changed, 10 insertions, 5 deletions
diff --git a/source4/auth/credentials/credentials_krb5.c b/source4/auth/credentials/credentials_krb5.c
index ab850c1307..2b5a5fe7f1 100644
--- a/source4/auth/credentials/credentials_krb5.c
+++ b/source4/auth/credentials/credentials_krb5.c
@@ -259,7 +259,8 @@ int cli_credentials_get_ccache(struct cli_credentials *cred,
cli_credentials_set_machine_account(cred);
}
- if (cred->ccache_obtained >= cred->ccache_threshold) {
+ if (cred->ccache_obtained >= cred->ccache_threshold &&
+ cred->ccache_obtained > CRED_UNINITIALISED) {
*ccc = cred->ccache;
return 0;
}
@@ -298,7 +299,7 @@ void cli_credentials_invalidate_client_gss_creds(struct cli_credentials *cred,
* any cached credentials are now invalid */
if (obtained >= cred->client_gss_creds_obtained) {
if (cred->client_gss_creds_obtained > CRED_UNINITIALISED) {
- talloc_free(cred->client_gss_creds);
+ talloc_unlink(cred, cred->client_gss_creds);
cred->client_gss_creds = NULL;
}
cred->client_gss_creds_obtained = CRED_UNINITIALISED;
@@ -319,7 +320,7 @@ void cli_credentials_invalidate_ccache(struct cli_credentials *cred,
* any cached credentials are now invalid */
if (obtained >= cred->ccache_obtained) {
if (cred->ccache_obtained > CRED_UNINITIALISED) {
- talloc_free(cred->ccache);
+ talloc_unlink(cred, cred->ccache);
cred->ccache = NULL;
}
cred->ccache_obtained = CRED_UNINITIALISED;
@@ -350,7 +351,8 @@ int cli_credentials_get_client_gss_creds(struct cli_credentials *cred,
OM_uint32 maj_stat, min_stat;
struct gssapi_creds_container *gcc;
struct ccache_container *ccache;
- if (cred->client_gss_creds_obtained >= cred->client_gss_creds_threshold) {
+ if (cred->client_gss_creds_obtained >= cred->client_gss_creds_threshold &&
+ cred->client_gss_creds_obtained > CRED_UNINITIALISED) {
*_gcc = cred->client_gss_creds;
return 0;
}
diff --git a/source4/auth/gensec/gensec_gssapi.c b/source4/auth/gensec/gensec_gssapi.c
index a9076845ba..3c66a032d5 100644
--- a/source4/auth/gensec/gensec_gssapi.c
+++ b/source4/auth/gensec/gensec_gssapi.c
@@ -370,7 +370,10 @@ static NTSTATUS gensec_gssapi_client_start(struct gensec_security *gensec_securi
}
gensec_gssapi_state->client_cred = gcc;
-
+ if (!talloc_reference(gensec_gssapi_state, gcc)) {
+ return NT_STATUS_NO_MEMORY;
+ }
+
return NT_STATUS_OK;
}