mdb_dbi_open(): Catch strdup failure

rawpart
Hallvard Furuseth 9 years ago
parent 8b95e7d13e
commit 791badd096
  1. 21
      libraries/liblmdb/mdb.c

@ -9650,6 +9650,7 @@ int mdb_dbi_open(MDB_txn *txn, const char *name, unsigned int flags, MDB_dbi *db
MDB_db dummy; MDB_db dummy;
int rc, dbflag, exact; int rc, dbflag, exact;
unsigned int unused = 0, seq; unsigned int unused = 0, seq;
char *namedup;
size_t len; size_t len;
if (flags & ~VALID_FLAGS) if (flags & ~VALID_FLAGS)
@ -9711,8 +9712,16 @@ int mdb_dbi_open(MDB_txn *txn, const char *name, unsigned int flags, MDB_dbi *db
MDB_node *node = NODEPTR(mc.mc_pg[mc.mc_top], mc.mc_ki[mc.mc_top]); MDB_node *node = NODEPTR(mc.mc_pg[mc.mc_top], mc.mc_ki[mc.mc_top]);
if ((node->mn_flags & (F_DUPDATA|F_SUBDATA)) != F_SUBDATA) if ((node->mn_flags & (F_DUPDATA|F_SUBDATA)) != F_SUBDATA)
return MDB_INCOMPATIBLE; return MDB_INCOMPATIBLE;
} else if (rc == MDB_NOTFOUND && (flags & MDB_CREATE)) { } else if (! (rc == MDB_NOTFOUND && (flags & MDB_CREATE))) {
/* Create if requested */ return rc;
}
/* Done here so we cannot fail after creating a new DB */
if ((namedup = strdup(name)) == NULL)
return ENOMEM;
if (rc) {
/* MDB_NOTFOUND and MDB_CREATE: Create new DB */
data.mv_size = sizeof(MDB_db); data.mv_size = sizeof(MDB_db);
data.mv_data = &dummy; data.mv_data = &dummy;
memset(&dummy, 0, sizeof(dummy)); memset(&dummy, 0, sizeof(dummy));
@ -9722,10 +9731,12 @@ int mdb_dbi_open(MDB_txn *txn, const char *name, unsigned int flags, MDB_dbi *db
dbflag |= DB_DIRTY; dbflag |= DB_DIRTY;
} }
/* OK, got info, add to table */ if (rc) {
if (rc == MDB_SUCCESS) { free(namedup);
} else {
/* Got info, register DBI in this txn */
unsigned int slot = unused ? unused : txn->mt_numdbs; unsigned int slot = unused ? unused : txn->mt_numdbs;
txn->mt_dbxs[slot].md_name.mv_data = strdup(name); txn->mt_dbxs[slot].md_name.mv_data = namedup;
txn->mt_dbxs[slot].md_name.mv_size = len; txn->mt_dbxs[slot].md_name.mv_size = len;
txn->mt_dbxs[slot].md_rel = NULL; txn->mt_dbxs[slot].md_rel = NULL;
txn->mt_dbflags[slot] = dbflag; txn->mt_dbflags[slot] = dbflag;

Loading…
Cancel
Save