From f3d3f60e3dd051f2a4fcb0fe4deb000e988f3eab Mon Sep 17 00:00:00 2001 From: Hallvard Furuseth Date: Mon, 8 Dec 2014 09:56:36 +0100 Subject: [PATCH] Try to avoid an invalid datafile after failed init --- libraries/liblmdb/mdb.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/libraries/liblmdb/mdb.c b/libraries/liblmdb/mdb.c index d5387bc..da09f8d 100644 --- a/libraries/liblmdb/mdb.c +++ b/libraries/liblmdb/mdb.c @@ -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;