more cleanups, locking-related
authorLuke Howard <lukeh@padl.com>
Fri, 1 Oct 2010 01:22:30 +0000 (03:22 +0200)
committerLuke Howard <lukeh@padl.com>
Fri, 1 Oct 2010 01:22:30 +0000 (03:22 +0200)
14 files changed:
acquire_cred.c
acquire_cred_with_password.c
context_time.c
delete_sec_context.c
inquire_cred_by_oid.c
inquire_name.c
mech_invoke.c
process_context_token.c
pseudo_random.c
release_any_name_mapping.c
set_sec_context_option.c
store_cred.c
unwrap_iov.c
wrap.c

index 710723c..c85966e 100644 (file)
@@ -42,8 +42,6 @@ gss_acquire_cred(OM_uint32 *minor,
                  gss_OID_set *actual_mechs,
                  OM_uint32 *time_rec)
 {
-    *minor = 0;
-
     return gssEapAcquireCred(minor, desired_name, GSS_C_NO_BUFFER,
                              time_req, desired_mechs, cred_usage,
                              output_cred_handle, actual_mechs, time_rec);
index ab29f3a..f86d3ba 100644 (file)
@@ -43,8 +43,6 @@ gssspi_acquire_cred_with_password(OM_uint32 *minor,
                                   gss_OID_set *actual_mechs,
                                   OM_uint32 *time_rec)
 {
-    *minor = 0;
-
     return gssEapAcquireCred(minor, desired_name, password,
                              time_req, desired_mechs, cred_usage,
                              output_cred_handle, actual_mechs, time_rec);
index b72dcf0..a2373f9 100644 (file)
@@ -37,7 +37,7 @@ gss_context_time(OM_uint32 *minor,
                  gss_ctx_id_t ctx,
                  OM_uint32 *time_rec)
 {
-    OM_uint32 major;
+    OM_uint32 major = GSS_S_NO_CONTEXT;
 
     *minor = 0;
 
@@ -46,14 +46,10 @@ gss_context_time(OM_uint32 *minor,
 
     GSSEAP_MUTEX_LOCK(&ctx->mutex);
 
-    if (!CTX_IS_ESTABLISHED(ctx)) {
-        major = GSS_S_NO_CONTEXT;
-        goto cleanup;
+    if (CTX_IS_ESTABLISHED(ctx)) {
+        major = gssEapContextTime(minor, ctx, time_rec);
     }
 
-    major = gssEapContextTime(minor, ctx, time_rec);
-
-cleanup:
     GSSEAP_MUTEX_UNLOCK(&ctx->mutex);
 
     return major;
index 75b09f1..cb3e0eb 100644 (file)
@@ -65,8 +65,10 @@ gss_delete_sec_context(OM_uint32 *minor,
 
         major = gssEapWrapOrGetMIC(minor, ctx, FALSE, FALSE,
                                    iov, 2, TOK_TYPE_DELETE_CONTEXT);
-        if (GSS_ERROR(major))
+        if (GSS_ERROR(major)) {
+            GSSEAP_MUTEX_UNLOCK(&ctx->mutex);
             return major;
+        }
     }
 
     GSSEAP_MUTEX_UNLOCK(&ctx->mutex);
index 4d42b08..569b7b5 100644 (file)
@@ -48,8 +48,14 @@ gss_inquire_cred_by_oid(OM_uint32 *minor,
     OM_uint32 major = GSS_S_UNAVAILABLE;
     int i;
 
+    *minor = 0;
     *data_set = GSS_C_NO_BUFFER_SET;
 
+    if (cred_handle == GSS_C_NO_CREDENTIAL)
+        return GSS_S_NO_CRED;
+
+    GSSEAP_MUTEX_LOCK(&cred_handle->mutex);
+
     for (i = 0; i < sizeof(inquireCredOps) / sizeof(inquireCredOps[0]); i++) {
         if (oidEqual(&inquireCredOps[i].oid, desired_object)) {
             major = (*inquireCredOps[i].inquire)(minor, cred_handle,
@@ -58,5 +64,7 @@ gss_inquire_cred_by_oid(OM_uint32 *minor,
         }
     }
 
+    GSSEAP_MUTEX_UNLOCK(&cred_handle->mutex);
+
     return major;
 }
index 586e862..1cd8f73 100644 (file)
@@ -40,6 +40,8 @@ OM_uint32 gss_inquire_name(OM_uint32 *minor,
 {
     OM_uint32 major, tmpMinor;
 
+    *minor = 0;
+
     if (name_is_MN != NULL)
         *name_is_MN = 1;
     if (MN_mech != NULL)
index e306c0c..ab7fa69 100644 (file)
@@ -39,5 +39,6 @@ gssspi_mech_invoke(OM_uint32 *minor,
                    gss_buffer_t value)
 {
     *minor = 0;
+
     return GSS_S_UNAVAILABLE;
 }
index 201a2a7..32e657c 100644 (file)
@@ -40,7 +40,15 @@ gss_process_context_token(OM_uint32 *minor,
     OM_uint32 major;
     gss_iov_buffer_desc iov[1];
 
+    *minor = 0;
+
+    if (ctx == NULL)
+        return GSS_S_NO_CONTEXT;
+
+    GSSEAP_MUTEX_LOCK(&ctx->mutex);
+
     if (!CTX_IS_ESTABLISHED(ctx)) {
+        GSSEAP_MUTEX_UNLOCK(&ctx->mutex);
         return GSS_S_NO_CONTEXT;
     }
 
@@ -49,8 +57,12 @@ gss_process_context_token(OM_uint32 *minor,
 
     major = gssEapUnwrapOrVerifyMIC(minor, ctx, NULL, NULL,
                                     iov, 1, TOK_TYPE_DELETE_CONTEXT);
-    if (GSS_ERROR(major))
+    if (GSS_ERROR(major)) {
+        GSSEAP_MUTEX_UNLOCK(&ctx->mutex);
         return major;
+    }
+
+    GSSEAP_MUTEX_UNLOCK(&ctx->mutex);
 
     return gssEapReleaseContext(minor, &ctx);
 }
index ce93507..05acbcb 100644 (file)
@@ -71,11 +71,20 @@ gss_pseudo_random(OM_uint32 *minor,
     unsigned char *p;
     krb5_context krbContext;
 
+    *minor = 0;
+
     prf_out->length = 0;
     prf_out->value = NULL;
 
-    if (!CTX_IS_ESTABLISHED(ctx))
+    if (ctx == GSS_C_NO_CONTEXT)
+        return GSS_S_NO_CONTEXT;
+
+    GSSEAP_MUTEX_LOCK(&ctx->mutex);
+
+    if (!CTX_IS_ESTABLISHED(ctx)) {
+        GSSEAP_MUTEX_UNLOCK(&ctx->mutex);
         return GSS_S_NO_CONTEXT;
+    }
 
     GSSEAP_KRB_INIT(&krbContext);
 
@@ -85,7 +94,7 @@ gss_pseudo_random(OM_uint32 *minor,
     ns.length = 0;
     ns.data = NULL;
 
-    if (prf_key != GSS_C_PRF_KEY_FULL &&
+    if (prf_key != GSS_C_PRF_KEY_PARTIAL &&
         prf_key != GSS_C_PRF_KEY_FULL) {
         code = EINVAL;
         goto cleanup;
@@ -136,12 +145,14 @@ gss_pseudo_random(OM_uint32 *minor,
     }
 
 cleanup:
+    GSSEAP_MUTEX_UNLOCK(&ctx->mutex);
+
     if (code != 0)
         gss_release_buffer(&tmpMinor, prf_out);
     krb5_free_data_contents(krbContext, &ns);
     krb5_free_data_contents(krbContext, &t);
 
     *minor = code;
+
     return (code == 0) ? GSS_S_COMPLETE : GSS_S_FAILURE;
 }
-
index c2d8ede..8ac29a0 100644 (file)
@@ -40,6 +40,8 @@ gss_release_any_name_mapping(OM_uint32 *minor,
 {
     OM_uint32 major;
 
+    *minor = 0;
+
     if (name == GSS_C_NO_NAME) {
         *minor = EINVAL;
         return GSS_S_CALL_INACCESSIBLE_READ | GSS_S_BAD_NAME;
index 07ad740..b4872ca 100644 (file)
@@ -46,15 +46,24 @@ gss_set_sec_context_option(OM_uint32 *minor,
                            const gss_buffer_t value)
 {
     OM_uint32 major = GSS_S_UNAVAILABLE;
+    gss_ctx_id_t ctx = *pCtx;
     int i;
 
+    if (ctx != GSS_C_NO_CONTEXT)
+        GSSEAP_MUTEX_LOCK(&ctx->mutex);
+
     for (i = 0; i < sizeof(setCtxOps) / sizeof(setCtxOps[0]); i++) {
         if (oidEqual(&setCtxOps[i].oid, desired_object)) {
-            major = (*setCtxOps[i].setOption)(minor, pCtx,
+            major = (*setCtxOps[i].setOption)(minor, &ctx,
                                               desired_object, value);
             break;
         }
     }
 
+    if (*pCtx == NULL)
+        *pCtx = ctx;
+    else
+        GSSEAP_MUTEX_UNLOCK(&ctx->mutex);
+
     return major;
 }
index 3c04d42..43cab99 100644 (file)
@@ -34,7 +34,7 @@
 
 OM_uint32
 gss_store_cred(OM_uint32 *minor,
-               const gss_cred_id_t input_cred_handle,
+               const gss_cred_id_t cred,
                gss_cred_usage_t input_usage,
                const gss_OID desired_mech,
                OM_uint32 overwrite_cred,
@@ -42,27 +42,34 @@ gss_store_cred(OM_uint32 *minor,
                gss_OID_set *elements_stored,
                gss_cred_usage_t *cred_usage_stored)
 {
+    OM_uint32 major = GSS_S_UNAVAILABLE;
+
+    *minor = 0;
+
     if (elements_stored != NULL)
         *elements_stored = GSS_C_NO_OID_SET;
     if (cred_usage_stored != NULL)
         *cred_usage_stored = input_usage;
 
-    if (input_cred_handle == GSS_C_NO_CREDENTIAL)
+    if (cred == GSS_C_NO_CREDENTIAL)
         return GSS_S_CALL_INACCESSIBLE_READ | GSS_S_NO_CRED;
 
+    GSSEAP_MUTEX_LOCK(&cred->mutex);
+
 #ifdef GSSEAP_ENABLE_REAUTH
-    if (input_cred_handle->krbCred != GSS_C_NO_CREDENTIAL) {
-        return gssStoreCred(minor,
-                            input_cred_handle->krbCred,
-                            input_usage,
-                            (gss_OID)gss_mech_krb5,
-                            overwrite_cred,
-                            default_cred,
-                            elements_stored,
-                            cred_usage_stored);
+    if (cred->krbCred != GSS_C_NO_CREDENTIAL) {
+        major = gssStoreCred(minor,
+                             cred->krbCred,
+                             input_usage,
+                             (gss_OID)gss_mech_krb5,
+                             overwrite_cred,
+                             default_cred,
+                             elements_stored,
+                             cred_usage_stored);
     }
 #endif
 
-    *minor = 0;
-    return GSS_S_UNAVAILABLE;
+    GSSEAP_MUTEX_UNLOCK(&cred->mutex);
+
+    return major;
 }
index e096d68..dcb1ff1 100644 (file)
@@ -485,17 +485,16 @@ gss_unwrap_iov(OM_uint32 *minor,
                gss_iov_buffer_desc *iov,
                int iov_count)
 {
-    OM_uint32 major;
+    OM_uint32 major = GSS_C_NO_CONTEXT;
+
+    *minor = 0;
 
     if (ctx == GSS_C_NO_CONTEXT)
         return GSS_S_NO_CONTEXT;
 
     GSSEAP_MUTEX_LOCK(&ctx->mutex);
 
-    if (!CTX_IS_ESTABLISHED(ctx)) {
-        *minor = 0;
-        major = GSS_S_NO_CONTEXT;
-    } else {
+    if (CTX_IS_ESTABLISHED(ctx)) {
         major = gssEapUnwrapOrVerifyMIC(minor, ctx, conf_state, qop_state,
                                         iov, iov_count, TOK_TYPE_WRAP);
     }
diff --git a/wrap.c b/wrap.c
index 3ee6c2a..90e2059 100644 (file)
--- a/wrap.c
+++ b/wrap.c
@@ -41,17 +41,16 @@ gss_wrap(OM_uint32 *minor,
          int *conf_state,
          gss_buffer_t output_message_buffer)
 {
-    OM_uint32 major;
+    OM_uint32 major = GSS_C_NO_CONTEXT;
+
+    *minor = 0;
 
     if (ctx == GSS_C_NO_CONTEXT)
         return GSS_S_NO_CONTEXT;
 
     GSSEAP_MUTEX_LOCK(&ctx->mutex);
 
-    if (!CTX_IS_ESTABLISHED(ctx)) {
-        *minor = 0;
-        major = GSS_S_NO_CONTEXT;
-    } else {
+    if (CTX_IS_ESTABLISHED(ctx)) {
         major = gssEapWrap(minor, ctx, conf_req_flag, qop_req,
                            input_message_buffer,
                            conf_state, output_message_buffer);