xref: /freebsd/lib/libgssapi/gss_display_status.c (revision b3e7694832e81d7a904a10f525f8797b753bf0d3)
1c0b9f4feSDoug Rabson /*-
28a16b7a1SPedro F. Giffuni  * SPDX-License-Identifier: BSD-3-Clause
38a16b7a1SPedro F. Giffuni  *
4c0b9f4feSDoug Rabson  * Copyright (c) 2005 Doug Rabson
5c0b9f4feSDoug Rabson  * All rights reserved.
6c0b9f4feSDoug Rabson  *
7c0b9f4feSDoug Rabson  * Redistribution and use in source and binary forms, with or without
8c0b9f4feSDoug Rabson  * modification, are permitted provided that the following conditions
9c0b9f4feSDoug Rabson  * are met:
10c0b9f4feSDoug Rabson  * 1. Redistributions of source code must retain the above copyright
11c0b9f4feSDoug Rabson  *    notice, this list of conditions and the following disclaimer.
12c0b9f4feSDoug Rabson  * 2. Redistributions in binary form must reproduce the above copyright
13c0b9f4feSDoug Rabson  *    notice, this list of conditions and the following disclaimer in the
14c0b9f4feSDoug Rabson  *    documentation and/or other materials provided with the distribution.
15c0b9f4feSDoug Rabson  *
16c0b9f4feSDoug Rabson  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17c0b9f4feSDoug Rabson  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18c0b9f4feSDoug Rabson  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19c0b9f4feSDoug Rabson  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20c0b9f4feSDoug Rabson  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21c0b9f4feSDoug Rabson  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22c0b9f4feSDoug Rabson  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23c0b9f4feSDoug Rabson  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24c0b9f4feSDoug Rabson  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25c0b9f4feSDoug Rabson  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26c0b9f4feSDoug Rabson  * SUCH DAMAGE.
27c0b9f4feSDoug Rabson  */
2822a25490SDoug Rabson /*
29bf3f9db6SUlrich Spörlein  * Copyright (c) 1998 - 2005 Kungliga Tekniska Högskolan
3022a25490SDoug Rabson  * (Royal Institute of Technology, Stockholm, Sweden).
3122a25490SDoug Rabson  * All rights reserved.
3222a25490SDoug Rabson  *
3322a25490SDoug Rabson  * Redistribution and use in source and binary forms, with or without
3422a25490SDoug Rabson  * modification, are permitted provided that the following conditions
3522a25490SDoug Rabson  * are met:
3622a25490SDoug Rabson  *
3722a25490SDoug Rabson  * 1. Redistributions of source code must retain the above copyright
3822a25490SDoug Rabson  *    notice, this list of conditions and the following disclaimer.
3922a25490SDoug Rabson  *
4022a25490SDoug Rabson  * 2. Redistributions in binary form must reproduce the above copyright
4122a25490SDoug Rabson  *    notice, this list of conditions and the following disclaimer in the
4222a25490SDoug Rabson  *    documentation and/or other materials provided with the distribution.
4322a25490SDoug Rabson  *
4422a25490SDoug Rabson  * 3. Neither the name of the Institute nor the names of its contributors
4522a25490SDoug Rabson  *    may be used to endorse or promote products derived from this software
4622a25490SDoug Rabson  *    without specific prior written permission.
4722a25490SDoug Rabson  *
4822a25490SDoug Rabson  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
4922a25490SDoug Rabson  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
5022a25490SDoug Rabson  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
5122a25490SDoug Rabson  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
5222a25490SDoug Rabson  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
5322a25490SDoug Rabson  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
5422a25490SDoug Rabson  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
5522a25490SDoug Rabson  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
5622a25490SDoug Rabson  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
5722a25490SDoug Rabson  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
5822a25490SDoug Rabson  * SUCH DAMAGE.
5922a25490SDoug Rabson  */
6033f12199SDoug Rabson /*
61bf3f9db6SUlrich Spörlein  * Copyright (c) 1998 - 2005 Kungliga Tekniska Högskolan
6233f12199SDoug Rabson  * (Royal Institute of Technology, Stockholm, Sweden).
6333f12199SDoug Rabson  * All rights reserved.
6433f12199SDoug Rabson  *
6533f12199SDoug Rabson  * Redistribution and use in source and binary forms, with or without
6633f12199SDoug Rabson  * modification, are permitted provided that the following conditions
6733f12199SDoug Rabson  * are met:
6833f12199SDoug Rabson  *
6933f12199SDoug Rabson  * 1. Redistributions of source code must retain the above copyright
7033f12199SDoug Rabson  *    notice, this list of conditions and the following disclaimer.
7133f12199SDoug Rabson  *
7233f12199SDoug Rabson  * 2. Redistributions in binary form must reproduce the above copyright
7333f12199SDoug Rabson  *    notice, this list of conditions and the following disclaimer in the
7433f12199SDoug Rabson  *    documentation and/or other materials provided with the distribution.
7533f12199SDoug Rabson  *
7633f12199SDoug Rabson  * 3. Neither the name of the Institute nor the names of its contributors
7733f12199SDoug Rabson  *    may be used to endorse or promote products derived from this software
7833f12199SDoug Rabson  *    without specific prior written permission.
7933f12199SDoug Rabson  *
8033f12199SDoug Rabson  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
8133f12199SDoug Rabson  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
8233f12199SDoug Rabson  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
8333f12199SDoug Rabson  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
8433f12199SDoug Rabson  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
8533f12199SDoug Rabson  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
8633f12199SDoug Rabson  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
8733f12199SDoug Rabson  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
8833f12199SDoug Rabson  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
8933f12199SDoug Rabson  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
9033f12199SDoug Rabson  * SUCH DAMAGE.
9133f12199SDoug Rabson  */
92c0b9f4feSDoug Rabson 
93*155e5865SBrooks Davis #include <sys/param.h>
94c0b9f4feSDoug Rabson #include <gssapi/gssapi.h>
9533f12199SDoug Rabson #include <stdio.h>
96c0b9f4feSDoug Rabson #include <string.h>
9733f12199SDoug Rabson #include <stdlib.h>
9822a25490SDoug Rabson #include <errno.h>
99c0b9f4feSDoug Rabson 
100c0b9f4feSDoug Rabson #include "mech_switch.h"
10133f12199SDoug Rabson #include "utils.h"
102c0b9f4feSDoug Rabson 
10322a25490SDoug Rabson static const char *
calling_error(OM_uint32 v)10422a25490SDoug Rabson calling_error(OM_uint32 v)
10522a25490SDoug Rabson {
10622a25490SDoug Rabson     static const char *msgs[] = {
107*155e5865SBrooks Davis 	[0] = "",
108*155e5865SBrooks Davis 	[1] = "A required input parameter could not be read.",
109*155e5865SBrooks Davis 	[2] = "A required output parameter could not be written.",
110*155e5865SBrooks Davis 	[3] = "A parameter was malformed",
111c0b9f4feSDoug Rabson     };
112c0b9f4feSDoug Rabson 
11322a25490SDoug Rabson     v >>= GSS_C_CALLING_ERROR_OFFSET;
114c0b9f4feSDoug Rabson 
115*155e5865SBrooks Davis     if (v >= nitems(msgs))
11622a25490SDoug Rabson 	return "unknown calling error";
11722a25490SDoug Rabson     else
11822a25490SDoug Rabson 	return msgs[v];
11922a25490SDoug Rabson }
12022a25490SDoug Rabson 
12122a25490SDoug Rabson static const char *
routine_error(OM_uint32 v)12222a25490SDoug Rabson routine_error(OM_uint32 v)
12322a25490SDoug Rabson {
12422a25490SDoug Rabson     static const char *msgs[] = {
125*155e5865SBrooks Davis 	[0] = "Function completed successfully",
126*155e5865SBrooks Davis 	[1] = "An unsupported mechanism was requested",
127*155e5865SBrooks Davis 	[2] = "An invalid name was supplied",
128*155e5865SBrooks Davis 	[3] = "A supplied name was of an unsupported type",
129*155e5865SBrooks Davis 	[4] = "Incorrect channel bindings were supplied",
130*155e5865SBrooks Davis 	[5] = "An invalid status code was supplied",
131*155e5865SBrooks Davis 	[6] = "A token had an invalid MIC",
132*155e5865SBrooks Davis 	[7] = ("No credentials were supplied, "
133*155e5865SBrooks Davis 	    "or the credentials were unavailable or inaccessible."),
134*155e5865SBrooks Davis 	[8] = "No context has been established",
135*155e5865SBrooks Davis 	[9] = "A token was invalid",
136*155e5865SBrooks Davis 	[10] = "A credential was invalid",
137*155e5865SBrooks Davis 	[11] =  "The referenced credentials have expired",
138*155e5865SBrooks Davis 	[12] = "The context has expired",
139*155e5865SBrooks Davis 	[13] = "Miscellaneous failure (see text)",
140*155e5865SBrooks Davis 	[14] = "The quality-of-protection requested could not be provide",
141*155e5865SBrooks Davis 	[15] = "The operation is forbidden by local security policy",
142*155e5865SBrooks Davis 	[16] = "The operation or option is not available",
143*155e5865SBrooks Davis 	[17] = "The requested credential element already exists",
144*155e5865SBrooks Davis 	[18] = "The provided name was not a mechanism name.",
14522a25490SDoug Rabson     };
14622a25490SDoug Rabson 
14722a25490SDoug Rabson     v >>= GSS_C_ROUTINE_ERROR_OFFSET;
14822a25490SDoug Rabson 
149*155e5865SBrooks Davis     if (v >= nitems(msgs))
15022a25490SDoug Rabson 	return "unknown routine error";
15122a25490SDoug Rabson     else
15222a25490SDoug Rabson 	return msgs[v];
15322a25490SDoug Rabson }
15422a25490SDoug Rabson 
15522a25490SDoug Rabson static const char *
supplementary_error(OM_uint32 v)15622a25490SDoug Rabson supplementary_error(OM_uint32 v)
15722a25490SDoug Rabson {
15822a25490SDoug Rabson     static const char *msgs[] = {
159*155e5865SBrooks Davis 	[0] = "normal completion",
160*155e5865SBrooks Davis 	[1] = "continuation call to routine required",
161*155e5865SBrooks Davis 	[2] = "duplicate per-message token detected",
162*155e5865SBrooks Davis 	[3] = "timed-out per-message token detected",
163*155e5865SBrooks Davis 	[4] = "reordered (early) per-message token detected",
164*155e5865SBrooks Davis 	[5] = "skipped predecessor token(s) detected",
16522a25490SDoug Rabson     };
16622a25490SDoug Rabson 
16722a25490SDoug Rabson     v >>= GSS_C_SUPPLEMENTARY_OFFSET;
16822a25490SDoug Rabson 
169*155e5865SBrooks Davis     if (v >= nitems(msgs))
17022a25490SDoug Rabson 	return "unknown routine error";
17122a25490SDoug Rabson     else
17222a25490SDoug Rabson 	return msgs[v];
17322a25490SDoug Rabson }
174c0b9f4feSDoug Rabson 
17533f12199SDoug Rabson struct mg_thread_ctx {
17633f12199SDoug Rabson     gss_OID mech;
17733f12199SDoug Rabson     OM_uint32 maj_stat;
17833f12199SDoug Rabson     OM_uint32 min_stat;
17933f12199SDoug Rabson     gss_buffer_desc maj_error;
18033f12199SDoug Rabson     gss_buffer_desc min_error;
18133f12199SDoug Rabson };
18233f12199SDoug Rabson static __thread struct mg_thread_ctx last_error_context;
18333f12199SDoug Rabson 
18433f12199SDoug Rabson static OM_uint32
_gss_mg_get_error(const gss_OID mech,OM_uint32 type,OM_uint32 value,gss_buffer_t string)18533f12199SDoug Rabson _gss_mg_get_error(const gss_OID mech, OM_uint32 type,
18633f12199SDoug Rabson 		  OM_uint32 value, gss_buffer_t string)
18733f12199SDoug Rabson {
18833f12199SDoug Rabson 	struct mg_thread_ctx *mg;
18933f12199SDoug Rabson 
19033f12199SDoug Rabson 	mg = &last_error_context;
19133f12199SDoug Rabson 
19233f12199SDoug Rabson 	if (mech != NULL && gss_oid_equal(mg->mech, mech) == 0)
19333f12199SDoug Rabson 		return (GSS_S_BAD_STATUS);
19433f12199SDoug Rabson 
19533f12199SDoug Rabson 	switch (type) {
19633f12199SDoug Rabson 	case GSS_C_GSS_CODE: {
19733f12199SDoug Rabson 		if (value != mg->maj_stat || mg->maj_error.length == 0)
19833f12199SDoug Rabson 			break;
19933f12199SDoug Rabson 		string->value = malloc(mg->maj_error.length);
20033f12199SDoug Rabson 		string->length = mg->maj_error.length;
20133f12199SDoug Rabson 		memcpy(string->value, mg->maj_error.value,
20233f12199SDoug Rabson 		    mg->maj_error.length);
20333f12199SDoug Rabson 		return (GSS_S_COMPLETE);
20433f12199SDoug Rabson 	}
20533f12199SDoug Rabson 	case GSS_C_MECH_CODE: {
20633f12199SDoug Rabson 		if (value != mg->min_stat || mg->min_error.length == 0)
20733f12199SDoug Rabson 			break;
20833f12199SDoug Rabson 		string->value = malloc(mg->min_error.length);
20933f12199SDoug Rabson 		string->length = mg->min_error.length;
21033f12199SDoug Rabson 		memcpy(string->value, mg->min_error.value,
21133f12199SDoug Rabson 		    mg->min_error.length);
21233f12199SDoug Rabson 		return (GSS_S_COMPLETE);
21333f12199SDoug Rabson 	}
21433f12199SDoug Rabson 	}
21533f12199SDoug Rabson 	string->value = NULL;
21633f12199SDoug Rabson 	string->length = 0;
21733f12199SDoug Rabson 	return (GSS_S_BAD_STATUS);
21833f12199SDoug Rabson }
21933f12199SDoug Rabson 
22033f12199SDoug Rabson void
_gss_mg_error(struct _gss_mech_switch * m,OM_uint32 maj,OM_uint32 min)22133f12199SDoug Rabson _gss_mg_error(struct _gss_mech_switch *m, OM_uint32 maj, OM_uint32 min)
22233f12199SDoug Rabson {
22333f12199SDoug Rabson 	OM_uint32 major_status, minor_status;
22433f12199SDoug Rabson 	OM_uint32 message_content;
22533f12199SDoug Rabson 	struct mg_thread_ctx *mg;
22633f12199SDoug Rabson 
22733f12199SDoug Rabson 	mg = &last_error_context;
22833f12199SDoug Rabson 
22933f12199SDoug Rabson 	gss_release_buffer(&minor_status, &mg->maj_error);
23033f12199SDoug Rabson 	gss_release_buffer(&minor_status, &mg->min_error);
23133f12199SDoug Rabson 
23233f12199SDoug Rabson 	mg->mech = &m->gm_mech_oid;
23333f12199SDoug Rabson 	mg->maj_stat = maj;
23433f12199SDoug Rabson 	mg->min_stat = min;
23533f12199SDoug Rabson 
23633f12199SDoug Rabson 	major_status = m->gm_display_status(&minor_status,
23733f12199SDoug Rabson 	    maj,
23833f12199SDoug Rabson 	    GSS_C_GSS_CODE,
23933f12199SDoug Rabson 	    &m->gm_mech_oid,
24033f12199SDoug Rabson 	    &message_content,
24133f12199SDoug Rabson 	    &mg->maj_error);
24233f12199SDoug Rabson 	if (GSS_ERROR(major_status)) {
24333f12199SDoug Rabson 		mg->maj_error.value = NULL;
24433f12199SDoug Rabson 		mg->maj_error.length = 0;
24533f12199SDoug Rabson 	}
24633f12199SDoug Rabson 	major_status = m->gm_display_status(&minor_status,
24733f12199SDoug Rabson 	    min,
24833f12199SDoug Rabson 	    GSS_C_MECH_CODE,
24933f12199SDoug Rabson 	    &m->gm_mech_oid,
25033f12199SDoug Rabson 	    &message_content,
25133f12199SDoug Rabson 	    &mg->min_error);
25233f12199SDoug Rabson 	if (GSS_ERROR(major_status)) {
25333f12199SDoug Rabson 		mg->min_error.value = NULL;
25433f12199SDoug Rabson 		mg->min_error.length = 0;
25533f12199SDoug Rabson 	}
25633f12199SDoug Rabson }
25733f12199SDoug Rabson 
258c0b9f4feSDoug Rabson OM_uint32
gss_display_status(OM_uint32 * minor_status,OM_uint32 status_value,int status_type,const gss_OID mech_type,OM_uint32 * message_content,gss_buffer_t status_string)259c0b9f4feSDoug Rabson gss_display_status(OM_uint32 *minor_status,
260c0b9f4feSDoug Rabson     OM_uint32 status_value,
261c0b9f4feSDoug Rabson     int status_type,
26233f12199SDoug Rabson     const gss_OID mech_type,
263c0b9f4feSDoug Rabson     OM_uint32 *message_content,
264c0b9f4feSDoug Rabson     gss_buffer_t status_string)
265c0b9f4feSDoug Rabson {
266c0b9f4feSDoug Rabson 	OM_uint32 major_status;
26741ec3746SDoug Rabson 
26833f12199SDoug Rabson 	_gss_buffer_zero(status_string);
26933f12199SDoug Rabson 	*message_content = 0;
27033f12199SDoug Rabson 
27133f12199SDoug Rabson 	major_status = _gss_mg_get_error(mech_type, status_type,
27233f12199SDoug Rabson 					 status_value, status_string);
27333f12199SDoug Rabson 	if (major_status == GSS_S_COMPLETE) {
27433f12199SDoug Rabson 
27533f12199SDoug Rabson 		*message_content = 0;
27633f12199SDoug Rabson 		*minor_status = 0;
27733f12199SDoug Rabson 		return (GSS_S_COMPLETE);
27841ec3746SDoug Rabson 	}
279c0b9f4feSDoug Rabson 
280c0b9f4feSDoug Rabson 	*minor_status = 0;
281c0b9f4feSDoug Rabson 	switch (status_type) {
28222a25490SDoug Rabson 	case GSS_C_GSS_CODE: {
28322a25490SDoug Rabson 		char *buf;
284c0b9f4feSDoug Rabson 
28522a25490SDoug Rabson 		if (GSS_SUPPLEMENTARY_INFO(status_value))
28622a25490SDoug Rabson 		    asprintf(&buf, "%s", supplementary_error(
28722a25490SDoug Rabson 		        GSS_SUPPLEMENTARY_INFO(status_value)));
28822a25490SDoug Rabson 		else
28922a25490SDoug Rabson 		    asprintf (&buf, "%s %s",
29022a25490SDoug Rabson 		        calling_error(GSS_CALLING_ERROR(status_value)),
29122a25490SDoug Rabson 			routine_error(GSS_ROUTINE_ERROR(status_value)));
29222a25490SDoug Rabson 
29333f12199SDoug Rabson 		if (buf == NULL)
29433f12199SDoug Rabson 			break;
29533f12199SDoug Rabson 
29622a25490SDoug Rabson 		status_string->length = strlen(buf);
29722a25490SDoug Rabson 		status_string->value  = buf;
29822a25490SDoug Rabson 
29933f12199SDoug Rabson 		return (GSS_S_COMPLETE);
30022a25490SDoug Rabson 	}
30122a25490SDoug Rabson 	case GSS_C_MECH_CODE: {
30233f12199SDoug Rabson 		OM_uint32 maj_junk, min_junk;
30333f12199SDoug Rabson 		gss_buffer_desc oid;
30433f12199SDoug Rabson 		char *buf;
30533f12199SDoug Rabson 
30633f12199SDoug Rabson 		maj_junk = gss_oid_to_str(&min_junk, mech_type, &oid);
30733f12199SDoug Rabson 		if (maj_junk != GSS_S_COMPLETE) {
30833f12199SDoug Rabson 			oid.value = strdup("unknown");
30933f12199SDoug Rabson 			oid.length = 7;
31033f12199SDoug Rabson 		}
31133f12199SDoug Rabson 
31233f12199SDoug Rabson 		asprintf (&buf, "unknown mech-code %lu for mech %.*s",
31333f12199SDoug Rabson 			  (unsigned long)status_value,
31433f12199SDoug Rabson 			  (int)oid.length, (char *)oid.value);
31533f12199SDoug Rabson 		if (maj_junk == GSS_S_COMPLETE)
31633f12199SDoug Rabson 			gss_release_buffer(&min_junk, &oid);
31733f12199SDoug Rabson 
31833f12199SDoug Rabson 		if (buf == NULL)
31933f12199SDoug Rabson 		    break;
32033f12199SDoug Rabson 
32133f12199SDoug Rabson 		status_string->length = strlen(buf);
32233f12199SDoug Rabson 		status_string->value  = buf;
32333f12199SDoug Rabson 
324c0b9f4feSDoug Rabson 		return (GSS_S_COMPLETE);
325c0b9f4feSDoug Rabson 	}
326c0b9f4feSDoug Rabson 	}
32733f12199SDoug Rabson 	_gss_buffer_zero(status_string);
328c0b9f4feSDoug Rabson 	return (GSS_S_BAD_STATUS);
329c0b9f4feSDoug Rabson }
330ae771770SStanislav Sedov 
331ae771770SStanislav Sedov void
_gss_mg_collect_error(gss_OID mech,OM_uint32 maj,OM_uint32 min)332ae771770SStanislav Sedov _gss_mg_collect_error(gss_OID mech, OM_uint32 maj, OM_uint32 min)
333ae771770SStanislav Sedov {
334ae771770SStanislav Sedov 	struct _gss_mech_switch *m;
335ae771770SStanislav Sedov 
336ae771770SStanislav Sedov 	m = _gss_find_mech_switch(mech);
337ae771770SStanislav Sedov 	if (m != NULL)
338ae771770SStanislav Sedov 		_gss_mg_error(m, maj, min);
339ae771770SStanislav Sedov }
340