gss: pass GSS_C_NO_OID name type through to mechanism
Allow the mechanism, rather than the mechanism glue, to determine the default name type if GSS_C_NO_OID was passed in when importing a name.
This commit is contained in:
		| @@ -44,7 +44,15 @@ gss_compare_name(OM_uint32 *minor_status, | ||||
| 	 * names have one. Otherwise, try to find common mechanism | ||||
| 	 * names and compare them. | ||||
| 	 */ | ||||
| 	if (name1->gn_value.value && name2->gn_value.value) { | ||||
|        if (name1->gn_value.value && name2->gn_value.value && | ||||
| 	    name1->gn_type == GSS_C_NO_OID && name2->gn_type == GSS_C_NO_OID) { | ||||
| 	    *name_equal = | ||||
| 		name1->gn_value.length == name2->gn_value.length && | ||||
| 		memcmp(name1->gn_value.value, name2->gn_value.value, | ||||
| 		       name1->gn_value.length) == 0; | ||||
| 	} else if (name1->gn_value.value && name2->gn_value.value && | ||||
| 		   name1->gn_type != GSS_C_NO_OID && | ||||
| 		   name2->gn_type != GSS_C_NO_OID) { | ||||
| 		*name_equal = 1; | ||||
| 		/* RFC 2743: anonymous names always compare false */ | ||||
| 		if (gss_oid_equal(name1->gn_type, GSS_C_NT_ANONYMOUS) || | ||||
|   | ||||
| @@ -197,12 +197,6 @@ gss_import_name(OM_uint32 *minor_status, | ||||
|  | ||||
| 	_gss_load_mech(); | ||||
|  | ||||
| 	/* | ||||
| 	 * Use GSS_NT_USER_NAME as default name type. | ||||
| 	 */ | ||||
| 	if (name_type == GSS_C_NO_OID) | ||||
| 		name_type = GSS_C_NT_USER_NAME; | ||||
|  | ||||
| 	/* | ||||
| 	 * If this is an exported name, we need to parse it to find | ||||
| 	 * the mechanism and then import it as an MN. See RFC 2743 | ||||
| @@ -221,13 +215,16 @@ gss_import_name(OM_uint32 *minor_status, | ||||
| 		return (GSS_S_FAILURE); | ||||
| 	} | ||||
|  | ||||
| 	major_status = _gss_intern_oid(minor_status, | ||||
| 	    name_type, &name->gn_type); | ||||
| 	if (major_status) { | ||||
| 		rname = (gss_name_t)name; | ||||
| 		gss_release_name(&ms, (gss_name_t *)&rname); | ||||
| 		return (GSS_S_FAILURE); | ||||
| 	} | ||||
| 	if (name_type != GSS_C_NO_OID) { | ||||
| 		major_status = _gss_intern_oid(minor_status, | ||||
| 					       name_type, &name->gn_type); | ||||
| 		if (major_status) { | ||||
| 			rname = (gss_name_t)name; | ||||
| 			gss_release_name(&ms, (gss_name_t *)&rname); | ||||
| 			return (GSS_S_FAILURE); | ||||
| 		} | ||||
| 	} else | ||||
| 		name->gn_type = GSS_C_NO_OID; | ||||
|  | ||||
| 	major_status = _gss_copy_buffer(minor_status, | ||||
| 	    input_name_buffer, &name->gn_value); | ||||
| @@ -245,11 +242,13 @@ gss_import_name(OM_uint32 *minor_status, | ||||
|                 if ((m->gm_mech.gm_flags & GM_USE_MG_NAME)) | ||||
|                     continue; | ||||
|  | ||||
| 		major_status = gss_test_oid_set_member(minor_status, | ||||
| 		    name_type, m->gm_name_types, &present); | ||||
| 		if (name_type != GSS_C_NO_OID) { | ||||
| 			    major_status = gss_test_oid_set_member(minor_status, | ||||
| 				    name_type, m->gm_name_types, &present); | ||||
|  | ||||
| 		if (major_status || present == 0) | ||||
| 			continue; | ||||
| 			    if (GSS_ERROR(major_status) || present == 0) | ||||
| 					continue; | ||||
| 		} | ||||
|  | ||||
| 		mn = malloc(sizeof(struct _gss_mechanism_name)); | ||||
| 		if (!mn) { | ||||
|   | ||||
| @@ -36,7 +36,8 @@ is_anonymous_identity_p(gss_buffer_t name_string, gss_OID name_type) | ||||
| { | ||||
|     if (gss_oid_equal(name_type, GSS_C_NT_ANONYMOUS)) | ||||
| 	return TRUE; | ||||
|     else if ((gss_oid_equal(name_type, GSS_C_NT_USER_NAME) || | ||||
|     else if ((name_type == GSS_C_NO_OID || | ||||
| 	      gss_oid_equal(name_type, GSS_C_NT_USER_NAME) || | ||||
| 	      gss_oid_equal(name_type, GSS_KRB5_NT_PRINCIPAL_NAME)) && | ||||
| 	buffer_equal_p(name_string, _gss_sanon_wellknown_user_name)) | ||||
| 	return TRUE; | ||||
| @@ -151,9 +152,6 @@ _gss_sanon_import_name(OM_uint32 *minor, | ||||
| 		       const gss_OID input_name_type, | ||||
| 		       gss_name_t *output_name) | ||||
| { | ||||
|     heim_assert(input_name_type != GSS_C_NO_OID, | ||||
| 		"Mechglue passed null OID to _gss_sanon_import_name"); | ||||
|  | ||||
|     if (gss_oid_equal(input_name_type, GSS_C_NT_EXPORT_NAME)) | ||||
| 	return import_export_name(minor, input_name_buffer, output_name); | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Luke Howard
					Luke Howard