diff options
Diffstat (limited to 'source4/heimdal/lib/gssapi/mech')
61 files changed, 587 insertions, 149 deletions
diff --git a/source4/heimdal/lib/gssapi/mech/context.c b/source4/heimdal/lib/gssapi/mech/context.c new file mode 100644 index 0000000000..1691fd9401 --- /dev/null +++ b/source4/heimdal/lib/gssapi/mech/context.c @@ -0,0 +1,141 @@ +#include "mech/mech_locl.h" +#include "heim_threads.h" + +RCSID("$Id: context.c 19924 2007-01-16 10:17:01Z lha $"); + +struct mg_thread_ctx { +    gss_OID mech; +    OM_uint32 maj_stat; +    OM_uint32 min_stat; +    gss_buffer_desc maj_error; +    gss_buffer_desc min_error; +}; + +static HEIMDAL_MUTEX context_mutex = HEIMDAL_MUTEX_INITIALIZER; +static int created_key; +static HEIMDAL_thread_key context_key; + + +static void +destroy_context(void *ptr) +{ +    struct mg_thread_ctx *mg = ptr; +    OM_uint32 junk; + +    if (mg == NULL) +	return; + +    gss_release_buffer(&junk, &mg->maj_error); +    gss_release_buffer(&junk, &mg->min_error); +    free(mg); +} + + +static struct mg_thread_ctx * +_gss_mechglue_thread(void) +{ +    struct mg_thread_ctx *ctx; +    int ret = 0; + +    HEIMDAL_MUTEX_lock(&context_mutex); + +    if (!created_key) { +	HEIMDAL_key_create(&context_key, destroy_context, ret); +	if (ret) { +	    HEIMDAL_MUTEX_unlock(&context_mutex); +	    return NULL; +	} +	created_key = 1; +    } +    HEIMDAL_MUTEX_unlock(&context_mutex); + +    ctx = HEIMDAL_getspecific(context_key); +    if (ctx == NULL) { + +	ctx = calloc(1, sizeof(*ctx)); +	if (ctx == NULL) +	    return NULL; +	HEIMDAL_setspecific(context_key, ctx, ret); +	if (ret) { +	    free(ctx); +	    return NULL; +	} +    } +    return ctx; +} + +OM_uint32 +_gss_mg_get_error(const gss_OID mech, OM_uint32 type, +		  OM_uint32 value, gss_buffer_t string) +{ +    struct mg_thread_ctx *mg; + +    mg = _gss_mechglue_thread(); +    if (mg == NULL) +	return GSS_S_BAD_STATUS; + +    if (mech != NULL && gss_oid_equal(mg->mech, mech) == 0) +	return GSS_S_BAD_STATUS; + +    switch (type) { +    case GSS_C_GSS_CODE: { +	if (value != mg->maj_stat) +	    break; +	string->value = malloc(mg->maj_error.length); +	string->length = mg->maj_error.length; +	memcpy(string->value, mg->maj_error.value, mg->maj_error.length); +	return GSS_S_COMPLETE; +    } +    case GSS_C_MECH_CODE: { +	if (value != mg->min_stat) +	    break; +	string->value = malloc(mg->min_error.length); +	string->length = mg->min_error.length; +	memcpy(string->value, mg->min_error.value, mg->min_error.length); +	return GSS_S_COMPLETE; +    } +    } +    string->value = NULL; +    string->length = 0; +    return GSS_S_BAD_STATUS; +} + +void +_gss_mg_error(gssapi_mech_interface m, OM_uint32 maj, OM_uint32 min) +{ +    OM_uint32 major_status, minor_status; +    OM_uint32 message_content; +    struct mg_thread_ctx *mg; + +    mg = _gss_mechglue_thread(); +    if (mg == NULL) +	return; + +    gss_release_buffer(&minor_status, &mg->maj_error); +    gss_release_buffer(&minor_status, &mg->min_error); + +    mg->mech = &m->gm_mech_oid; +    mg->maj_stat = maj; +    mg->min_stat = min; + +    major_status = m->gm_display_status(&minor_status, +					maj,  +					GSS_C_GSS_CODE, +					&m->gm_mech_oid, +					&message_content, +					&mg->maj_error); +    if (GSS_ERROR(major_status)) { +	mg->maj_error.value = NULL; +	mg->maj_error.length = 0; +    } +    major_status = m->gm_display_status(&minor_status, +					min,  +					GSS_C_MECH_CODE, +					&m->gm_mech_oid, +					&message_content, +					&mg->min_error); +    if (GSS_ERROR(major_status)) { +	mg->min_error.value = NULL; +	mg->min_error.length = 0; +    } +} diff --git a/source4/heimdal/lib/gssapi/mech/context.h b/source4/heimdal/lib/gssapi/mech/context.h index 7a215dd7d8..24e529864d 100644 --- a/source4/heimdal/lib/gssapi/mech/context.h +++ b/source4/heimdal/lib/gssapi/mech/context.h @@ -24,7 +24,7 @@   * SUCH DAMAGE.   *   *	$FreeBSD: src/lib/libgssapi/context.h,v 1.1 2005/12/29 14:40:20 dfr Exp $ - *	$Id: context.h,v 1.2 2006/06/28 09:00:25 lha Exp $ + *	$Id: context.h 19925 2007-01-16 10:19:27Z lha $   */  #include <gssapi_mech.h> @@ -33,3 +33,9 @@ struct _gss_context {  	gssapi_mech_interface	gc_mech;  	gss_ctx_id_t		gc_ctx;  }; + +void +_gss_mg_error(gssapi_mech_interface, OM_uint32, OM_uint32); + +OM_uint32 +_gss_mg_get_error(const gss_OID, OM_uint32, OM_uint32, gss_buffer_t); diff --git a/source4/heimdal/lib/gssapi/mech/cred.h b/source4/heimdal/lib/gssapi/mech/cred.h index df89e79727..7f77b8a68e 100644 --- a/source4/heimdal/lib/gssapi/mech/cred.h +++ b/source4/heimdal/lib/gssapi/mech/cred.h @@ -24,7 +24,7 @@   * SUCH DAMAGE.   *   *	$FreeBSD: src/lib/libgssapi/cred.h,v 1.1 2005/12/29 14:40:20 dfr Exp $ - *	$Id: cred.h,v 1.3 2006/10/05 18:26:54 lha Exp $ + *	$Id: cred.h 20626 2007-05-08 13:56:49Z lha $   */  struct _gss_mechanism_cred { @@ -36,7 +36,6 @@ struct _gss_mechanism_cred {  SLIST_HEAD(_gss_mechanism_cred_list, _gss_mechanism_cred);  struct _gss_cred { -	gss_cred_usage_t gc_usage;  	struct _gss_mechanism_cred_list gc_mc;  }; diff --git a/source4/heimdal/lib/gssapi/mech/gss_accept_sec_context.c b/source4/heimdal/lib/gssapi/mech/gss_accept_sec_context.c index 7df8a3483e..8c5f4d0b08 100644 --- a/source4/heimdal/lib/gssapi/mech/gss_accept_sec_context.c +++ b/source4/heimdal/lib/gssapi/mech/gss_accept_sec_context.c @@ -27,7 +27,7 @@   */  #include "mech_locl.h" -RCSID("$Id: gss_accept_sec_context.c,v 1.9 2006/12/15 20:12:20 lha Exp $"); +RCSID("$Id: gss_accept_sec_context.c 20626 2007-05-08 13:56:49Z lha $");  static OM_uint32  parse_header(const gss_buffer_t input_token, gss_OID mech_oid) @@ -127,10 +127,10 @@ choose_mech(const gss_buffer_t input, gss_OID mech_oid)  		return GSS_S_COMPLETE;  	} else if (input->length == 0) {  		/*  -		 * There is the a wiered mode of SPNEGO (in CIFS and +		 * There is the a wierd mode of SPNEGO (in CIFS and  		 * SASL GSS-SPENGO where the first token is zero  		 * length and the acceptor returns a mech_list, lets -		 * home that is what is happening now. +		 * hope that is what is happening now.  		 */  		*mech_oid = spnego_mechanism;  		return GSS_S_COMPLETE; @@ -161,13 +161,18 @@ OM_uint32 gss_accept_sec_context(OM_uint32 *minor_status,  	int allocated_ctx;  	*minor_status = 0; -	if (src_name) *src_name = 0; -	if (mech_type) *mech_type = 0; -	if (ret_flags) *ret_flags = 0; -	if (time_rec) *time_rec = 0; -	if (delegated_cred_handle) *delegated_cred_handle = 0; -	output_token->length = 0; -	output_token->value = 0; +	if (src_name) +	    *src_name = GSS_C_NO_NAME; +	if (mech_type) +	    *mech_type = GSS_C_NO_OID; +	if (ret_flags) +	    *ret_flags = 0; +	if (time_rec) +	    *time_rec = 0; +	if (delegated_cred_handle) +	    *delegated_cred_handle = GSS_C_NO_CREDENTIAL; +	_mg_buffer_zero(output_token); +  	/*  	 * If this is the first call (*context_handle is NULL), we must @@ -227,7 +232,10 @@ OM_uint32 gss_accept_sec_context(OM_uint32 *minor_status,  	    &delegated_mc);  	if (major_status != GSS_S_COMPLETE &&  	    major_status != GSS_S_CONTINUE_NEEDED) +	{ +		_gss_mg_error(m, major_status, *minor_status);  		return (major_status); +	}  	if (!src_name) {  		m->gm_release_name(minor_status, &src_mn); @@ -264,8 +272,6 @@ OM_uint32 gss_accept_sec_context(OM_uint32 *minor_status,  				*minor_status = ENOMEM;  				return (GSS_S_FAILURE);  			} -			m->gm_inquire_cred(minor_status, delegated_mc, -			    0, 0, &dcred->gc_usage, 0);  			dmc->gmc_mech = m;  			dmc->gmc_mech_oid = &m->gm_mech_oid;  			dmc->gmc_cred = delegated_mc; diff --git a/source4/heimdal/lib/gssapi/mech/gss_acquire_cred.c b/source4/heimdal/lib/gssapi/mech/gss_acquire_cred.c index 0b3554c0fa..d6e448a223 100644 --- a/source4/heimdal/lib/gssapi/mech/gss_acquire_cred.c +++ b/source4/heimdal/lib/gssapi/mech/gss_acquire_cred.c @@ -27,7 +27,7 @@   */  #include "mech_locl.h" -RCSID("$Id: gss_acquire_cred.c,v 1.4 2006/10/25 00:44:55 lha Exp $"); +RCSID("$Id: gss_acquire_cred.c 20626 2007-05-08 13:56:49Z lha $");  OM_uint32  gss_acquire_cred(OM_uint32 *minor_status, @@ -49,6 +49,14 @@ gss_acquire_cred(OM_uint32 *minor_status,  	OM_uint32 min_time, cred_time;  	int i; +	*minor_status = 0; +	if (actual_mechs) +	    *output_cred_handle = GSS_C_NO_CREDENTIAL; +	if (actual_mechs) +	    *actual_mechs = GSS_C_NO_OID_SET; +	if (time_rec) +	    *time_rec = 0; +  	_gss_load_mech();  	/* @@ -64,7 +72,6 @@ gss_acquire_cred(OM_uint32 *minor_status,  				break;  		}  		if (i == mechs->count) { -			*output_cred_handle = 0;  			*minor_status = 0;  			return (GSS_S_BAD_MECH);  		} @@ -84,7 +91,6 @@ gss_acquire_cred(OM_uint32 *minor_status,  		*minor_status = ENOMEM;  		return (GSS_S_FAILURE);  	} -	cred->gc_usage = cred_usage;  	SLIST_INIT(&cred->gc_mc);  	if (mechs == GSS_C_NO_OID_SET) @@ -109,7 +115,6 @@ gss_acquire_cred(OM_uint32 *minor_status,  		if (!mc) {  			continue;  		} -		SLIST_INIT(&cred->gc_mc);  		mc->gmc_mech = m;  		mc->gmc_mech_oid = &m->gm_mech_oid; @@ -151,7 +156,6 @@ gss_acquire_cred(OM_uint32 *minor_status,  		free(cred);  		if (actual_mechs)  			gss_release_oid_set(minor_status, actual_mechs); -		*output_cred_handle = 0;  		*minor_status = 0;  		return (GSS_S_NO_CRED);  	} diff --git a/source4/heimdal/lib/gssapi/mech/gss_add_cred.c b/source4/heimdal/lib/gssapi/mech/gss_add_cred.c index beffd54e29..4947c5c30e 100644 --- a/source4/heimdal/lib/gssapi/mech/gss_add_cred.c +++ b/source4/heimdal/lib/gssapi/mech/gss_add_cred.c @@ -27,7 +27,7 @@   */  #include "mech_locl.h" -RCSID("$Id: gss_add_cred.c,v 1.3 2006/06/29 08:23:53 lha Exp $"); +RCSID("$Id: gss_add_cred.c 20626 2007-05-08 13:56:49Z lha $");  static struct _gss_mechanism_cred *  _gss_copy_cred(struct _gss_mechanism_cred *mc) @@ -43,8 +43,10 @@ _gss_copy_cred(struct _gss_mechanism_cred *mc)  	major_status = m->gm_inquire_cred_by_mech(&minor_status,  	    mc->gmc_cred, mc->gmc_mech_oid,  	    &name, &initiator_lifetime, &acceptor_lifetime, &cred_usage); -	if (major_status) +	if (major_status) { +		_gss_mg_error(m, major_status, minor_status);  		return (0); +	}  	major_status = m->gm_add_cred(&minor_status,  	    GSS_C_NO_CREDENTIAL, name, mc->gmc_mech_oid, @@ -52,8 +54,10 @@ _gss_copy_cred(struct _gss_mechanism_cred *mc)  	    &cred, 0, 0, 0);  	m->gm_release_name(&minor_status, &name); -	if (major_status) +	if (major_status) { +		_gss_mg_error(m, major_status, minor_status);  		return (0); +	}  	new_mc = malloc(sizeof(struct _gss_mechanism_cred));  	if (!new_mc) { @@ -89,15 +93,20 @@ gss_add_cred(OM_uint32 *minor_status,  	struct _gss_mechanism_name *mn;  	OM_uint32 junk; -	*output_cred_handle = 0;  	*minor_status = 0; +	*output_cred_handle = GSS_C_NO_CREDENTIAL; +	if (initiator_time_rec) +	    *initiator_time_rec = 0; +	if (acceptor_time_rec) +	    *acceptor_time_rec = 0; +	if (actual_mechs) +	    *actual_mechs = GSS_C_NO_OID_SET;  	new_cred = malloc(sizeof(struct _gss_cred));  	if (!new_cred) {  		*minor_status = ENOMEM;  		return (GSS_S_FAILURE);  	} -	new_cred->gc_usage = cred_usage;  	SLIST_INIT(&new_cred->gc_mc);  	/* @@ -162,6 +171,7 @@ gss_add_cred(OM_uint32 *minor_status,  	    acceptor_time_rec);  	if (major_status) { +		_gss_mg_error(m, major_status, *minor_status);  		release_cred = (gss_cred_id_t)new_cred;  		gss_release_cred(&junk, &release_cred);  		free(mc); diff --git a/source4/heimdal/lib/gssapi/mech/gss_add_oid_set_member.c b/source4/heimdal/lib/gssapi/mech/gss_add_oid_set_member.c index 5806cec009..87d1ab3725 100644 --- a/source4/heimdal/lib/gssapi/mech/gss_add_oid_set_member.c +++ b/source4/heimdal/lib/gssapi/mech/gss_add_oid_set_member.c @@ -32,7 +32,7 @@   */  #include "mech_locl.h" -RCSID("$Id: gss_add_oid_set_member.c,v 1.3 2006/10/22 09:36:13 lha Exp $"); +RCSID("$Id: gss_add_oid_set_member.c 18817 2006-10-22 09:36:13Z lha $");  OM_uint32  gss_add_oid_set_member (OM_uint32 * minor_status, diff --git a/source4/heimdal/lib/gssapi/mech/gss_buffer_set.c b/source4/heimdal/lib/gssapi/mech/gss_buffer_set.c index 9e9bd5e790..56e0039379 100644 --- a/source4/heimdal/lib/gssapi/mech/gss_buffer_set.c +++ b/source4/heimdal/lib/gssapi/mech/gss_buffer_set.c @@ -31,7 +31,7 @@   */  #include "mech_locl.h" -RCSID("$Id: gss_buffer_set.c,v 1.2 2006/10/24 21:53:02 lha Exp $"); +RCSID("$Id: gss_buffer_set.c 18885 2006-10-24 21:53:02Z lha $");  OM_uint32   gss_create_empty_buffer_set diff --git a/source4/heimdal/lib/gssapi/mech/gss_canonicalize_name.c b/source4/heimdal/lib/gssapi/mech/gss_canonicalize_name.c index 38a464be46..1437a9bc7b 100644 --- a/source4/heimdal/lib/gssapi/mech/gss_canonicalize_name.c +++ b/source4/heimdal/lib/gssapi/mech/gss_canonicalize_name.c @@ -27,7 +27,7 @@   */  #include "mech_locl.h" -RCSID("$Id: gss_canonicalize_name.c,v 1.2 2006/06/28 09:00:25 lha Exp $"); +RCSID("$Id: gss_canonicalize_name.c 19928 2007-01-16 10:37:54Z lha $");  OM_uint32  gss_canonicalize_name(OM_uint32 *minor_status, @@ -52,8 +52,10 @@ gss_canonicalize_name(OM_uint32 *minor_status,  	m = mn->gmn_mech;  	major_status = m->gm_canonicalize_name(minor_status,  	    mn->gmn_name, mech_type, &new_canonical_name); -	if (major_status) +	if (major_status) { +		_gss_mg_error(m, major_status, *minor_status);  		return (major_status); +	}  	/*  	 * Now we make a new name and mark it as an MN. diff --git a/source4/heimdal/lib/gssapi/mech/gss_compare_name.c b/source4/heimdal/lib/gssapi/mech/gss_compare_name.c index 1068bfabf6..147ad60c94 100644 --- a/source4/heimdal/lib/gssapi/mech/gss_compare_name.c +++ b/source4/heimdal/lib/gssapi/mech/gss_compare_name.c @@ -27,7 +27,7 @@   */  #include "mech_locl.h" -RCSID("$Id: gss_compare_name.c,v 1.2 2006/06/28 09:00:25 lha Exp $"); +RCSID("$Id: gss_compare_name.c 17700 2006-06-28 09:00:26Z lha $");  OM_uint32  gss_compare_name(OM_uint32 *minor_status, diff --git a/source4/heimdal/lib/gssapi/mech/gss_context_time.c b/source4/heimdal/lib/gssapi/mech/gss_context_time.c index 4b17381776..47999f35cf 100644 --- a/source4/heimdal/lib/gssapi/mech/gss_context_time.c +++ b/source4/heimdal/lib/gssapi/mech/gss_context_time.c @@ -27,7 +27,7 @@   */  #include "mech_locl.h" -RCSID("$Id: gss_context_time.c,v 1.2 2006/06/28 09:00:25 lha Exp $"); +RCSID("$Id: gss_context_time.c 17700 2006-06-28 09:00:26Z lha $");  OM_uint32  gss_context_time(OM_uint32 *minor_status, diff --git a/source4/heimdal/lib/gssapi/mech/gss_create_empty_oid_set.c b/source4/heimdal/lib/gssapi/mech/gss_create_empty_oid_set.c index 7298ec9e83..841271b1fd 100644 --- a/source4/heimdal/lib/gssapi/mech/gss_create_empty_oid_set.c +++ b/source4/heimdal/lib/gssapi/mech/gss_create_empty_oid_set.c @@ -27,7 +27,7 @@   */  #include "mech_locl.h" -RCSID("$Id: gss_create_empty_oid_set.c,v 1.2 2006/06/28 09:00:25 lha Exp $"); +RCSID("$Id: gss_create_empty_oid_set.c 19951 2007-01-17 10:14:58Z lha $");  OM_uint32  gss_create_empty_oid_set(OM_uint32 *minor_status, @@ -36,7 +36,7 @@ gss_create_empty_oid_set(OM_uint32 *minor_status,  	gss_OID_set set;  	*minor_status = 0; -	*oid_set = 0; +	*oid_set = GSS_C_NO_OID_SET;  	set = malloc(sizeof(gss_OID_set_desc));  	if (!set) { diff --git a/source4/heimdal/lib/gssapi/mech/gss_decapsulate_token.c b/source4/heimdal/lib/gssapi/mech/gss_decapsulate_token.c index 8ebb848188..e8b86e4d22 100644 --- a/source4/heimdal/lib/gssapi/mech/gss_decapsulate_token.c +++ b/source4/heimdal/lib/gssapi/mech/gss_decapsulate_token.c @@ -32,7 +32,7 @@   */  #include "mech_locl.h" -RCSID("$Id: gss_decapsulate_token.c,v 1.2 2006/10/14 10:04:45 lha Exp $"); +RCSID("$Id: gss_decapsulate_token.c 19951 2007-01-17 10:14:58Z lha $");  OM_uint32  gss_decapsulate_token(gss_buffer_t input_token, @@ -45,8 +45,7 @@ gss_decapsulate_token(gss_buffer_t input_token,      int ret;      size_t size; -    output_token->length = 0; -    output_token->value = NULL; +    _mg_buffer_zero(output_token);      ret = der_get_oid (oid->elements, oid->length, &o, &size);      if (ret) diff --git a/source4/heimdal/lib/gssapi/mech/gss_delete_sec_context.c b/source4/heimdal/lib/gssapi/mech/gss_delete_sec_context.c index 06ef8e6d09..8c40994739 100644 --- a/source4/heimdal/lib/gssapi/mech/gss_delete_sec_context.c +++ b/source4/heimdal/lib/gssapi/mech/gss_delete_sec_context.c @@ -27,7 +27,7 @@   */  #include "mech_locl.h" -RCSID("$Id: gss_delete_sec_context.c,v 1.2 2006/06/28 09:00:25 lha Exp $"); +RCSID("$Id: gss_delete_sec_context.c 19951 2007-01-17 10:14:58Z lha $");  OM_uint32  gss_delete_sec_context(OM_uint32 *minor_status, @@ -37,6 +37,9 @@ gss_delete_sec_context(OM_uint32 *minor_status,  	OM_uint32 major_status;  	struct _gss_context *ctx = (struct _gss_context *) *context_handle; +	if (output_token) +	    _mg_buffer_zero(output_token); +  	*minor_status = 0;  	if (ctx) {  		/* @@ -46,12 +49,9 @@ gss_delete_sec_context(OM_uint32 *minor_status,  		if (ctx->gc_ctx) {  			major_status = ctx->gc_mech->gm_delete_sec_context(  				minor_status, &ctx->gc_ctx, output_token); -		} else if (output_token != GSS_C_NO_BUFFER) { -			output_token->length = 0; -			output_token->value = 0;  		}  		free(ctx); -		*context_handle = 0; +		*context_handle = GSS_C_NO_CONTEXT;  	}  	return (GSS_S_COMPLETE); diff --git a/source4/heimdal/lib/gssapi/mech/gss_display_name.c b/source4/heimdal/lib/gssapi/mech/gss_display_name.c index 79f62a7a4f..e57e5dd795 100644 --- a/source4/heimdal/lib/gssapi/mech/gss_display_name.c +++ b/source4/heimdal/lib/gssapi/mech/gss_display_name.c @@ -27,7 +27,7 @@   */  #include "mech_locl.h" -RCSID("$Id: gss_display_name.c,v 1.2 2006/06/28 09:00:25 lha Exp $"); +RCSID("$Id: gss_display_name.c 19952 2007-01-17 10:16:15Z lha $");  OM_uint32  gss_display_name(OM_uint32 *minor_status, @@ -39,6 +39,10 @@ gss_display_name(OM_uint32 *minor_status,  	struct _gss_name *name = (struct _gss_name *) input_name;  	struct _gss_mechanism_name *mn; +	_mg_buffer_zero(output_name_buffer); +	if (output_name_type) +	    *output_name_type = GSS_C_NO_OID; +  	/*  	 * If we know it, copy the buffer used to import the name in  	 * the first place. Otherwise, ask all the MNs in turn if diff --git a/source4/heimdal/lib/gssapi/mech/gss_display_status.c b/source4/heimdal/lib/gssapi/mech/gss_display_status.c index 7871f5338b..c316c26fd7 100644 --- a/source4/heimdal/lib/gssapi/mech/gss_display_status.c +++ b/source4/heimdal/lib/gssapi/mech/gss_display_status.c @@ -59,7 +59,7 @@   */  #include "mech_locl.h" -RCSID("$Id: gss_display_status.c,v 1.4 2006/07/19 11:02:33 lha Exp $"); +RCSID("$Id: gss_display_status.c 20084 2007-01-31 12:12:08Z lha $");  static const char *  calling_error(OM_uint32 v) @@ -148,6 +148,18 @@ gss_display_status(OM_uint32 *minor_status,  {  	OM_uint32 major_status; +	_mg_buffer_zero(status_string); +	*message_content = 0; + +	major_status = _gss_mg_get_error(mech_type, status_type, +					 status_value, status_string); +	if (major_status == GSS_S_COMPLETE) { + +	    *message_content = 0; +	    *minor_status = 0; +	    return GSS_S_COMPLETE; +	} +  	*minor_status = 0;  	switch (status_type) {  	case GSS_C_GSS_CODE: { @@ -161,24 +173,40 @@ gss_display_status(OM_uint32 *minor_status,  		        calling_error(GSS_CALLING_ERROR(status_value)),  			routine_error(GSS_ROUTINE_ERROR(status_value))); +		if (buf == NULL) +		    break; +  		status_string->length = strlen(buf);  		status_string->value  = buf;  		return GSS_S_COMPLETE;  	}  	case GSS_C_MECH_CODE: { -	       gssapi_mech_interface m; -	       m = __gss_get_mechanism(mech_type); -	       if (m) { -			major_status = m->gm_display_status(minor_status, -			    status_value, status_type, mech_type, -			    message_content, status_string); -			if (major_status == GSS_S_COMPLETE) -				return (GSS_S_COMPLETE); +		OM_uint32 maj_junk, min_junk; +		gss_buffer_desc oid; +		char *buf; + +		maj_junk = gss_oid_to_str(&min_junk, mech_type, &oid); +		if (maj_junk != GSS_S_COMPLETE) { +		    oid.value = rk_UNCONST("unknown"); +		    oid.length = 7;  		} + +		asprintf (&buf, "unknown mech-code %lu for mech %.*s", +			  (unsigned long)status_value, +			  (int)oid.length, (char *)oid.value); +		if (maj_junk == GSS_S_COMPLETE) +		    gss_release_buffer(&min_junk, &oid); + +		if (buf == NULL) +		    break; + +		status_string->length = strlen(buf); +		status_string->value  = buf; + +		return GSS_S_COMPLETE;  	}  	} -	status_string->value = NULL; -	status_string->length = 0; +	_mg_buffer_zero(status_string);  	return (GSS_S_BAD_STATUS);  } diff --git a/source4/heimdal/lib/gssapi/mech/gss_duplicate_name.c b/source4/heimdal/lib/gssapi/mech/gss_duplicate_name.c index 5ef828f472..3aab0b9bbc 100644 --- a/source4/heimdal/lib/gssapi/mech/gss_duplicate_name.c +++ b/source4/heimdal/lib/gssapi/mech/gss_duplicate_name.c @@ -27,7 +27,7 @@   */  #include "mech_locl.h" -RCSID("$Id: gss_duplicate_name.c,v 1.2 2006/06/28 09:00:25 lha Exp $"); +RCSID("$Id: gss_duplicate_name.c 19953 2007-01-17 11:16:35Z lha $");  OM_uint32 gss_duplicate_name(OM_uint32 *minor_status,      const gss_name_t src_name, @@ -39,6 +39,7 @@ OM_uint32 gss_duplicate_name(OM_uint32 *minor_status,  	struct _gss_mechanism_name *mn;  	*minor_status = 0; +	*dest_name = GSS_C_NO_NAME;  	/*  	 * If this name has a value (i.e. it didn't come from diff --git a/source4/heimdal/lib/gssapi/mech/gss_duplicate_oid.c b/source4/heimdal/lib/gssapi/mech/gss_duplicate_oid.c index bfb0e75315..d111a0ed61 100644 --- a/source4/heimdal/lib/gssapi/mech/gss_duplicate_oid.c +++ b/source4/heimdal/lib/gssapi/mech/gss_duplicate_oid.c @@ -32,7 +32,7 @@   */  #include "mech_locl.h" -RCSID("$Id: gss_duplicate_oid.c,v 1.1 2006/06/28 09:07:07 lha Exp $"); +RCSID("$Id: gss_duplicate_oid.c 19954 2007-01-17 11:50:23Z lha $");  OM_uint32 gss_duplicate_oid (          OM_uint32 *minor_status, @@ -56,6 +56,7 @@ OM_uint32 gss_duplicate_oid (      (*dest_oid)->elements = malloc(src_oid->length);      if ((*dest_oid)->elements == NULL) {  	free(*dest_oid); +	*dest_oid = GSS_C_NO_OID;  	*minor_status = ENOMEM;  	return GSS_S_FAILURE;      } diff --git a/source4/heimdal/lib/gssapi/mech/gss_encapsulate_token.c b/source4/heimdal/lib/gssapi/mech/gss_encapsulate_token.c index d1285815ee..476d451375 100644 --- a/source4/heimdal/lib/gssapi/mech/gss_encapsulate_token.c +++ b/source4/heimdal/lib/gssapi/mech/gss_encapsulate_token.c @@ -32,7 +32,7 @@   */  #include "mech_locl.h" -RCSID("$Id: gss_encapsulate_token.c,v 1.2 2006/10/14 10:05:12 lha Exp $"); +RCSID("$Id: gss_encapsulate_token.c 19954 2007-01-17 11:50:23Z lha $");  OM_uint32  gss_encapsulate_token(gss_buffer_t input_token, @@ -45,8 +45,7 @@ gss_encapsulate_token(gss_buffer_t input_token,      ret = der_get_oid (oid->elements, oid->length, &ct.thisMech, &size);      if (ret) { -	output_token->value = NULL; -	output_token->length = 0; +	_mg_buffer_zero(output_token);  	return GSS_S_FAILURE;      } @@ -58,8 +57,7 @@ gss_encapsulate_token(gss_buffer_t input_token,  		       &ct, &size, ret);      der_free_oid(&ct.thisMech);      if (ret) { -	output_token->length = 0; -	output_token->value = NULL; +	_mg_buffer_zero(output_token);  	return GSS_S_FAILURE;      }	      if (output_token->length != size) diff --git a/source4/heimdal/lib/gssapi/mech/gss_export_name.c b/source4/heimdal/lib/gssapi/mech/gss_export_name.c index bc1c39c8ee..11c9dd2db5 100644 --- a/source4/heimdal/lib/gssapi/mech/gss_export_name.c +++ b/source4/heimdal/lib/gssapi/mech/gss_export_name.c @@ -27,7 +27,7 @@   */  #include "mech_locl.h" -RCSID("$Id: gss_export_name.c,v 1.3 2006/07/05 22:41:57 lha Exp $"); +RCSID("$Id: gss_export_name.c 19954 2007-01-17 11:50:23Z lha $");  OM_uint32  gss_export_name(OM_uint32 *minor_status, @@ -37,8 +37,7 @@ gss_export_name(OM_uint32 *minor_status,  	struct _gss_name *name = (struct _gss_name *) input_name;  	struct _gss_mechanism_name *mn; -	exported_name->value = NULL; -	exported_name->length = 0; +	_mg_buffer_zero(exported_name);  	/*  	 * If this name already has any attached MNs, export the first diff --git a/source4/heimdal/lib/gssapi/mech/gss_export_sec_context.c b/source4/heimdal/lib/gssapi/mech/gss_export_sec_context.c index 1acc72b33d..cf13bc0cd3 100644 --- a/source4/heimdal/lib/gssapi/mech/gss_export_sec_context.c +++ b/source4/heimdal/lib/gssapi/mech/gss_export_sec_context.c @@ -27,7 +27,7 @@   */  #include "mech_locl.h" -RCSID("$Id: gss_export_sec_context.c,v 1.2 2006/06/28 09:00:25 lha Exp $"); +RCSID("$Id: gss_export_sec_context.c 19954 2007-01-17 11:50:23Z lha $");  OM_uint32  gss_export_sec_context(OM_uint32 *minor_status, @@ -39,6 +39,8 @@ gss_export_sec_context(OM_uint32 *minor_status,  	gssapi_mech_interface m = ctx->gc_mech;  	gss_buffer_desc buf; +	_mg_buffer_zero(interprocess_token); +  	major_status = m->gm_export_sec_context(minor_status,  	    &ctx->gc_ctx, &buf); @@ -58,6 +60,7 @@ gss_export_sec_context(OM_uint32 *minor_status,  			 * GSS_C_NO_CONTEXT, which we did above.  			 * Return GSS_S_FAILURE.  			 */ +			_mg_buffer_zero(interprocess_token);  			*minor_status = ENOMEM;  			return (GSS_S_FAILURE);  		} @@ -67,6 +70,8 @@ gss_export_sec_context(OM_uint32 *minor_status,  		memcpy(p + 2, m->gm_mech_oid.elements, m->gm_mech_oid.length);  		memcpy(p + 2 + m->gm_mech_oid.length, buf.value, buf.length);  		gss_release_buffer(minor_status, &buf); +	} else { +		_gss_mg_error(m, major_status, *minor_status);  	}  	return (major_status); diff --git a/source4/heimdal/lib/gssapi/mech/gss_get_mic.c b/source4/heimdal/lib/gssapi/mech/gss_get_mic.c index e9a8f294a4..496dd2065c 100644 --- a/source4/heimdal/lib/gssapi/mech/gss_get_mic.c +++ b/source4/heimdal/lib/gssapi/mech/gss_get_mic.c @@ -27,7 +27,7 @@   */  #include "mech_locl.h" -RCSID("$Id: gss_get_mic.c,v 1.2 2006/06/28 09:00:25 lha Exp $"); +RCSID("$Id: gss_get_mic.c 19954 2007-01-17 11:50:23Z lha $");  OM_uint32  gss_get_mic(OM_uint32 *minor_status, @@ -39,6 +39,12 @@ gss_get_mic(OM_uint32 *minor_status,  	struct _gss_context *ctx = (struct _gss_context *) context_handle;  	gssapi_mech_interface m = ctx->gc_mech; +	_mg_buffer_zero(message_token); +	if (ctx == NULL) { +	    *minor_status = 0; +	    return GSS_S_NO_CONTEXT; +	} +  	return (m->gm_get_mic(minor_status, ctx->gc_ctx, qop_req,  		    message_buffer, message_token));  } diff --git a/source4/heimdal/lib/gssapi/mech/gss_import_name.c b/source4/heimdal/lib/gssapi/mech/gss_import_name.c index 9684301ba4..6f55a1d61c 100644 --- a/source4/heimdal/lib/gssapi/mech/gss_import_name.c +++ b/source4/heimdal/lib/gssapi/mech/gss_import_name.c @@ -27,7 +27,7 @@   */  #include "mech_locl.h" -RCSID("$Id: gss_import_name.c,v 1.3 2006/06/29 21:23:13 lha Exp $"); +RCSID("$Id: gss_import_name.c 19954 2007-01-17 11:50:23Z lha $");  static OM_uint32  _gss_import_export_name(OM_uint32 *minor_status, @@ -119,6 +119,10 @@ _gss_import_export_name(OM_uint32 *minor_status,  	 */  	major_status = m->gm_import_name(minor_status,  	    input_name_buffer, GSS_C_NT_EXPORT_NAME, &new_canonical_name); +	if (major_status != GSS_S_COMPLETE) { +		_gss_mg_error(m, major_status, *minor_status); +		return major_status; +	}  	/*  	 * Now we make a new name and mark it as an MN. @@ -145,9 +149,10 @@ gss_import_name(OM_uint32 *minor_status,  	OM_uint32		major_status;  	struct _gss_name	*name; +	*output_name = GSS_C_NO_NAME; +  	if (input_name_buffer->length == 0) {  		*minor_status = 0; -		*output_name = 0;  		return (GSS_S_BAD_NAME);  	} @@ -180,7 +185,6 @@ gss_import_name(OM_uint32 *minor_status,  	    && !gss_oid_equal(name_type, GSS_C_NT_ANONYMOUS)  	    && !gss_oid_equal(name_type, GSS_KRB5_NT_PRINCIPAL_NAME)) {  		*minor_status = 0; -		*output_name = 0;  		return (GSS_S_BAD_NAMETYPE);  	} diff --git a/source4/heimdal/lib/gssapi/mech/gss_import_sec_context.c b/source4/heimdal/lib/gssapi/mech/gss_import_sec_context.c index 5466f97cf4..44ca1b2677 100644 --- a/source4/heimdal/lib/gssapi/mech/gss_import_sec_context.c +++ b/source4/heimdal/lib/gssapi/mech/gss_import_sec_context.c @@ -27,7 +27,7 @@   */  #include "mech_locl.h" -RCSID("$Id: gss_import_sec_context.c,v 1.2 2006/06/28 09:00:25 lha Exp $"); +RCSID("$Id: gss_import_sec_context.c 19956 2007-01-17 12:04:16Z lha $");  OM_uint32  gss_import_sec_context(OM_uint32 *minor_status, @@ -43,7 +43,7 @@ gss_import_sec_context(OM_uint32 *minor_status,  	size_t len;  	*minor_status = 0; -	*context_handle = 0; +	*context_handle = GSS_C_NO_CONTEXT;  	/*  	 * We added an oid to the front of the token in @@ -73,6 +73,7 @@ gss_import_sec_context(OM_uint32 *minor_status,  	major_status = m->gm_import_sec_context(minor_status,  	    &buf, &ctx->gc_ctx);  	if (major_status != GSS_S_COMPLETE) { +		_gss_mg_error(m, major_status, *minor_status);  		free(ctx);  	} else {  		*context_handle = (gss_ctx_id_t) ctx; diff --git a/source4/heimdal/lib/gssapi/mech/gss_indicate_mechs.c b/source4/heimdal/lib/gssapi/mech/gss_indicate_mechs.c index 0da6c48834..00c6ed28ee 100644 --- a/source4/heimdal/lib/gssapi/mech/gss_indicate_mechs.c +++ b/source4/heimdal/lib/gssapi/mech/gss_indicate_mechs.c @@ -27,7 +27,7 @@   */  #include "mech_locl.h" -RCSID("$Id: gss_indicate_mechs.c,v 1.3 2006/07/05 22:36:49 lha Exp $"); +RCSID("$Id: gss_indicate_mechs.c 17803 2006-07-05 22:36:49Z lha $");  OM_uint32  gss_indicate_mechs(OM_uint32 *minor_status, diff --git a/source4/heimdal/lib/gssapi/mech/gss_init_sec_context.c b/source4/heimdal/lib/gssapi/mech/gss_init_sec_context.c index 0d50bbd92b..c1c058d146 100644 --- a/source4/heimdal/lib/gssapi/mech/gss_init_sec_context.c +++ b/source4/heimdal/lib/gssapi/mech/gss_init_sec_context.c @@ -27,7 +27,7 @@   */  #include "mech_locl.h" -RCSID("$Id: gss_init_sec_context.c,v 1.4 2006/11/14 12:33:11 lha Exp $"); +RCSID("$Id: gss_init_sec_context.c 19957 2007-01-17 13:48:11Z lha $");  static gss_cred_id_t  _gss_mech_cred_find(gss_cred_id_t cred_handle, gss_OID mech_type) @@ -71,6 +71,14 @@ gss_init_sec_context(OM_uint32 * minor_status,  	*minor_status = 0; +	_mg_buffer_zero(output_token); +	if (actual_mech_type) +	    *actual_mech_type = GSS_C_NO_OID; +	if (ret_flags) +	    *ret_flags = 0; +	if (time_rec) +	    *time_rec = 0; +  	/*  	 * If we haven't allocated a context yet, do so now and lookup  	 * the mechanism switch table. If we have one already, make @@ -131,6 +139,8 @@ gss_init_sec_context(OM_uint32 * minor_status,  	    && major_status != GSS_S_CONTINUE_NEEDED) {  		if (allocated_ctx)  			free(ctx); +		_mg_buffer_zero(output_token); +		_gss_mg_error(m, major_status, *minor_status);  	} else {  		*context_handle = (gss_ctx_id_t) ctx;  	} diff --git a/source4/heimdal/lib/gssapi/mech/gss_inquire_context.c b/source4/heimdal/lib/gssapi/mech/gss_inquire_context.c index 88bbb3941f..5cce30c6bd 100644 --- a/source4/heimdal/lib/gssapi/mech/gss_inquire_context.c +++ b/source4/heimdal/lib/gssapi/mech/gss_inquire_context.c @@ -27,7 +27,7 @@   */  #include "mech_locl.h" -RCSID("$Id: gss_inquire_context.c,v 1.2 2006/06/28 09:00:25 lha Exp $"); +RCSID("$Id: gss_inquire_context.c 19958 2007-01-17 13:56:18Z lha $");  OM_uint32  gss_inquire_context(OM_uint32 *minor_status, @@ -46,27 +46,42 @@ gss_inquire_context(OM_uint32 *minor_status,  	struct _gss_name *name;  	gss_name_t src_mn, targ_mn; +	if (locally_initiated) +	    *locally_initiated = 0; +	if (open) +	    *open = 0; +	if (lifetime_rec) +	    *lifetime_rec = 0; + +	if (src_name) +	    *src_name = GSS_C_NO_NAME; +	if (targ_name) +	    *targ_name = GSS_C_NO_NAME; +	if (mech_type) +	    *mech_type = GSS_C_NO_OID; +	src_mn = targ_mn = GSS_C_NO_NAME; +  	major_status = m->gm_inquire_context(minor_status,  	    ctx->gc_ctx, -	    src_name ? &src_mn : 0, -	    targ_name ? &targ_mn : 0, +	    src_name ? &src_mn : NULL, +	    targ_name ? &targ_mn : NULL,  	    lifetime_rec,  	    mech_type,  	    ctx_flags,  	    locally_initiated,  	    open); -	if (src_name) *src_name = 0; -	if (targ_name) *targ_name = 0; -  	if (major_status != GSS_S_COMPLETE) { +		_gss_mg_error(m, major_status, *minor_status);  		return (major_status);  	}  	if (src_name) {  		name = _gss_make_name(m, src_mn);  		if (!name) { -			minor_status = 0; +			*mech_type = GSS_C_NO_OID; +			m->gm_release_name(minor_status, &src_mn); +			*minor_status = 0;  			return (GSS_S_FAILURE);  		}  		*src_name = (gss_name_t) name; @@ -75,7 +90,10 @@ gss_inquire_context(OM_uint32 *minor_status,  	if (targ_name) {  		name = _gss_make_name(m, targ_mn);  		if (!name) { -			minor_status = 0; +			*mech_type = GSS_C_NO_OID; +			gss_release_name(minor_status, src_name); +			m->gm_release_name(minor_status, &targ_mn); +			*minor_status = 0;  			return (GSS_S_FAILURE);  		}  		*targ_name = (gss_name_t) name; diff --git a/source4/heimdal/lib/gssapi/mech/gss_inquire_cred.c b/source4/heimdal/lib/gssapi/mech/gss_inquire_cred.c index 223140205d..97c3628225 100644 --- a/source4/heimdal/lib/gssapi/mech/gss_inquire_cred.c +++ b/source4/heimdal/lib/gssapi/mech/gss_inquire_cred.c @@ -27,7 +27,21 @@   */  #include "mech_locl.h" -RCSID("$Id: gss_inquire_cred.c,v 1.5 2006/07/20 02:03:18 lha Exp $"); +RCSID("$Id: gss_inquire_cred.c 20626 2007-05-08 13:56:49Z lha $"); + +#define AUSAGE 1 +#define IUSAGE 2 + +static void +updateusage(gss_cred_usage_t usage, int *usagemask) +{ +    if (usage == GSS_C_BOTH) +	*usagemask |= AUSAGE | IUSAGE; +    else if (usage == GSS_C_ACCEPT) +	*usagemask |= AUSAGE; +    else if (usage == GSS_C_INITIATE) +	*usagemask |= IUSAGE; +}  OM_uint32  gss_inquire_cred(OM_uint32 *minor_status, @@ -44,27 +58,30 @@ gss_inquire_cred(OM_uint32 *minor_status,  	struct _gss_mechanism_name *mn;  	OM_uint32 min_lifetime;  	int found = 0; +	int usagemask = 0; +	gss_cred_usage_t usage;  	_gss_load_mech();  	*minor_status = 0;  	if (name_ret) -		*name_ret = 0; +		*name_ret = GSS_C_NO_NAME;  	if (lifetime)  		*lifetime = 0;  	if (cred_usage)  		*cred_usage = 0; +	if (mechanisms) +		*mechanisms = GSS_C_NO_OID_SET;  	if (name_ret) { -		name = malloc(sizeof(struct _gss_name)); -		if (!name) { +		name = calloc(1, sizeof(*name)); +		if (name == NULL) {  			*minor_status = ENOMEM;  			return (GSS_S_FAILURE);  		} -		memset(name, 0, sizeof(struct _gss_name));  		SLIST_INIT(&name->gn_mn);  	} else { -		name = 0; +		name = NULL;  	}  	if (mechanisms) { @@ -85,10 +102,11 @@ gss_inquire_cred(OM_uint32 *minor_status,  			OM_uint32 mc_lifetime;  			major_status = mc->gmc_mech->gm_inquire_cred(minor_status, -			    mc->gmc_cred, &mc_name, &mc_lifetime, NULL, NULL); +			    mc->gmc_cred, &mc_name, &mc_lifetime, &usage, NULL);  			if (major_status)  				continue; +			updateusage(usage, &usagemask);  			if (name) {  				mn = malloc(sizeof(struct _gss_mechanism_name));  				if (!mn) { @@ -120,10 +138,11 @@ gss_inquire_cred(OM_uint32 *minor_status,  			major_status = m->gm_mech.gm_inquire_cred(minor_status,  			    GSS_C_NO_CREDENTIAL, &mc_name, &mc_lifetime, -			    cred_usage, NULL); +			    &usage, NULL);  			if (major_status)  				continue; +			updateusage(usage, &usagemask);  			if (name && mc_name) {  				mn = malloc(  					sizeof(struct _gss_mechanism_name)); @@ -152,6 +171,9 @@ gss_inquire_cred(OM_uint32 *minor_status,  	}  	if (found == 0) { +		gss_name_t n = (gss_name_t)name; +		if (n) +			gss_release_name(minor_status, &n);  		gss_release_oid_set(minor_status, mechanisms);  		*minor_status = 0;  		return (GSS_S_NO_CRED); @@ -162,7 +184,13 @@ gss_inquire_cred(OM_uint32 *minor_status,  		*name_ret = (gss_name_t) name;  	if (lifetime)  		*lifetime = min_lifetime; -	if (cred && cred_usage) -		*cred_usage = cred->gc_usage; +	if (cred_usage) { +		if ((usagemask & (AUSAGE|IUSAGE)) == (AUSAGE|IUSAGE)) +			*cred_usage = GSS_C_BOTH; +		else if (usagemask & IUSAGE) +			*cred_usage = GSS_C_INITIATE; +		else if (usagemask & AUSAGE) +			*cred_usage = GSS_C_ACCEPT; +	}  	return (GSS_S_COMPLETE);  } diff --git a/source4/heimdal/lib/gssapi/mech/gss_inquire_cred_by_mech.c b/source4/heimdal/lib/gssapi/mech/gss_inquire_cred_by_mech.c index 771a6956a5..a4ace9e9e9 100644 --- a/source4/heimdal/lib/gssapi/mech/gss_inquire_cred_by_mech.c +++ b/source4/heimdal/lib/gssapi/mech/gss_inquire_cred_by_mech.c @@ -27,7 +27,7 @@   */  #include "mech_locl.h" -RCSID("$Id: gss_inquire_cred_by_mech.c,v 1.2 2006/06/28 09:00:25 lha Exp $"); +RCSID("$Id: gss_inquire_cred_by_mech.c 19960 2007-01-17 15:09:24Z lha $");  OM_uint32  gss_inquire_cred_by_mech(OM_uint32 *minor_status, @@ -46,6 +46,14 @@ gss_inquire_cred_by_mech(OM_uint32 *minor_status,  	struct _gss_name *name;  	*minor_status = 0; +	if (cred_name) +	    *cred_name = GSS_C_NO_NAME; +	if (initiator_lifetime) +	    *initiator_lifetime = 0; +	if (acceptor_lifetime) +	    *acceptor_lifetime = 0; +	if (cred_usage) +	    *cred_usage = 0;  	m = __gss_get_mechanism(mech_type);  	if (!m) @@ -65,8 +73,10 @@ gss_inquire_cred_by_mech(OM_uint32 *minor_status,  	major_status = m->gm_inquire_cred_by_mech(minor_status, mc, mech_type,  	    &mn, initiator_lifetime, acceptor_lifetime, cred_usage); -	if (major_status != GSS_S_COMPLETE) +	if (major_status != GSS_S_COMPLETE) { +		_gss_mg_error(m, major_status, *minor_status);  		return (major_status); +	}  	name = _gss_make_name(m, mn);  	if (!name) { diff --git a/source4/heimdal/lib/gssapi/mech/gss_inquire_cred_by_oid.c b/source4/heimdal/lib/gssapi/mech/gss_inquire_cred_by_oid.c index 3cfe89af21..7b53a2ff4a 100644 --- a/source4/heimdal/lib/gssapi/mech/gss_inquire_cred_by_oid.c +++ b/source4/heimdal/lib/gssapi/mech/gss_inquire_cred_by_oid.c @@ -31,7 +31,7 @@   */  #include "mech_locl.h" -RCSID("$Id: gss_inquire_cred_by_oid.c,v 1.2 2006/06/28 16:20:41 lha Exp $"); +RCSID("$Id: gss_inquire_cred_by_oid.c 19960 2007-01-17 15:09:24Z lha $");  OM_uint32  gss_inquire_cred_by_oid (OM_uint32 *minor_status, @@ -46,6 +46,7 @@ gss_inquire_cred_by_oid (OM_uint32 *minor_status,  	gss_buffer_set_t set = GSS_C_NO_BUFFER_SET;  	*minor_status = 0; +	*data_set = GSS_C_NO_BUFFER_SET;  	if (cred == NULL)  		return GSS_S_NO_CRED; @@ -55,8 +56,11 @@ gss_inquire_cred_by_oid (OM_uint32 *minor_status,  		int i;  		m = mc->gmc_mech; -		if (m == NULL) +		if (m == NULL) { +	       		gss_release_buffer_set(minor_status, &set); +			*minor_status = 0;  			return GSS_S_BAD_MECH; +		}  		if (m->gm_inquire_cred_by_oid == NULL)  			continue; @@ -77,6 +81,7 @@ gss_inquire_cred_by_oid (OM_uint32 *minor_status,  	if (set == GSS_C_NO_BUFFER_SET)  		status = GSS_S_FAILURE;  	*data_set = set; +	*minor_status = 0;  	return status;  } diff --git a/source4/heimdal/lib/gssapi/mech/gss_inquire_mechs_for_name.c b/source4/heimdal/lib/gssapi/mech/gss_inquire_mechs_for_name.c index 7052bf8b72..5330a747a6 100644 --- a/source4/heimdal/lib/gssapi/mech/gss_inquire_mechs_for_name.c +++ b/source4/heimdal/lib/gssapi/mech/gss_inquire_mechs_for_name.c @@ -27,7 +27,7 @@   */  #include "mech_locl.h" -RCSID("$Id: gss_inquire_mechs_for_name.c,v 1.3 2006/07/20 02:04:00 lha Exp $"); +RCSID("$Id: gss_inquire_mechs_for_name.c 17844 2006-07-20 02:04:00Z lha $");  OM_uint32  gss_inquire_mechs_for_name(OM_uint32 *minor_status, diff --git a/source4/heimdal/lib/gssapi/mech/gss_inquire_names_for_mech.c b/source4/heimdal/lib/gssapi/mech/gss_inquire_names_for_mech.c index 2293163b03..65b52cbbc3 100644 --- a/source4/heimdal/lib/gssapi/mech/gss_inquire_names_for_mech.c +++ b/source4/heimdal/lib/gssapi/mech/gss_inquire_names_for_mech.c @@ -27,7 +27,7 @@   */  #include "mech_locl.h" -RCSID("$Id: gss_inquire_names_for_mech.c,v 1.2 2006/06/28 09:00:25 lha Exp $"); +RCSID("$Id: gss_inquire_names_for_mech.c 19960 2007-01-17 15:09:24Z lha $");  OM_uint32  gss_inquire_names_for_mech(OM_uint32 *minor_status, @@ -38,6 +38,7 @@ gss_inquire_names_for_mech(OM_uint32 *minor_status,  	gssapi_mech_interface m = __gss_get_mechanism(mechanism);  	*minor_status = 0; +	*name_types = GSS_C_NO_OID_SET;  	if (!m)  		return (GSS_S_BAD_MECH); @@ -56,15 +57,15 @@ gss_inquire_names_for_mech(OM_uint32 *minor_status,  		major_status = gss_add_oid_set_member(minor_status,  		    GSS_C_NT_HOSTBASED_SERVICE, name_types);  		if (major_status) { -			OM_uint32 ms; -			gss_release_oid_set(&ms, name_types); +			OM_uint32 junk; +			gss_release_oid_set(&junk, name_types);  			return (major_status);  		}  		major_status = gss_add_oid_set_member(minor_status,  		    GSS_C_NT_USER_NAME, name_types);  		if (major_status) { -			OM_uint32 ms; -			gss_release_oid_set(&ms, name_types); +			OM_uint32 junk; +			gss_release_oid_set(&junk, name_types);  			return (major_status);  		}  	} diff --git a/source4/heimdal/lib/gssapi/mech/gss_inquire_sec_context_by_oid.c b/source4/heimdal/lib/gssapi/mech/gss_inquire_sec_context_by_oid.c index 7f5632ac55..fd8219ce02 100644 --- a/source4/heimdal/lib/gssapi/mech/gss_inquire_sec_context_by_oid.c +++ b/source4/heimdal/lib/gssapi/mech/gss_inquire_sec_context_by_oid.c @@ -31,7 +31,7 @@   */  #include "mech_locl.h" -RCSID("$Id: gss_inquire_sec_context_by_oid.c,v 1.1 2006/06/28 09:07:08 lha Exp $"); +RCSID("$Id: gss_inquire_sec_context_by_oid.c 19961 2007-01-17 15:57:51Z lha $");  OM_uint32  gss_inquire_sec_context_by_oid (OM_uint32 *minor_status, @@ -44,7 +44,7 @@ gss_inquire_sec_context_by_oid (OM_uint32 *minor_status,  	gssapi_mech_interface	m;  	*minor_status = 0; - +	*data_set = GSS_C_NO_BUFFER_SET;  	if (ctx == NULL)  		return GSS_S_NO_CONTEXT; @@ -58,10 +58,12 @@ gss_inquire_sec_context_by_oid (OM_uint32 *minor_status,  	if (m == NULL)  		return GSS_S_BAD_MECH; -	if (m->gm_inquire_sec_context_by_oid != NULL) +	if (m->gm_inquire_sec_context_by_oid != NULL) {  		major_status = m->gm_inquire_sec_context_by_oid(minor_status,  		    ctx->gc_ctx, desired_object, data_set); -	else +		if (major_status != GSS_S_COMPLETE) +			_gss_mg_error(m, major_status, *minor_status); +	} else  		major_status = GSS_S_BAD_MECH;  	return major_status; diff --git a/source4/heimdal/lib/gssapi/mech/gss_krb5.c b/source4/heimdal/lib/gssapi/mech/gss_krb5.c index 76a2c2b637..2500928baf 100644 --- a/source4/heimdal/lib/gssapi/mech/gss_krb5.c +++ b/source4/heimdal/lib/gssapi/mech/gss_krb5.c @@ -27,7 +27,7 @@   */  #include "mech_locl.h" -RCSID("$Id: gss_krb5.c,v 1.21 2006/11/10 00:57:27 lha Exp $"); +RCSID("$Id: gss_krb5.c 20383 2007-04-18 08:49:53Z lha $");  #include <krb5.h>  #include <roken.h> @@ -164,7 +164,12 @@ gss_krb5_import_cred(OM_uint32 *minor_status,  	goto out;      } -    krb5_storage_to_data(sp, &data); +    ret = krb5_storage_to_data(sp, &data); +    if (ret) { +	*minor_status = ret; +	major_status = GSS_S_FAILURE; +	goto out; +    }      buffer.value = data.data;      buffer.length = data.length; @@ -421,37 +426,49 @@ gss_krb5_free_lucid_sec_context(OM_uint32 *minor_status, void *c)   */  OM_uint32 -gss_krb5_set_allowable_enctypes(OM_uint32 *min_status,  +gss_krb5_set_allowable_enctypes(OM_uint32 *minor_status,   				gss_cred_id_t cred,  				OM_uint32 num_enctypes,  				int32_t *enctypes)  { +    krb5_error_code ret;      OM_uint32 maj_status;      gss_buffer_desc buffer;      krb5_storage *sp;      krb5_data data; +    int i;      sp = krb5_storage_emem();      if (sp == NULL) { -	*min_status = ENOMEM; +	*minor_status = ENOMEM;  	maj_status = GSS_S_FAILURE;  	goto out;      } -    while(*enctypes) { -	krb5_store_int32(sp, *enctypes); -	enctypes++; +    for (i = 0; i < num_enctypes; i++) { +	ret = krb5_store_int32(sp, enctypes[i]); +	if (ret) { +	    *minor_status = ret; +	    maj_status = GSS_S_FAILURE; +	    goto out; +	}      } -    krb5_storage_to_data(sp, &data); +    ret = krb5_storage_to_data(sp, &data); +    if (ret) { +	*minor_status = ret; +	maj_status = GSS_S_FAILURE; +	goto out; +    }      buffer.value = data.data;      buffer.length = data.length; -    maj_status = gss_set_cred_option(min_status, +    maj_status = gss_set_cred_option(minor_status,  				     &cred,  				     GSS_KRB5_SET_ALLOWABLE_ENCTYPES_X,  				     &buffer); +    krb5_data_free(&data);  out:      if (sp)  	krb5_storage_free(sp); @@ -494,6 +511,38 @@ gsskrb5_set_send_to_kdc(struct gsskrb5_send_to_kdc *c)   */  OM_uint32 +gss_krb5_ccache_name(OM_uint32 *minor_status,  +		     const char *name, +		     const char **out_name) +{ +    struct _gss_mech_switch *m; +    gss_buffer_desc buffer; +    OM_uint32 junk; + +    _gss_load_mech(); + +    if (out_name) +	*out_name = NULL; + +    buffer.value = rk_UNCONST(name); +    buffer.length = strlen(name); + +    SLIST_FOREACH(m, &_gss_mechs, gm_link) { +	if (m->gm_mech.gm_set_sec_context_option == NULL) +	    continue; +	m->gm_mech.gm_set_sec_context_option(&junk, NULL, +	    GSS_KRB5_CCACHE_NAME_X, &buffer); +    } + +    return (GSS_S_COMPLETE); +} + + +/* + * + */ + +OM_uint32  gsskrb5_extract_authtime_from_sec_context(OM_uint32 *minor_status,  					  gss_ctx_id_t context_handle,  					  time_t *authtime) diff --git a/source4/heimdal/lib/gssapi/mech/gss_mech_switch.c b/source4/heimdal/lib/gssapi/mech/gss_mech_switch.c index b8fdefdca1..604027490e 100644 --- a/source4/heimdal/lib/gssapi/mech/gss_mech_switch.c +++ b/source4/heimdal/lib/gssapi/mech/gss_mech_switch.c @@ -28,7 +28,7 @@  #include "mech_locl.h"  #include <heim_threads.h> -RCSID("$Id: gss_mech_switch.c,v 1.8 2006/12/15 20:05:43 lha Exp $"); +RCSID("$Id: gss_mech_switch.c 20625 2007-05-08 13:55:03Z lha $");  #ifndef _PATH_GSS_MECH  #define _PATH_GSS_MECH	"/etc/gss/mech" @@ -50,6 +50,9 @@ _gss_string_to_oid(const char* s, gss_OID oid)  	const char		*p, *q;  	char			*res; +	oid->length = 0; +	oid->elements = NULL; +  	/*  	 * First figure out how many numbers in the oid, then  	 * calculate the compiled oid size. @@ -169,8 +172,10 @@ add_builtin(gssapi_mech_interface mech)  {      struct _gss_mech_switch *m;      OM_uint32 minor_status; -    if (!mech)  -        return 0; + +    /* not registering any mech is ok */ +    if (mech == NULL) +	return 0;      m = malloc(sizeof(*m));      if (m == NULL) @@ -299,6 +304,7 @@ _gss_load_mech(void)  		OPTSYM(inquire_sec_context_by_oid);  		OPTSYM(set_sec_context_option);  		OPTSYM(set_cred_option); +		OPTSYM(pseudo_random);  		SLIST_INSERT_HEAD(&_gss_mechs, m, gm_link);  		continue; diff --git a/source4/heimdal/lib/gssapi/mech/gss_names.c b/source4/heimdal/lib/gssapi/mech/gss_names.c index 833c582006..3ab609c192 100644 --- a/source4/heimdal/lib/gssapi/mech/gss_names.c +++ b/source4/heimdal/lib/gssapi/mech/gss_names.c @@ -27,7 +27,7 @@   */  #include "mech_locl.h" -RCSID("$Id: gss_names.c,v 1.2 2006/06/28 09:00:25 lha Exp $"); +RCSID("$Id: gss_names.c 19928 2007-01-16 10:37:54Z lha $");  struct _gss_mechanism_name *  _gss_find_mn(struct _gss_name *name, gss_OID mech) @@ -62,7 +62,8 @@ _gss_find_mn(struct _gss_name *name, gss_OID mech)  		    (name->gn_type.elements  			? &name->gn_type : GSS_C_NO_OID),  		    &mn->gmn_name); -		if (major_status) { +		if (major_status != GSS_S_COMPLETE) { +			_gss_mg_error(m, major_status, minor_status);  			free(mn);  			return (0);  		} diff --git a/source4/heimdal/lib/gssapi/mech/gss_oid_equal.c b/source4/heimdal/lib/gssapi/mech/gss_oid_equal.c index 1a8b811f37..8c75410cc1 100644 --- a/source4/heimdal/lib/gssapi/mech/gss_oid_equal.c +++ b/source4/heimdal/lib/gssapi/mech/gss_oid_equal.c @@ -32,7 +32,7 @@   */  #include "mech_locl.h" -RCSID("$Id: gss_oid_equal.c,v 1.1 2006/06/28 09:07:08 lha Exp $"); +RCSID("$Id: gss_oid_equal.c 17702 2006-06-28 09:07:08Z lha $");  int  gss_oid_equal(const gss_OID a, const gss_OID b) diff --git a/source4/heimdal/lib/gssapi/mech/gss_oid_to_str.c b/source4/heimdal/lib/gssapi/mech/gss_oid_to_str.c new file mode 100644 index 0000000000..3195370b77 --- /dev/null +++ b/source4/heimdal/lib/gssapi/mech/gss_oid_to_str.c @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2006 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden).  + * All rights reserved.  + * + * Redistribution and use in source and binary forms, with or without  + * modification, are permitted provided that the following conditions  + * are met:  + * + * 1. Redistributions of source code must retain the above copyright  + *    notice, this list of conditions and the following disclaimer.  + * + * 2. Redistributions in binary form must reproduce the above copyright  + *    notice, this list of conditions and the following disclaimer in the  + *    documentation and/or other materials provided with the distribution.  + * + * 3. Neither the name of the Institute nor the names of its contributors  + *    may be used to endorse or promote products derived from this software  + *    without specific prior written permission.  + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND  + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE  + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE  + * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE  + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL  + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS  + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)  + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT  + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY  + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF  + * SUCH DAMAGE.  + */ + +#include "mech_locl.h" +RCSID("$Id: gss_oid_to_str.c 19963 2007-01-17 16:01:22Z lha $"); + +OM_uint32 +gss_oid_to_str(OM_uint32 *minor_status, gss_OID oid, gss_buffer_t oid_str) +{ +    int ret; +    size_t size; +    heim_oid o; +    char *p; + +    _mg_buffer_zero(oid_str); + +    ret = der_get_oid (oid->elements, oid->length, &o, &size); +    if (ret) { +	*minor_status = ret; +	return GSS_S_FAILURE; +    } + +    ret = der_print_heim_oid(&o, ' ', &p); +    der_free_oid(&o); +    if (ret) { +	*minor_status = ret; +	return GSS_S_FAILURE; +    } +     +    oid_str->value = p; +    oid_str->length = strlen(p); + +    *minor_status = 0; +    return GSS_S_COMPLETE; +} diff --git a/source4/heimdal/lib/gssapi/mech/gss_process_context_token.c b/source4/heimdal/lib/gssapi/mech/gss_process_context_token.c index 1e6f39979f..dff6b04f14 100644 --- a/source4/heimdal/lib/gssapi/mech/gss_process_context_token.c +++ b/source4/heimdal/lib/gssapi/mech/gss_process_context_token.c @@ -27,7 +27,7 @@   */  #include "mech_locl.h" -RCSID("$Id: gss_process_context_token.c,v 1.2 2006/06/28 09:00:25 lha Exp $"); +RCSID("$Id: gss_process_context_token.c 17700 2006-06-28 09:00:26Z lha $");  OM_uint32  gss_process_context_token(OM_uint32 *minor_status, diff --git a/source4/heimdal/lib/gssapi/mech/gss_release_buffer.c b/source4/heimdal/lib/gssapi/mech/gss_release_buffer.c index 66705bb40e..fc55cae030 100644 --- a/source4/heimdal/lib/gssapi/mech/gss_release_buffer.c +++ b/source4/heimdal/lib/gssapi/mech/gss_release_buffer.c @@ -27,7 +27,7 @@   */  #include "mech_locl.h" -RCSID("$Id: gss_release_buffer.c,v 1.2 2006/06/28 09:00:25 lha Exp $"); +RCSID("$Id: gss_release_buffer.c 19962 2007-01-17 15:59:04Z lha $");  OM_uint32  gss_release_buffer(OM_uint32 *minor_status, @@ -37,8 +37,7 @@ gss_release_buffer(OM_uint32 *minor_status,  	*minor_status = 0;  	if (buffer->value)  		free(buffer->value); -	buffer->length = 0; -	buffer->value = 0; +	_mg_buffer_zero(buffer);  	return (GSS_S_COMPLETE);  } diff --git a/source4/heimdal/lib/gssapi/mech/gss_release_cred.c b/source4/heimdal/lib/gssapi/mech/gss_release_cred.c index 760621c861..b26dbd7865 100644 --- a/source4/heimdal/lib/gssapi/mech/gss_release_cred.c +++ b/source4/heimdal/lib/gssapi/mech/gss_release_cred.c @@ -27,7 +27,7 @@   */  #include "mech_locl.h" -RCSID("$Id: gss_release_cred.c,v 1.2 2006/06/28 09:00:25 lha Exp $"); +RCSID("$Id: gss_release_cred.c 19963 2007-01-17 16:01:22Z lha $");  OM_uint32  gss_release_cred(OM_uint32 *minor_status, gss_cred_id_t *cred_handle) @@ -47,6 +47,6 @@ gss_release_cred(OM_uint32 *minor_status, gss_cred_id_t *cred_handle)  	free(cred);  	*minor_status = 0; -	*cred_handle = 0; +	*cred_handle = GSS_C_NO_CREDENTIAL;  	return (GSS_S_COMPLETE);  } diff --git a/source4/heimdal/lib/gssapi/mech/gss_release_name.c b/source4/heimdal/lib/gssapi/mech/gss_release_name.c index 1286cd3b79..313eab8245 100644 --- a/source4/heimdal/lib/gssapi/mech/gss_release_name.c +++ b/source4/heimdal/lib/gssapi/mech/gss_release_name.c @@ -27,7 +27,7 @@   */  #include "mech_locl.h" -RCSID("$Id: gss_release_name.c,v 1.3 2006/10/22 07:59:06 lha Exp $"); +RCSID("$Id: gss_release_name.c 18812 2006-10-22 07:59:06Z lha $");  OM_uint32  gss_release_name(OM_uint32 *minor_status, diff --git a/source4/heimdal/lib/gssapi/mech/gss_release_oid.c b/source4/heimdal/lib/gssapi/mech/gss_release_oid.c index fc84fabd29..7754787fa8 100644 --- a/source4/heimdal/lib/gssapi/mech/gss_release_oid.c +++ b/source4/heimdal/lib/gssapi/mech/gss_release_oid.c @@ -33,7 +33,7 @@  #include "mech_locl.h" -RCSID("$Id: gss_release_oid.c,v 1.1 2006/06/30 09:34:54 lha Exp $"); +RCSID("$Id: gss_release_oid.c 17747 2006-06-30 09:34:54Z lha $");  OM_uint32  gss_release_oid(OM_uint32 *minor_status, gss_OID *oid) diff --git a/source4/heimdal/lib/gssapi/mech/gss_release_oid_set.c b/source4/heimdal/lib/gssapi/mech/gss_release_oid_set.c index 101657e4fb..4372e62294 100644 --- a/source4/heimdal/lib/gssapi/mech/gss_release_oid_set.c +++ b/source4/heimdal/lib/gssapi/mech/gss_release_oid_set.c @@ -27,7 +27,7 @@   */  #include "mech_locl.h" -RCSID("$Id: gss_release_oid_set.c,v 1.2 2006/06/28 09:00:25 lha Exp $"); +RCSID("$Id: gss_release_oid_set.c 19963 2007-01-17 16:01:22Z lha $");  OM_uint32  gss_release_oid_set(OM_uint32 *minor_status, @@ -39,7 +39,7 @@ gss_release_oid_set(OM_uint32 *minor_status,  		if ((*set)->elements)  			free((*set)->elements);  		free(*set); -		*set = 0; +		*set = GSS_C_NO_OID_SET;  	}  	return (GSS_S_COMPLETE);  } diff --git a/source4/heimdal/lib/gssapi/mech/gss_seal.c b/source4/heimdal/lib/gssapi/mech/gss_seal.c index 2f66f90d4f..71c5e70dc7 100644 --- a/source4/heimdal/lib/gssapi/mech/gss_seal.c +++ b/source4/heimdal/lib/gssapi/mech/gss_seal.c @@ -27,7 +27,7 @@   */  #include "mech_locl.h" -RCSID("$Id: gss_seal.c,v 1.2 2006/06/28 09:00:25 lha Exp $"); +RCSID("$Id: gss_seal.c 17700 2006-06-28 09:00:26Z lha $");  OM_uint32  gss_seal(OM_uint32 *minor_status, diff --git a/source4/heimdal/lib/gssapi/mech/gss_set_cred_option.c b/source4/heimdal/lib/gssapi/mech/gss_set_cred_option.c index f813d72ac8..78c8cc79c1 100644 --- a/source4/heimdal/lib/gssapi/mech/gss_set_cred_option.c +++ b/source4/heimdal/lib/gssapi/mech/gss_set_cred_option.c @@ -31,7 +31,7 @@   */  #include "mech_locl.h" -RCSID("$Id: gss_set_cred_option.c,v 1.8 2006/11/13 08:59:43 lha Exp $"); +RCSID("$Id: gss_set_cred_option.c 20626 2007-05-08 13:56:49Z lha $");  OM_uint32  gss_set_cred_option (OM_uint32 *minor_status, @@ -55,7 +55,6 @@ gss_set_cred_option (OM_uint32 *minor_status,  		if (cred == NULL)  		    return GSS_S_FAILURE; -		cred->gc_usage = GSS_C_BOTH; /* XXX */  		SLIST_INIT(&cred->gc_mc);  		SLIST_FOREACH(m, &_gss_mechs, gm_link) { @@ -104,6 +103,9 @@ gss_set_cred_option (OM_uint32 *minor_status,  			    &mc->gmc_cred, object, value);  			if (major_status == GSS_S_COMPLETE)  				one_ok = 1; +			else +				_gss_mg_error(m, major_status, *minor_status); +  		}  	}  	if (one_ok) { diff --git a/source4/heimdal/lib/gssapi/mech/gss_set_sec_context_option.c b/source4/heimdal/lib/gssapi/mech/gss_set_sec_context_option.c index aa562a23b6..d312251f53 100644 --- a/source4/heimdal/lib/gssapi/mech/gss_set_sec_context_option.c +++ b/source4/heimdal/lib/gssapi/mech/gss_set_sec_context_option.c @@ -31,7 +31,7 @@   */  #include "mech_locl.h" -RCSID("$Id: gss_set_sec_context_option.c,v 1.2 2006/06/28 14:39:00 lha Exp $"); +RCSID("$Id: gss_set_sec_context_option.c 19928 2007-01-16 10:37:54Z lha $");  OM_uint32  gss_set_sec_context_option (OM_uint32 *minor_status, @@ -58,10 +58,12 @@ gss_set_sec_context_option (OM_uint32 *minor_status,  	if (m == NULL)  		return GSS_S_BAD_MECH; -	if (m->gm_set_sec_context_option != NULL) +	if (m->gm_set_sec_context_option != NULL) {  		major_status = m->gm_set_sec_context_option(minor_status,  		    &ctx->gc_ctx, object, value); -	else +		if (major_status != GSS_S_COMPLETE) +			_gss_mg_error(m, major_status, *minor_status); +	} else  		major_status = GSS_S_BAD_MECH;  	return major_status; diff --git a/source4/heimdal/lib/gssapi/mech/gss_sign.c b/source4/heimdal/lib/gssapi/mech/gss_sign.c index 8c854e5e43..5268197c61 100644 --- a/source4/heimdal/lib/gssapi/mech/gss_sign.c +++ b/source4/heimdal/lib/gssapi/mech/gss_sign.c @@ -27,7 +27,7 @@   */  #include "mech_locl.h" -RCSID("$Id: gss_sign.c,v 1.2 2006/06/28 09:00:25 lha Exp $"); +RCSID("$Id: gss_sign.c 17700 2006-06-28 09:00:26Z lha $");  OM_uint32  gss_sign(OM_uint32 *minor_status, diff --git a/source4/heimdal/lib/gssapi/mech/gss_test_oid_set_member.c b/source4/heimdal/lib/gssapi/mech/gss_test_oid_set_member.c index a71a8b7c92..fc3c5ddeef 100644 --- a/source4/heimdal/lib/gssapi/mech/gss_test_oid_set_member.c +++ b/source4/heimdal/lib/gssapi/mech/gss_test_oid_set_member.c @@ -27,7 +27,7 @@   */  #include "mech_locl.h" -RCSID("$Id: gss_test_oid_set_member.c,v 1.2 2006/06/28 09:00:25 lha Exp $"); +RCSID("$Id: gss_test_oid_set_member.c 17700 2006-06-28 09:00:26Z lha $");  OM_uint32  gss_test_oid_set_member(OM_uint32 *minor_status, diff --git a/source4/heimdal/lib/gssapi/mech/gss_unseal.c b/source4/heimdal/lib/gssapi/mech/gss_unseal.c index 128dc7883c..205cc6e326 100644 --- a/source4/heimdal/lib/gssapi/mech/gss_unseal.c +++ b/source4/heimdal/lib/gssapi/mech/gss_unseal.c @@ -27,7 +27,7 @@   */  #include "mech_locl.h" -RCSID("$Id: gss_unseal.c,v 1.2 2006/06/28 09:00:25 lha Exp $"); +RCSID("$Id: gss_unseal.c 17700 2006-06-28 09:00:26Z lha $");  OM_uint32  gss_unseal(OM_uint32 *minor_status, diff --git a/source4/heimdal/lib/gssapi/mech/gss_unwrap.c b/source4/heimdal/lib/gssapi/mech/gss_unwrap.c index 1c9484b18d..69c125356b 100644 --- a/source4/heimdal/lib/gssapi/mech/gss_unwrap.c +++ b/source4/heimdal/lib/gssapi/mech/gss_unwrap.c @@ -27,7 +27,7 @@   */  #include "mech_locl.h" -RCSID("$Id: gss_unwrap.c,v 1.2 2006/06/28 09:00:25 lha Exp $"); +RCSID("$Id: gss_unwrap.c 17700 2006-06-28 09:00:26Z lha $");  OM_uint32  gss_unwrap(OM_uint32 *minor_status, diff --git a/source4/heimdal/lib/gssapi/mech/gss_utils.c b/source4/heimdal/lib/gssapi/mech/gss_utils.c index d674fb163b..22217a9d62 100644 --- a/source4/heimdal/lib/gssapi/mech/gss_utils.c +++ b/source4/heimdal/lib/gssapi/mech/gss_utils.c @@ -27,7 +27,7 @@   */  #include "mech_locl.h" -RCSID("$Id: gss_utils.c,v 1.3 2006/12/18 13:01:25 lha Exp $"); +RCSID("$Id: gss_utils.c 19965 2007-01-17 16:23:47Z lha $");  OM_uint32  _gss_copy_oid(OM_uint32 *minor_status, @@ -38,6 +38,7 @@ _gss_copy_oid(OM_uint32 *minor_status,  	*minor_status = 0;  	to_oid->elements = malloc(len);  	if (!to_oid->elements) { +		to_oid->length = 0;  		*minor_status = ENOMEM;  		return GSS_S_FAILURE;  	} @@ -68,6 +69,7 @@ _gss_copy_buffer(OM_uint32 *minor_status,  	to_buf->value = malloc(len);  	if (!to_buf->value) {  		*minor_status = ENOMEM; +		to_buf->length = 0;  		return GSS_S_FAILURE;  	}  	to_buf->length = len; diff --git a/source4/heimdal/lib/gssapi/mech/gss_verify.c b/source4/heimdal/lib/gssapi/mech/gss_verify.c index a99d17e2d7..f11cac7d2e 100644 --- a/source4/heimdal/lib/gssapi/mech/gss_verify.c +++ b/source4/heimdal/lib/gssapi/mech/gss_verify.c @@ -27,7 +27,7 @@   */  #include "mech_locl.h" -RCSID("$Id: gss_verify.c,v 1.2 2006/06/28 09:00:25 lha Exp $"); +RCSID("$Id: gss_verify.c 17700 2006-06-28 09:00:26Z lha $");  OM_uint32  gss_verify(OM_uint32 *minor_status, diff --git a/source4/heimdal/lib/gssapi/mech/gss_verify_mic.c b/source4/heimdal/lib/gssapi/mech/gss_verify_mic.c index b51ed7a8c4..118f50735f 100644 --- a/source4/heimdal/lib/gssapi/mech/gss_verify_mic.c +++ b/source4/heimdal/lib/gssapi/mech/gss_verify_mic.c @@ -27,7 +27,7 @@   */  #include "mech_locl.h" -RCSID("$Id: gss_verify_mic.c,v 1.2 2006/06/28 09:00:25 lha Exp $"); +RCSID("$Id: gss_verify_mic.c 19965 2007-01-17 16:23:47Z lha $");  OM_uint32  gss_verify_mic(OM_uint32 *minor_status, @@ -39,6 +39,13 @@ gss_verify_mic(OM_uint32 *minor_status,  	struct _gss_context *ctx = (struct _gss_context *) context_handle;  	gssapi_mech_interface m = ctx->gc_mech; +	if (qop_state) +	    *qop_state = 0; +	if (ctx == NULL) { +	    *minor_status = 0; +	    return GSS_S_NO_CONTEXT; +	} +  	return (m->gm_verify_mic(minor_status, ctx->gc_ctx,  		    message_buffer, token_buffer, qop_state));  } diff --git a/source4/heimdal/lib/gssapi/mech/gss_wrap.c b/source4/heimdal/lib/gssapi/mech/gss_wrap.c index a97ec1308f..0eb9dfbc6d 100644 --- a/source4/heimdal/lib/gssapi/mech/gss_wrap.c +++ b/source4/heimdal/lib/gssapi/mech/gss_wrap.c @@ -27,7 +27,7 @@   */  #include "mech_locl.h" -RCSID("$Id: gss_wrap.c,v 1.2 2006/06/28 09:00:26 lha Exp $"); +RCSID("$Id: gss_wrap.c 19965 2007-01-17 16:23:47Z lha $");  OM_uint32  gss_wrap(OM_uint32 *minor_status, @@ -41,6 +41,14 @@ gss_wrap(OM_uint32 *minor_status,  	struct _gss_context *ctx = (struct _gss_context *) context_handle;  	gssapi_mech_interface m = ctx->gc_mech; +	if (conf_state) +	    *conf_state = 0; +	_mg_buffer_zero(output_message_buffer); +	if (ctx == NULL) { +	    *minor_status = 0; +	    return GSS_S_NO_CONTEXT; +	} +  	return (m->gm_wrap(minor_status, ctx->gc_ctx,  		    conf_req_flag, qop_req, input_message_buffer,  		    conf_state, output_message_buffer)); diff --git a/source4/heimdal/lib/gssapi/mech/gss_wrap_size_limit.c b/source4/heimdal/lib/gssapi/mech/gss_wrap_size_limit.c index 27493aa90d..35b3ad723d 100644 --- a/source4/heimdal/lib/gssapi/mech/gss_wrap_size_limit.c +++ b/source4/heimdal/lib/gssapi/mech/gss_wrap_size_limit.c @@ -27,7 +27,7 @@   */  #include "mech_locl.h" -RCSID("$Id: gss_wrap_size_limit.c,v 1.2 2006/06/28 09:00:26 lha Exp $"); +RCSID("$Id: gss_wrap_size_limit.c 19965 2007-01-17 16:23:47Z lha $");  OM_uint32  gss_wrap_size_limit(OM_uint32 *minor_status, @@ -39,6 +39,12 @@ gss_wrap_size_limit(OM_uint32 *minor_status,  {  	struct _gss_context *ctx = (struct _gss_context *) context_handle;  	gssapi_mech_interface m = ctx->gc_mech; +	 +	*max_input_size = 0; +	if (ctx == NULL) { +	    *minor_status = 0; +	    return GSS_S_NO_CONTEXT; +	}  	return (m->gm_wrap_size_limit(minor_status, ctx->gc_ctx,  		    conf_req_flag, qop_req, req_output_size, max_input_size)); diff --git a/source4/heimdal/lib/gssapi/mech/gssapi.asn1 b/source4/heimdal/lib/gssapi/mech/gssapi.asn1 index 544618b7d4..44b30bfa7e 100644 --- a/source4/heimdal/lib/gssapi/mech/gssapi.asn1 +++ b/source4/heimdal/lib/gssapi/mech/gssapi.asn1 @@ -1,4 +1,4 @@ --- $Id: gssapi.asn1,v 1.3 2006/10/18 21:08:19 lha Exp $ +-- $Id: gssapi.asn1 18565 2006-10-18 21:08:19Z lha $  GSS-API DEFINITIONS ::= BEGIN diff --git a/source4/heimdal/lib/gssapi/mech/mech_locl.h b/source4/heimdal/lib/gssapi/mech/mech_locl.h index f5db15c5fa..4399fa78a6 100644 --- a/source4/heimdal/lib/gssapi/mech/mech_locl.h +++ b/source4/heimdal/lib/gssapi/mech/mech_locl.h @@ -31,7 +31,7 @@   * SUCH DAMAGE.    */ -/* $Id: mech_locl.h,v 1.4 2006/10/07 18:25:27 lha Exp $ */ +/* $Id: mech_locl.h 19948 2007-01-17 10:03:07Z lha $ */  #include <config.h> @@ -61,3 +61,6 @@  #include "mech_switch.h"  #include "name.h"  #include "utils.h" + +#define _mg_buffer_zero(buffer) \ +	do { (buffer)->value = NULL; (buffer)->length = 0; } while(0) diff --git a/source4/heimdal/lib/gssapi/mech/mech_switch.h b/source4/heimdal/lib/gssapi/mech/mech_switch.h index 0984d36ef3..14e6d7978c 100644 --- a/source4/heimdal/lib/gssapi/mech/mech_switch.h +++ b/source4/heimdal/lib/gssapi/mech/mech_switch.h @@ -24,7 +24,7 @@   * SUCH DAMAGE.   *   *	$FreeBSD: src/lib/libgssapi/mech_switch.h,v 1.1 2005/12/29 14:40:20 dfr Exp $ - *	$Id: mech_switch.h,v 1.3 2006/10/05 18:31:53 lha Exp $ + *	$Id: mech_switch.h 18246 2006-10-05 18:36:07Z lha $   */  #include <gssapi_mech.h> diff --git a/source4/heimdal/lib/gssapi/mech/name.h b/source4/heimdal/lib/gssapi/mech/name.h index 3e7443ba20..2252150a06 100644 --- a/source4/heimdal/lib/gssapi/mech/name.h +++ b/source4/heimdal/lib/gssapi/mech/name.h @@ -24,7 +24,7 @@   * SUCH DAMAGE.   *   *	$FreeBSD: src/lib/libgssapi/name.h,v 1.1 2005/12/29 14:40:20 dfr Exp $ - *	$Id: name.h,v 1.4 2006/10/05 18:36:07 lha Exp $ + *	$Id: name.h 18246 2006-10-05 18:36:07Z lha $   */  struct _gss_mechanism_name { diff --git a/source4/heimdal/lib/gssapi/mech/utils.h b/source4/heimdal/lib/gssapi/mech/utils.h index 42e92c3f42..908203557e 100644 --- a/source4/heimdal/lib/gssapi/mech/utils.h +++ b/source4/heimdal/lib/gssapi/mech/utils.h @@ -24,7 +24,7 @@   * SUCH DAMAGE.   *   *	$FreeBSD: src/lib/libgssapi/utils.h,v 1.1 2005/12/29 14:40:20 dfr Exp $ - *	$Id: utils.h,v 1.4 2006/12/18 13:01:40 lha Exp $ + *	$Id: utils.h 19398 2006-12-18 13:01:40Z lha $   */  OM_uint32 _gss_free_oid(OM_uint32 *, gss_OID);  | 
