(gss_display_status): use gss_oid_equal, handle supplementary errors

git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@11743 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
Love Hörnquist Åstrand
2003-03-16 17:45:36 +00:00
parent 228a66ec49
commit 161cad1b47
2 changed files with 78 additions and 18 deletions

View File

@@ -1,5 +1,5 @@
/*
* Copyright (c) 1998 - 2002 Kungliga Tekniska H<>gskolan
* Copyright (c) 1998 - 2003 Kungliga Tekniska H<>gskolan
* (Royal Institute of Technology, Stockholm, Sweden).
* All rights reserved.
*
@@ -93,6 +93,26 @@ routine_error(OM_uint32 v)
return msgs[v];
}
static char *
supplementary_error(OM_uint32 v)
{
static char *msgs[] = {
"normal completion",
"continuation call to routine required",
"duplicate per-message token detected",
"timed-out per-message token detected",
"reordered (early) per-message token detected",
"skipped predecessor token(s) detected"
};
v >>= GSS_C_SUPPLEMENTARY_OFFSET;
if (v >= sizeof(msgs)/sizeof(*msgs))
return "unknown routine error";
else
return msgs[v];
}
void
gssapi_krb5_set_error_string (void)
{
@@ -119,16 +139,23 @@ OM_uint32 gss_display_status
GSSAPI_KRB5_INIT ();
*minor_status = 0;
status_string->length = 0;
status_string->value = NULL;
if (mech_type != GSS_C_NO_OID &&
mech_type != GSS_KRB5_MECHANISM)
return GSS_S_BAD_MECH;
if (gss_oid_equal(mech_type, GSS_C_NO_OID) == 0 &&
gss_oid_equal(mech_type, GSS_KRB5_MECHANISM) == 0) {
*minor_status = 0;
return GSS_C_GSS_CODE;
}
if (status_type == GSS_C_GSS_CODE) {
asprintf (&buf, "%s %s",
calling_error(GSS_CALLING_ERROR(status_value)),
routine_error(GSS_ROUTINE_ERROR(status_value)));
if (GSS_SUPPLEMENTARY_INFO(status_value))
asprintf(&buf, "%s",
supplementary_error(GSS_SUPPLEMENTARY_INFO(status_value)));
else
asprintf (&buf, "%s %s",
calling_error(GSS_CALLING_ERROR(status_value)),
routine_error(GSS_ROUTINE_ERROR(status_value)));
} else if (status_type == GSS_C_MECH_CODE) {
buf = gssapi_krb5_get_error_string ();
if (buf == NULL) {
@@ -140,8 +167,10 @@ OM_uint32 gss_display_status
else
buf = strdup(tmp);
}
} else
} else {
*minor_status = EINVAL;
return GSS_S_BAD_STATUS;
}
if (buf == NULL) {
*minor_status = ENOMEM;
@@ -149,6 +178,7 @@ OM_uint32 gss_display_status
}
*message_context = 0;
*minor_status = 0;
status_string->length = strlen(buf);
status_string->value = buf;