Rather than calling the attribute finalizer from a library level finalizer, do so from a C++ destructor.
Hopefully this addresses a segfault on process termination (LP: #1201939)
void
gssEapFinalize(void)
{
void
gssEapFinalize(void)
{
-#ifdef GSSEAP_ENABLE_ACCEPTOR
- OM_uint32 minor;
-
- gssEapAttrProvidersFinalize(&minor);
-#endif
eap_peer_unregister_methods();
}
eap_peer_unregister_methods();
}
return gssEapAttrProvidersInitStatus;
}
return gssEapAttrProvidersInitStatus;
}
-OM_uint32
-gssEapAttrProvidersFinalize(OM_uint32 *minor)
-{
- if (gssEapAttrProvidersInitStatus == GSS_S_COMPLETE) {
+namespace {
+ class finalize_class {
+ public:
+ ~finalize_class()
+ {
+ OM_uint32 minor = 0;
+ if (gssEapAttrProvidersInitStatus == GSS_S_COMPLETE) {
- gssEapLocalAttrProviderFinalize(minor);
+ gssEapLocalAttrProviderFinalize(&minor);
#endif
#ifdef HAVE_OPENSAML
#endif
#ifdef HAVE_OPENSAML
- gssEapSamlAttrProvidersFinalize(minor);
+ gssEapSamlAttrProvidersFinalize(&minor);
- gssEapRadiusAttrProviderFinalize(minor);
+ gssEapRadiusAttrProviderFinalize(&minor);
- gssEapAttrProvidersInitStatus = GSS_S_UNAVAILABLE;
- }
-
- return GSS_S_COMPLETE;
+ gssEapAttrProvidersInitStatus = GSS_S_UNAVAILABLE;
+ }
+ }
+ } finalizer;
static gss_eap_attr_create_provider gssEapAttrFactories[ATTR_TYPE_MAX + 1];
/*
static gss_eap_attr_create_provider gssEapAttrFactories[ATTR_TYPE_MAX + 1];
/*
gssEapReleaseAttrContext(OM_uint32 *minor,
gss_name_t name);
gssEapReleaseAttrContext(OM_uint32 *minor,
gss_name_t name);
-OM_uint32
-gssEapAttrProvidersFinalize(OM_uint32 *minor);
-
#ifdef __cplusplus
}
#endif
#ifdef __cplusplus
}
#endif