ITS#7377 Catch MDB failure updating root pointers.
authorHallvard Furuseth <hallvard@openldap.org>
Sat, 16 Feb 2013 18:08:54 +0000 (19:08 +0100)
committerHallvard Furuseth <hallvard@openldap.org>
Sat, 16 Feb 2013 18:08:54 +0000 (19:08 +0100)
"cannot fail" was wrong, it fails at least when exceeding mapsize.

libraries/liblmdb/mdb.c

index 715d1c8..083b25b 100644 (file)
@@ -2124,9 +2124,7 @@ mdb_txn_commit(MDB_txn *txn)
        DPRINTF("committing txn %zu %p on mdbenv %p, root page %zu",
            txn->mt_txnid, (void *)txn, (void *)env, txn->mt_dbs[MAIN_DBI].md_root);
 
-       /* Update DB root pointers. Their pages have already been
-        * touched so this is all in-place and cannot fail.
-        */
+       /* Update DB root pointers */
        if (txn->mt_numdbs > 2) {
                MDB_dbi i;
                MDB_val data;
@@ -2136,7 +2134,9 @@ mdb_txn_commit(MDB_txn *txn)
                for (i = 2; i < txn->mt_numdbs; i++) {
                        if (txn->mt_dbflags[i] & DB_DIRTY) {
                                data.mv_data = &txn->mt_dbs[i];
-                               mdb_cursor_put(&mc, &txn->mt_dbxs[i].md_name, &data, 0);
+                               rc = mdb_cursor_put(&mc, &txn->mt_dbxs[i].md_name, &data, 0);
+                               if (rc)
+                                       goto fail;
                        }
                }
        }