]> git.sur5r.net Git - openldap/commitdiff
fix one-time leak
authorPierangelo Masarati <ando@openldap.org>
Thu, 14 Sep 2006 22:50:07 +0000 (22:50 +0000)
committerPierangelo Masarati <ando@openldap.org>
Thu, 14 Sep 2006 22:50:07 +0000 (22:50 +0000)
servers/slapd/overlays/translucent.c

index 5c8fd34788be08313346d29b44147781e75f6181..bc560aba0775768ff95834e017ae8bd8a38a6ed5 100644 (file)
@@ -741,15 +741,17 @@ static int translucent_db_open(BackendDB *be) {
 **
 */
 
-static int translucent_db_close(BackendDB *be) {
+static int
+translucent_db_close( BackendDB *be )
+{
        slap_overinst *on = (slap_overinst *) be->bd_info;
        translucent_info *ov = on->on_bi.bi_private;
        int rc = 0;
 
        Debug(LDAP_DEBUG_TRACE, "==> translucent_db_close\n", 0, 0, 0);
 
-       if ( ov ) {
-               rc = (ov->db.bd_info && ov->db.bd_info->bi_db_close) ? ov->db.bd_info->bi_db_close(&ov->db) : 0;
+       if ( ov && ov->db.bd_info && ov->db.bd_info->bi_db_close ) {
+               rc = ov->db.bd_info->bi_db_close(&ov->db);
        }
 
        return(rc);
@@ -761,7 +763,9 @@ static int translucent_db_close(BackendDB *be) {
 **
 */
 
-static int translucent_db_destroy(BackendDB *be) {
+static int
+translucent_db_destroy( BackendDB *be )
+{
        slap_overinst *on = (slap_overinst *) be->bd_info;
        translucent_info *ov = on->on_bi.bi_private;
        int rc = 0;
@@ -769,7 +773,18 @@ static int translucent_db_destroy(BackendDB *be) {
        Debug(LDAP_DEBUG_TRACE, "==> translucent_db_close\n", 0, 0, 0);
 
        if ( ov ) {
-               rc = (ov->db.bd_info && ov->db.bd_info->bi_db_destroy) ? ov->db.bd_info->bi_db_destroy(&ov->db) : 0;
+               /* cleanup stuff inherited from the original database... */
+               ov->db.be_suffix = NULL;
+               ov->db.be_nsuffix = NULL;
+               BER_BVZERO( &ov->db.be_rootdn );
+               BER_BVZERO( &ov->db.be_rootndn );
+               BER_BVZERO( &ov->db.be_rootpw );
+               /* FIXME: there might be more... */
+
+               if ( ov->db.be_private != NULL ) {
+                       backend_destroy_one( &ov->db, 0 );
+               }
+
                ch_free(ov);
                on->on_bi.bi_private = NULL;
        }