]> git.sur5r.net Git - openldap/commitdiff
Try to avoid an invalid datafile after failed init
authorHallvard Furuseth <hallvard@openldap.org>
Mon, 8 Dec 2014 08:56:36 +0000 (09:56 +0100)
committerHallvard Furuseth <hallvard@openldap.org>
Sun, 25 Oct 2015 09:55:21 +0000 (10:55 +0100)
libraries/liblmdb/mdb.c

index d5387bc3bcf7e862d6a1516f4bbe746293c86564..da09f8dbfe7264d657e7c576bb45f6acb3d75d7b 100644 (file)
@@ -4008,6 +4008,20 @@ mdb_env_open2(MDB_env *env)
        }
        meta.mm_mapsize = env->me_mapsize;
 
+       if (newenv && !(flags & MDB_FIXEDMAP)) {
+               /* mdb_env_map() may grow the datafile.  Write the metapages
+                * first, so the file will be valid if initialization fails.
+                * Except with FIXEDMAP, since we do not yet know mm_address.
+                * We could fill in mm_address later, but then a different
+                * program might end up doing that - one with a memory layout
+                * and map address which does not suit the main program.
+                */
+               rc = mdb_env_init_meta(env, &meta);
+               if (rc)
+                       return rc;
+               newenv = 0;
+       }
+
        rc = mdb_env_map(env, (flags & MDB_FIXEDMAP) ? meta.mm_address : NULL);
        if (rc)
                return rc;