I'm not sure if this next one is an issue or just incorrect usage on my part. So take with a grain of salt.
After getting an EIO (deliberate out of storage space) from a mdb_txn_commit, the transaction would be mdb_txn_abort()ed. I then would close then env which would get a SIGABORT from a double-free on the env_close0 with env->txn0.
The docs say quite clearly, after txn_commit the txn must not be used again. It has already been freed so you cannot use it with txn_abort.