diff --git a/src/libpmemobj/tx.c b/src/libpmemobj/tx.c
index ec6aa4a49a923ca3c72decb55a784f9fa6d2870d..1f5b822fc2f321157a1218d55f0967fa8d0bba84 100644
--- a/src/libpmemobj/tx.c
+++ b/src/libpmemobj/tx.c
@@ -492,8 +492,8 @@ add_to_tx_and_lock(struct tx *tx, enum pobj_tx_param type, void *lock)
retval = pmemobj_mutex_lock(tx->pop,
txl->lock.mutex);
if (retval) {
- errno = retval;
ERR("!pmemobj_mutex_lock");
+ goto err;
}
break;
case TX_PARAM_RWLOCK:
@@ -501,8 +501,8 @@ add_to_tx_and_lock(struct tx *tx, enum pobj_tx_param type, void *lock)
retval = pmemobj_rwlock_wrlock(tx->pop,
txl->lock.rwlock);
if (retval) {
- errno = retval;
ERR("!pmemobj_rwlock_wrlock");
+ goto err;
}
break;
default:
@@ -511,8 +511,12 @@ add_to_tx_and_lock(struct tx *tx, enum pobj_tx_param type, void *lock)
break;
}
- if (retval == 0)
- SLIST_INSERT_HEAD(&tx->tx_locks, txl, tx_lock);
+ SLIST_INSERT_HEAD(&tx->tx_locks, txl, tx_lock);
+ return 0;
+
+err:
+ errno = retval;
+ Free(txl);
return retval;
}