Fix flag checks in mdb_open
authorHoward Chu <hyc@symas.com>
Tue, 23 Oct 2012 11:48:04 +0000 (04:48 -0700)
committerHoward Chu <hyc@symas.com>
Tue, 23 Oct 2012 11:48:04 +0000 (04:48 -0700)
libraries/libmdb/mdb.c

index 92362a3..091e8ec 100644 (file)
@@ -6707,6 +6707,9 @@ mdb_default_cmp(MDB_txn *txn, MDB_dbi dbi)
                 : ((f & MDB_REVERSEDUP) ? mdb_cmp_memnr : mdb_cmp_memn));
 }
 
+#define PERSISTENT_FLAGS       0xffff
+#define VALID_FLAGS    (MDB_REVERSEKEY|MDB_DUPSORT|MDB_INTEGERKEY|MDB_DUPFIXED|\
+       MDB_INTEGERDUP|MDB_REVERSEDUP|MDB_CREATE)
 int mdb_open(MDB_txn *txn, const char *name, unsigned int flags, MDB_dbi *dbi)
 {
        MDB_val key, data;
@@ -6720,13 +6723,17 @@ int mdb_open(MDB_txn *txn, const char *name, unsigned int flags, MDB_dbi *dbi)
                mdb_default_cmp(txn, FREE_DBI);
        }
 
+       if ((flags & VALID_FLAGS) != flags)
+               return EINVAL;
+
        /* main DB? */
        if (!name) {
                *dbi = MAIN_DBI;
-               if (flags & (MDB_DUPSORT|MDB_REVERSEKEY|MDB_INTEGERKEY)) {
+               if (flags & PERSISTENT_FLAGS) {
+                       uint16_t f2 = flags & PERSISTENT_FLAGS;
                        /* make sure flag changes get committed */
-                       if ((txn->mt_dbs[MAIN_DBI].md_flags | flags) != txn->mt_dbs[MAIN_DBI].md_flags) {
-                               txn->mt_dbs[MAIN_DBI].md_flags |= (flags & (MDB_DUPSORT|MDB_REVERSEKEY|MDB_INTEGERKEY));
+                       if ((txn->mt_dbs[MAIN_DBI].md_flags | f2) != txn->mt_dbs[MAIN_DBI].md_flags) {
+                               txn->mt_dbs[MAIN_DBI].md_flags |= f2;
                                txn->mt_flags |= MDB_TXN_DIRTY;
                        }
                }
@@ -6776,7 +6783,7 @@ int mdb_open(MDB_txn *txn, const char *name, unsigned int flags, MDB_dbi *dbi)
                data.mv_data = &dummy;
                memset(&dummy, 0, sizeof(dummy));
                dummy.md_root = P_INVALID;
-               dummy.md_flags = flags & 0xffff;
+               dummy.md_flags = flags & PERSISTENT_FLAGS;
                rc = mdb_cursor_put(&mc, &key, &data, F_SUBDATA);
                dbflag = DB_DIRTY;
        }