]> git.sur5r.net Git - openldap/blobdiff - libraries/liblmdb/mdb.c
Tweak ITS#7615 fix: Obey strict-aliasing rules.
[openldap] / libraries / liblmdb / mdb.c
index 64601735919e569ade2b5ff09e85f9a6f00be3d7..34b726cd620ad073c09f6fa358becd6b67c23961 100644 (file)
@@ -3607,10 +3607,9 @@ static void
 mdb_hash_enc(MDB_val *val, char *encbuf)
 {
        mdb_hash_t h = mdb_hash_val(val, MDB_HASH_INIT);
-       unsigned long *l = (unsigned long *)&h;
 
-       mdb_pack85(l[0], encbuf);
-       mdb_pack85(l[1], encbuf+5);
+       mdb_pack85(h, encbuf);
+       mdb_pack85(h>>32, encbuf+5);
        encbuf[10] = '\0';
 }
 #endif
@@ -3898,9 +3897,12 @@ mdb_env_open(MDB_env *env, const char *path, unsigned int flags, mdb_mode_t mode
                goto leave;
        }
 
-       rc = mdb_env_setup_locks(env, lpath, mode, &excl);
-       if (rc)
-               goto leave;
+       /* For RDONLY, get lockfile after we know datafile exists */
+       if (!F_ISSET(flags, MDB_RDONLY)) {
+               rc = mdb_env_setup_locks(env, lpath, mode, &excl);
+               if (rc)
+                       goto leave;
+       }
 
 #ifdef _WIN32
        if (F_ISSET(flags, MDB_RDONLY)) {
@@ -3926,6 +3928,12 @@ mdb_env_open(MDB_env *env, const char *path, unsigned int flags, mdb_mode_t mode
                goto leave;
        }
 
+       if (F_ISSET(flags, MDB_RDONLY)) {
+               rc = mdb_env_setup_locks(env, lpath, mode, &excl);
+               if (rc)
+                       goto leave;
+       }
+
        if ((rc = mdb_env_open2(env)) == MDB_SUCCESS) {
                if (flags & (MDB_RDONLY|MDB_WRITEMAP)) {
                        env->me_mfd = env->me_fd;
@@ -3934,10 +3942,12 @@ mdb_env_open(MDB_env *env, const char *path, unsigned int flags, mdb_mode_t mode
                         * MDB_NOSYNC/MDB_NOMETASYNC, in case these get reset.
                         */
 #ifdef _WIN32
+                       len = OPEN_EXISTING;
                        env->me_mfd = CreateFile(dpath, oflags,
                                FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, len,
                                mode | FILE_FLAG_WRITE_THROUGH, NULL);
 #else
+                       oflags &= ~O_CREAT;
                        env->me_mfd = open(dpath, oflags | MDB_DSYNC, mode);
 #endif
                        if (env->me_mfd == INVALID_HANDLE_VALUE) {