#include <exception>
#include <new>
+/* lazy initialisation */
+static GSSEAP_THREAD_ONCE gssEapAttrProvidersInitOnce = GSSEAP_ONCE_INITIALIZER;
+static OM_uint32 gssEapAttrProvidersInitStatus = GSS_S_UNAVAILABLE;
+
+static void
+gssEapAttrProvidersInitInternal(void)
+{
+ OM_uint32 major, minor;
+
+ assert(gssEapAttrProvidersInitStatus == GSS_S_UNAVAILABLE);
+
+ major = gssEapRadiusAttrProviderInit(&minor);
+ if (major == GSS_S_COMPLETE)
+ major = gssEapSamlAttrProvidersInit(&minor);
+ if (major == GSS_S_COMPLETE)
+ major = gssEapLocalAttrProviderInit(&minor);
+
+#ifdef GSSEAP_DEBUG
+ assert(major == GSS_S_COMPLETE);
+#endif
+
+ gssEapAttrProvidersInitStatus = major;
+}
+
+static OM_uint32
+gssEapAttrProvidersInit(void)
+{
+ GSSEAP_ONCE(&gssEapAttrProvidersInitOnce, gssEapAttrProvidersInitInternal);
+ return gssEapAttrProvidersInitStatus;
+}
+
+OM_uint32
+gssEapAttrProvidersFinalize(OM_uint32 *minor)
+{
+ OM_uint32 major = GSS_S_COMPLETE;
+
+ if (gssEapAttrProvidersInitStatus == GSS_S_COMPLETE) {
+ major = gssEapLocalAttrProviderFinalize(minor);
+ if (major == GSS_S_COMPLETE)
+ major = gssEapSamlAttrProvidersFinalize(minor);
+ if (major == GSS_S_COMPLETE)
+ major = gssEapRadiusAttrProviderFinalize(minor);
+
+ gssEapAttrProvidersInitStatus = GSS_S_UNAVAILABLE;
+ }
+
+ return major;
+}
+
static gss_eap_attr_create_provider gssEapAttrFactories[ATTR_TYPE_MAX + 1];
static gss_buffer_desc gssEapAttrPrefixes[ATTR_TYPE_MAX + 1];
if (name->attrCtx == NULL)
return GSS_S_UNAVAILABLE;
+ if (GSS_ERROR(gssEapAttrProvidersInit()))
+ return GSS_S_UNAVAILABLE;
+
try {
if (!name->attrCtx->getAttributeTypes(attrs))
return GSS_S_UNAVAILABLE;
if (name->attrCtx == NULL)
return GSS_S_UNAVAILABLE;
+ if (GSS_ERROR(gssEapAttrProvidersInit()))
+ return GSS_S_UNAVAILABLE;
+
try {
if (!name->attrCtx->getAttribute(attr, authenticated, complete,
value, display_value, more))
if (name->attrCtx == NULL)
return GSS_S_UNAVAILABLE;
+ if (GSS_ERROR(gssEapAttrProvidersInit()))
+ return GSS_S_UNAVAILABLE;
+
try {
name->attrCtx->deleteAttribute(attr);
} catch (std::exception &ex) {
if (name->attrCtx == NULL)
return GSS_S_UNAVAILABLE;
+ if (GSS_ERROR(gssEapAttrProvidersInit()))
+ return GSS_S_UNAVAILABLE;
+
try {
name->attrCtx->setAttribute(complete, attr, value);
} catch (std::exception &ex) {
return GSS_S_COMPLETE;
}
+ if (GSS_ERROR(gssEapAttrProvidersInit()))
+ return GSS_S_UNAVAILABLE;
+
try {
name->attrCtx->exportToBuffer(buffer);
} catch (std::exception &e) {
assert(name->attrCtx == NULL);
+ if (GSS_ERROR(gssEapAttrProvidersInit()))
+ return GSS_S_UNAVAILABLE;
+
if (buffer->length != 0) {
try {
ctx = new gss_eap_attr_ctx();
assert(out->attrCtx == NULL);
+ if (GSS_ERROR(gssEapAttrProvidersInit()))
+ return GSS_S_UNAVAILABLE;
+
try {
if (in->attrCtx != NULL) {
ctx = new gss_eap_attr_ctx();
if (name->attrCtx == NULL)
return GSS_S_UNAVAILABLE;
+ if (GSS_ERROR(gssEapAttrProvidersInit()))
+ return GSS_S_UNAVAILABLE;
+
try {
*output = name->attrCtx->mapToAny(authenticated, type_id);
} catch (std::exception &e) {
if (name->attrCtx == NULL)
return GSS_S_UNAVAILABLE;
+ if (GSS_ERROR(gssEapAttrProvidersInit()))
+ return GSS_S_UNAVAILABLE;
+
try {
if (*input != NULL)
name->attrCtx->releaseAnyNameMapping(type_id, *input);
assert(gssCtx != GSS_C_NO_CONTEXT);
+ if (GSS_ERROR(gssEapAttrProvidersInit()))
+ return NULL;
+
ctx = new gss_eap_attr_ctx();
if (!ctx->initFromGssContext(gssCred, gssCtx)) {
delete ctx;