(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). * (Royal Institute of Technology, Stockholm, Sweden).
* All rights reserved. * All rights reserved.
* *
@@ -93,6 +93,26 @@ routine_error(OM_uint32 v)
return msgs[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 void
gssapi_krb5_set_error_string (void) gssapi_krb5_set_error_string (void)
{ {
@@ -119,16 +139,23 @@ OM_uint32 gss_display_status
GSSAPI_KRB5_INIT (); GSSAPI_KRB5_INIT ();
*minor_status = 0; status_string->length = 0;
status_string->value = NULL;
if (mech_type != GSS_C_NO_OID && if (gss_oid_equal(mech_type, GSS_C_NO_OID) == 0 &&
mech_type != GSS_KRB5_MECHANISM) gss_oid_equal(mech_type, GSS_KRB5_MECHANISM) == 0) {
return GSS_S_BAD_MECH; *minor_status = 0;
return GSS_C_GSS_CODE;
}
if (status_type == GSS_C_GSS_CODE) { if (status_type == GSS_C_GSS_CODE) {
asprintf (&buf, "%s %s", if (GSS_SUPPLEMENTARY_INFO(status_value))
calling_error(GSS_CALLING_ERROR(status_value)), asprintf(&buf, "%s",
routine_error(GSS_ROUTINE_ERROR(status_value))); 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) { } else if (status_type == GSS_C_MECH_CODE) {
buf = gssapi_krb5_get_error_string (); buf = gssapi_krb5_get_error_string ();
if (buf == NULL) { if (buf == NULL) {
@@ -140,8 +167,10 @@ OM_uint32 gss_display_status
else else
buf = strdup(tmp); buf = strdup(tmp);
} }
} else } else {
*minor_status = EINVAL;
return GSS_S_BAD_STATUS; return GSS_S_BAD_STATUS;
}
if (buf == NULL) { if (buf == NULL) {
*minor_status = ENOMEM; *minor_status = ENOMEM;
@@ -149,6 +178,7 @@ OM_uint32 gss_display_status
} }
*message_context = 0; *message_context = 0;
*minor_status = 0;
status_string->length = strlen(buf); status_string->length = strlen(buf);
status_string->value = buf; status_string->value = buf;

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). * (Royal Institute of Technology, Stockholm, Sweden).
* All rights reserved. * All rights reserved.
* *
@@ -93,6 +93,26 @@ routine_error(OM_uint32 v)
return msgs[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 void
gssapi_krb5_set_error_string (void) gssapi_krb5_set_error_string (void)
{ {
@@ -119,16 +139,23 @@ OM_uint32 gss_display_status
GSSAPI_KRB5_INIT (); GSSAPI_KRB5_INIT ();
*minor_status = 0; status_string->length = 0;
status_string->value = NULL;
if (mech_type != GSS_C_NO_OID && if (gss_oid_equal(mech_type, GSS_C_NO_OID) == 0 &&
mech_type != GSS_KRB5_MECHANISM) gss_oid_equal(mech_type, GSS_KRB5_MECHANISM) == 0) {
return GSS_S_BAD_MECH; *minor_status = 0;
return GSS_C_GSS_CODE;
}
if (status_type == GSS_C_GSS_CODE) { if (status_type == GSS_C_GSS_CODE) {
asprintf (&buf, "%s %s", if (GSS_SUPPLEMENTARY_INFO(status_value))
calling_error(GSS_CALLING_ERROR(status_value)), asprintf(&buf, "%s",
routine_error(GSS_ROUTINE_ERROR(status_value))); 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) { } else if (status_type == GSS_C_MECH_CODE) {
buf = gssapi_krb5_get_error_string (); buf = gssapi_krb5_get_error_string ();
if (buf == NULL) { if (buf == NULL) {
@@ -140,8 +167,10 @@ OM_uint32 gss_display_status
else else
buf = strdup(tmp); buf = strdup(tmp);
} }
} else } else {
*minor_status = EINVAL;
return GSS_S_BAD_STATUS; return GSS_S_BAD_STATUS;
}
if (buf == NULL) { if (buf == NULL) {
*minor_status = ENOMEM; *minor_status = ENOMEM;
@@ -149,6 +178,7 @@ OM_uint32 gss_display_status
} }
*message_context = 0; *message_context = 0;
*minor_status = 0;
status_string->length = strlen(buf); status_string->length = strlen(buf);
status_string->value = buf; status_string->value = buf;