diff --git a/libraries/libldbm/ldbm.c b/libraries/libldbm/ldbm.c
index faa076ba18b9cf1c8a8ea554610ca7dbbed232c9..baaa1c7922947898822e3c3d75ecf18b641fbeb5 100644
--- a/libraries/libldbm/ldbm.c
+++ b/libraries/libldbm/ldbm.c
@@ -275,6 +275,8 @@ ldbm_open( char *name, int rw, int mode, int dbcachesize )
 	err = db_create( &ret, ldbm_Env, 0 );
 	if ( err != 0 ) {
 		(void)ret->close(ret, 0);
+		LDBM_UNLOCK;
+
 		return NULL;
 	}
 
@@ -283,12 +285,16 @@ ldbm_open( char *name, int rw, int mode, int dbcachesize )
 
 	err = ret->open( ret, name, NULL, DB_TYPE, rw, mode);
 
-	LDBM_UNLOCK;
-
 	if ( err != 0 ) {
+		int tmp = errno;
 		(void)ret->close(ret, 0);
+		errno = tmp;
+
+		LDBM_UNLOCK;
 		return NULL;
 	}
+
+	LDBM_UNLOCK;
  
 #elif DB_VERSION_MAJOR >= 2
 	DB_INFO dbinfo;
@@ -336,7 +342,7 @@ ldbm_open( char *name, int rw, int mode, int dbcachesize )
 	LDBM_UNLOCK;
 #endif
 
-	return( ret );
+	return ret;
 }
 
 void