]> git.sur5r.net Git - openldap/commitdiff
Fix mdb_env_close(unopened MDB_env).
authorHallvard Furuseth <hallvard@openldap.org>
Sun, 5 May 2013 12:26:05 +0000 (14:26 +0200)
committerHallvard Furuseth <hallvard@openldap.org>
Sun, 5 May 2013 12:26:05 +0000 (14:26 +0200)
Do not try to scan me_dbxs in a closed/never-opened MDB_env.
Broken by 7d643d3acb94a6d7306330b550fce0e5755444a9
and 151c416b460b02cd96502a47189cda19ab651ada.

libraries/liblmdb/mdb.c

index 2cfd8b28e1547760170e0eb109fbd2f1fe5f8ae9..c8ef564d75b8897681539ee57e144fe2a686b379 100644 (file)
@@ -3548,7 +3548,7 @@ leave:
        return rc;
 }
 
-/** Destroy resources from mdb_env_open() and clear our readers */
+/** Destroy resources from mdb_env_open(), clear our readers & DBIs */
 static void
 mdb_env_close0(MDB_env *env, int excl)
 {
@@ -3557,6 +3557,10 @@ mdb_env_close0(MDB_env *env, int excl)
        if (!(env->me_flags & MDB_ENV_ACTIVE))
                return;
 
+       /* Doing this here since me_dbxs may not exist during mdb_env_close */
+       for (i = env->me_maxdbs; --i > MAIN_DBI; )
+               free(env->me_dbxs[i].md_name.mv_data);
+
        free(env->me_dbflags);
        free(env->me_dbxs);
        free(env->me_path);
@@ -3764,14 +3768,10 @@ void
 mdb_env_close(MDB_env *env)
 {
        MDB_page *dp;
-       int i;
 
        if (env == NULL)
                return;
 
-       for (i = env->me_maxdbs; --i > MAIN_DBI; )
-               free(env->me_dbxs[i].md_name.mv_data);
-
        VGMEMP_DESTROY(env);
        while ((dp = env->me_dpages) != NULL) {
                VGMEMP_DEFINED(&dp->mp_next, sizeof(dp->mp_next));