]> git.sur5r.net Git - openldap/commitdiff
Use thread keys to plug slapi leak in connection_fake_init()
authorHoward Chu <hyc@openldap.org>
Thu, 25 Jan 2007 11:55:40 +0000 (11:55 +0000)
committerHoward Chu <hyc@openldap.org>
Thu, 25 Jan 2007 11:55:40 +0000 (11:55 +0000)
servers/slapd/connection.c
servers/slapd/init.c

index ce2c8f6e92c75fabdfa30c846a7fc29f4525c2ee..9aa78de007e8a9981d6514607e5bfc5fd80c1d12 100644 (file)
@@ -1946,6 +1946,38 @@ int connection_write(ber_socket_t s)
        return 0;
 }
 
+#ifdef LDAP_SLAPI
+typedef struct conn_fake_extblock {
+       void *eb_conn;
+       void *eb_op;
+} conn_fake_extblock;
+
+static void
+connection_fake_destroy(
+       void *key,
+       void *data )
+{
+       Connection conn = {0};
+       Operation op = {0};
+       Opheader ohdr = {0};
+
+       conn_fake_extblock *eb = data;
+       
+       op.o_hdr = &ohdr;
+       op.o_hdr->oh_extensions = eb->eb_op;
+       conn.c_extensions = eb->eb_conn;
+       op.o_conn = &conn;
+       conn.c_connid = -1;
+       op.o_connid = -1;
+
+       Debug(LDAP_DEBUG_ANY, "connection_fake_destroy: %p\n", eb, 0, 0 );
+
+       ber_memfree_x( eb, NULL );
+       slapi_int_free_object_extensions( SLAPI_X_EXT_OPERATION, &op );
+       slapi_int_free_object_extensions( SLAPI_X_EXT_CONNECTION, &conn );
+}
+#endif
+
 void
 connection_fake_init(
        Connection *conn,
@@ -1974,12 +2006,24 @@ connection_fake_init(
        connection_init_log_prefix( op );
 
 #ifdef LDAP_SLAPI
-       /* FIXME: somebody needs to destroy these. Perhaps they should
-        * only be allocated on the slab.
-        */
        if ( slapi_plugins_used ) {
-               slapi_int_create_object_extensions( SLAPI_X_EXT_CONNECTION, conn );
-               slapi_int_create_object_extensions( SLAPI_X_EXT_OPERATION, op );
+               conn_fake_extblock *eb = NULL;
+
+               /* Use thread keys to make sure these eventually get cleaned up */
+               if ( ldap_pvt_thread_pool_getkey( ctx, connection_fake_init, &eb,
+                       NULL )) {
+                       eb = ch_malloc( sizeof( *eb ));
+                       Debug(LDAP_DEBUG_ANY, "connection_fake_init: ctx %p, %p\n", ctx, eb, 0 );
+                       slapi_int_create_object_extensions( SLAPI_X_EXT_CONNECTION, conn );
+                       slapi_int_create_object_extensions( SLAPI_X_EXT_OPERATION, op );
+                       eb->eb_conn = conn->c_extensions;
+                       eb->eb_op = op->o_hdr->oh_extensions;
+                       ldap_pvt_thread_pool_setkey( ctx, connection_fake_init, eb,
+                               connection_fake_destroy );
+               } else {
+                       conn->c_extensions = eb->eb_conn;
+                       op->o_hdr->oh_extensions = eb->eb_op;
+               }
        }
 #endif /* LDAP_SLAPI */
 
index 0e392e2189d88a67233046cf1eac9bcdc442b0f2..d504a79228e144e1fa99d4ce46d6970864696f4b 100644 (file)
@@ -271,6 +271,9 @@ int slap_destroy(void)
                ber_bvarray_free( default_referral );
        }
 
+       /* clear out any thread-keys for the main thread */
+       ldap_pvt_thread_pool_context_reset( ldap_pvt_thread_pool_context());
+
        rc = backend_destroy();
 
        slap_sasl_destroy();