Use C++ destructors not finalizers
authorSam Hartman <hartmans@debian.org>
Wed, 22 Oct 2014 18:20:37 +0000 (14:20 -0400)
committerSam Hartman <hartmans@debian.org>
Wed, 22 Oct 2014 18:25:27 +0000 (14:25 -0400)
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)

mech_eap/eap_mech.c
mech_eap/util_attr.cpp
mech_eap/util_attr.h

index 96e00c2..760d189 100644 (file)
@@ -196,11 +196,6 @@ gssEapInitiatorInit(OM_uint32 *minor)
 void
 gssEapFinalize(void)
 {
-#ifdef GSSEAP_ENABLE_ACCEPTOR
-    OM_uint32 minor;
-
-    gssEapAttrProvidersFinalize(&minor);
-#endif
     eap_peer_unregister_methods();
 }
 
index d1c0075..6058f36 100644 (file)
@@ -90,24 +90,29 @@ gssEapAttrProvidersInit(OM_uint32 *minor)
     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) {
 #ifdef HAVE_SHIBRESOLVER
-        gssEapLocalAttrProviderFinalize(minor);
+                   gssEapLocalAttrProviderFinalize(&minor);
 #endif
 #ifdef HAVE_OPENSAML
-        gssEapSamlAttrProvidersFinalize(minor);
+                   gssEapSamlAttrProvidersFinalize(&minor);
 #endif
-        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];
 
 /*
index 2af0850..28067a9 100644 (file)
@@ -379,9 +379,6 @@ OM_uint32
 gssEapReleaseAttrContext(OM_uint32 *minor,
                          gss_name_t name);
 
-OM_uint32
-gssEapAttrProvidersFinalize(OM_uint32 *minor);
-
 #ifdef __cplusplus
 }
 #endif