if (principal == NULL)
return EINVAL;
- *name = (krb5_gss_name_t)xmalloc(sizeof(krb5_gss_name_rec));
+ *name = xmalloc(sizeof(krb5_gss_name_rec));
if (*name == NULL) {
return ENOMEM;
}
- (*name)->princ = NULL;
- (*name)->ad_context = NULL;
+ memset(*name, 0, sizeof(krb5_gss_name_rec));
+
+ code = k5_mutex_init(&(*name)->lock);
+ if (code != 0)
+ goto cleanup;
if ((flags & KG_INIT_NAME_NO_COPY) == 0) {
code = krb5_copy_principal(context, principal, &(*name)->princ);
kg_delete_name((gss_name_t)*name);
krb5_free_principal(context, (*name)->princ);
krb5_authdata_context_free(context, (*name)->ad_context);
+ k5_mutex_destroy(&(*name)->lock);
free(*name);
*name = NULL;
}
data = *pdata;
if (data == NULL) {
- *buffer_set = GSS_C_NO_BUFFER_SET;
+ if (buffer_set != NULL)
+ *buffer_set = GSS_C_NO_BUFFER_SET;
return 0;
- }
+ } else if (buffer_set == NULL)
+ return EINVAL;
if (GSS_ERROR(gss_create_empty_buffer_set(&minor_status,
&set)))
if (minor_status != NULL)
*minor_status = 0;
- *authenticated = GSS_C_NO_BUFFER_SET;
- *asserted = GSS_C_NO_BUFFER_SET;
+ if (authenticated != NULL)
+ *authenticated = GSS_C_NO_BUFFER_SET;
+ if (asserted != NULL)
+ *asserted = GSS_C_NO_BUFFER_SET;
+#if 0
*complete = GSS_C_NO_BUFFER_SET;
+#endif
code = krb5_gss_init_context(&context);
if (code != 0) {
}
kname = (krb5_gss_name_t)name;
+
+ code = k5_mutex_lock(&kname->lock);
+ if (code != 0) {
+ *minor_status = code;
+ return GSS_S_FAILURE;
+ }
+
if (kname->ad_context == NULL) {
- krb5_free_context(context);
- return GSS_S_UNAVAILABLE;
+ code = krb5_authdata_context_init(context, &kname->ad_context);
+ if (code != 0)
+ goto cleanup;
}
code = krb5_authdata_get_attribute_types(context,
goto cleanup;
cleanup:
+ k5_mutex_unlock(&kname->lock);
krb5int_free_data_list(context, kasserted);
krb5int_free_data_list(context, kauthenticated);
}
kname = (krb5_gss_name_t)name;
- if (kname->ad_context == NULL) {
+
+ code = k5_mutex_lock(&kname->lock);
+ if (code != 0) {
+ *minor_status = code;
krb5_free_context(context);
- return GSS_S_UNAVAILABLE;
+ return GSS_S_FAILURE;
+ }
+
+ if (kname->ad_context == NULL) {
+ code = krb5_authdata_context_init(context, &kname->ad_context);
+ if (code != 0) {
+ *minor_status = code;
+ k5_mutex_unlock(&kname->lock);
+ krb5_free_context(context);
+ return GSS_S_UNAVAILABLE;
+ }
}
kattr.data = (char *)attr->value;
}
}
+ k5_mutex_unlock(&kname->lock);
krb5_free_context(context);
return kg_map_name_error(minor_status, code);
}
kname = (krb5_gss_name_t)name;
+
+ code = k5_mutex_lock(&kname->lock);
+ if (code != 0) {
+ *minor_status = code;
+ return GSS_S_FAILURE;
+ }
+
if (kname->ad_context == NULL) {
- krb5_free_context(context);
- return GSS_S_UNAVAILABLE;
+ code = krb5_authdata_context_init(context, &kname->ad_context);
+ if (code != 0) {
+ *minor_status = code;
+ k5_mutex_unlock(&kname->lock);
+ krb5_free_context(context);
+ return GSS_S_UNAVAILABLE;
+ }
}
kattr.data = (char *)attr->value;
&kattr,
&kvalue);
+ k5_mutex_unlock(&kname->lock);
krb5_free_context(context);
return kg_map_name_error(minor_status, code);
}
kname = (krb5_gss_name_t)name;
+
+ code = k5_mutex_lock(&kname->lock);
+ if (code != 0) {
+ *minor_status = code;
+ return GSS_S_FAILURE;
+ }
+
if (kname->ad_context == NULL) {
- krb5_free_context(context);
- return GSS_S_UNAVAILABLE;
+ code = krb5_authdata_context_init(context, &kname->ad_context);
+ if (code != 0) {
+ *minor_status = code;
+ k5_mutex_unlock(&kname->lock);
+ krb5_free_context(context);
+ return GSS_S_UNAVAILABLE;
+ }
}
kattr.data = (char *)attr->value;
kname->ad_context,
&kattr);
+ k5_mutex_unlock(&kname->lock);
krb5_free_context(context);
return kg_map_name_error(minor_status, code);
}
kname = (krb5_gss_name_t)name;
+
+ code = k5_mutex_lock(&kname->lock);
+ if (code != 0) {
+ *minor_status = code;
+ return GSS_S_FAILURE;
+ }
+
if (kname->ad_context == NULL) {
- krb5_free_context(context);
- return GSS_S_UNAVAILABLE;
+ code = krb5_authdata_context_init(context, &kname->ad_context);
+ if (code != 0) {
+ *minor_status = code;
+ k5_mutex_unlock(&kname->lock);
+ krb5_free_context(context);
+ return GSS_S_UNAVAILABLE;
+ }
}
kmodule = (char *)type_id->value;
if (kmodule[type_id->length] != '\0') {
+ k5_mutex_unlock(&kname->lock);
krb5_free_context(context);
return GSS_S_UNAVAILABLE;
}
kmodule,
(void **)output);
+ k5_mutex_unlock(&kname->lock);
krb5_free_context(context);
return kg_map_name_error(minor_status, code);
}
kname = (krb5_gss_name_t)name;
+
+ code = k5_mutex_lock(&kname->lock);
+ if (code != 0) {
+ *minor_status = code;
+ return GSS_S_FAILURE;
+ }
+
if (kname->ad_context == NULL) {
- krb5_free_context(context);
- return GSS_S_UNAVAILABLE;
+ code = krb5_authdata_context_init(context, &kname->ad_context);
+ if (code != 0) {
+ *minor_status = code;
+ k5_mutex_unlock(&kname->lock);
+ krb5_free_context(context);
+ return GSS_S_UNAVAILABLE;
+ }
}
kmodule = (char *)type_id->value;
if (kmodule[type_id->length] != '\0') {
+ k5_mutex_unlock(&kname->lock);
krb5_free_context(context);
return GSS_S_UNAVAILABLE;
}
if (code == 0)
*input = NULL;
+ k5_mutex_unlock(&kname->lock);
krb5_free_context(context);
return kg_map_name_error(minor_status, code);
gss_buffer_t display_name)
{
}
-
#endif
+