}
static OM_uint32
-gssEapAttrProvidersInit(void)
+gssEapAttrProvidersInit(OM_uint32 *minor)
{
GSSEAP_ONCE(&gssEapAttrProvidersInitOnce, gssEapAttrProvidersInitInternal);
+
+ if (GSS_ERROR(gssEapAttrProvidersInitStatus))
+ *minor = GSSEAP_NO_ATTR_PROVIDERS;
+
return gssEapAttrProvidersInitStatus;
}
gss_OID *MN_mech,
gss_buffer_set_t *attrs)
{
- if (name->attrCtx == NULL)
+ if (name->attrCtx == NULL) {
+ *minor = GSSEAP_NO_ATTR_CONTEXT;
return GSS_S_UNAVAILABLE;
+ }
- if (GSS_ERROR(gssEapAttrProvidersInit()))
+ if (GSS_ERROR(gssEapAttrProvidersInit(minor))) {
return GSS_S_UNAVAILABLE;
+ }
try {
- if (!name->attrCtx->getAttributeTypes(attrs))
+ if (!name->attrCtx->getAttributeTypes(attrs)) {
+ *minor = GSSEAP_NO_ATTR_CONTEXT;
return GSS_S_UNAVAILABLE;
+ }
} catch (std::exception &e) {
return mapException(minor, e);
}
display_value->value = NULL;
}
- if (name->attrCtx == NULL)
+ if (name->attrCtx == NULL) {
+ *minor = GSSEAP_NO_ATTR_CONTEXT;
return GSS_S_UNAVAILABLE;
+ }
- if (GSS_ERROR(gssEapAttrProvidersInit()))
+ if (GSS_ERROR(gssEapAttrProvidersInit(minor))) {
return GSS_S_UNAVAILABLE;
+ }
try {
if (!name->attrCtx->getAttribute(attr, authenticated, complete,
- value, display_value, more))
+ value, display_value, more)) {
+ *minor = GSSEAP_NO_SUCH_ATTR;
+ gssEapSaveStatusInfo(*minor, "Unknown naming attribute %.*s",
+ (int)attr->length, (char *)attr->value);
return GSS_S_UNAVAILABLE;
+ }
} catch (std::exception &e) {
return mapException(minor, e);
}
gss_name_t name,
gss_buffer_t attr)
{
- if (name->attrCtx == NULL)
+ if (name->attrCtx == NULL) {
+ *minor = GSSEAP_NO_ATTR_CONTEXT;
return GSS_S_UNAVAILABLE;
+ }
- if (GSS_ERROR(gssEapAttrProvidersInit()))
+ if (GSS_ERROR(gssEapAttrProvidersInit(minor)))
return GSS_S_UNAVAILABLE;
try {
gss_buffer_t attr,
gss_buffer_t value)
{
- if (name->attrCtx == NULL)
+ if (name->attrCtx == NULL) {
+ *minor = GSSEAP_NO_ATTR_CONTEXT;
return GSS_S_UNAVAILABLE;
+ }
- if (GSS_ERROR(gssEapAttrProvidersInit()))
+ if (GSS_ERROR(gssEapAttrProvidersInit(minor)))
return GSS_S_UNAVAILABLE;
try {
return GSS_S_COMPLETE;
}
- if (GSS_ERROR(gssEapAttrProvidersInit()))
+ if (GSS_ERROR(gssEapAttrProvidersInit(minor)))
return GSS_S_UNAVAILABLE;
try {
assert(name->attrCtx == NULL);
- if (GSS_ERROR(gssEapAttrProvidersInit()))
+ if (GSS_ERROR(gssEapAttrProvidersInit(minor)))
return GSS_S_UNAVAILABLE;
if (buffer->length != 0) {
if (!ctx->initFromBuffer(buffer)) {
delete ctx;
+ *minor = GSSEAP_BAD_ATTR_TOKEN;
return GSS_S_DEFECTIVE_TOKEN;
}
name->attrCtx = ctx;
assert(out->attrCtx == NULL);
- if (GSS_ERROR(gssEapAttrProvidersInit()))
+ if (GSS_ERROR(gssEapAttrProvidersInit(minor)))
return GSS_S_UNAVAILABLE;
try {
ctx = new gss_eap_attr_ctx();
if (!ctx->initFromExistingContext(in->attrCtx)) {
delete ctx;
+ *minor = GSSEAP_ATTR_CONTEXT_FAILURE;
return GSS_S_FAILURE;
}
out->attrCtx = ctx;
gss_buffer_t type_id,
gss_any_t *output)
{
- if (name->attrCtx == NULL)
+ if (name->attrCtx == NULL) {
+ *minor = GSSEAP_NO_ATTR_CONTEXT;
return GSS_S_UNAVAILABLE;
+ }
- if (GSS_ERROR(gssEapAttrProvidersInit()))
+ if (GSS_ERROR(gssEapAttrProvidersInit(minor)))
return GSS_S_UNAVAILABLE;
try {
gss_buffer_t type_id,
gss_any_t *input)
{
- if (name->attrCtx == NULL)
+ if (name->attrCtx == NULL) {
+ *minor = GSSEAP_NO_ATTR_CONTEXT;
return GSS_S_UNAVAILABLE;
+ }
- if (GSS_ERROR(gssEapAttrProvidersInit()))
+ if (GSS_ERROR(gssEapAttrProvidersInit(minor)))
return GSS_S_UNAVAILABLE;
try {
gss_ctx_id_t gssCtx)
{
gss_eap_attr_ctx *ctx;
+ OM_uint32 tmpMinor;
assert(gssCtx != GSS_C_NO_CONTEXT);
- if (GSS_ERROR(gssEapAttrProvidersInit()))
+ if (GSS_ERROR(gssEapAttrProvidersInit(&tmpMinor)))
return NULL;
ctx = new gss_eap_attr_ctx();