[PATCH 13/47] libsemanage: free resources on failed connect attempt

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: Christian Göttsche <cgzones@xxxxxxxxxxxxxx>

In case connecting to the semanage database fails, free all already
allocated resources.

Signed-off-by: Christian Göttsche <cgzones@xxxxxxxxxxxxxx>
---
 libsemanage/src/database_activedb.c | 3 +++
 libsemanage/src/database_file.c     | 3 +++
 libsemanage/src/database_join.c     | 3 +++
 libsemanage/src/database_policydb.c | 2 +-
 libsemanage/src/direct_api.c        | 1 +
 libsemanage/src/handle.c            | 5 ++---
 6 files changed, 13 insertions(+), 4 deletions(-)

diff --git a/libsemanage/src/database_activedb.c b/libsemanage/src/database_activedb.c
index fa6b6105..e0369963 100644
--- a/libsemanage/src/database_activedb.c
+++ b/libsemanage/src/database_activedb.c
@@ -139,6 +139,9 @@ int dbase_activedb_init(semanage_handle_t * handle,
 void dbase_activedb_release(dbase_activedb_t * dbase)
 {
 
+	if (!dbase)
+		return;
+
 	dbase_llist_drop_cache(&dbase->llist);
 	free(dbase);
 }
diff --git a/libsemanage/src/database_file.c b/libsemanage/src/database_file.c
index 6fe2ddf3..716f54e7 100644
--- a/libsemanage/src/database_file.c
+++ b/libsemanage/src/database_file.c
@@ -191,6 +191,9 @@ int dbase_file_init(semanage_handle_t * handle,
 void dbase_file_release(dbase_file_t * dbase)
 {
 
+	if (!dbase)
+		return;
+
 	dbase_llist_drop_cache(&dbase->llist);
 	free(dbase);
 }
diff --git a/libsemanage/src/database_join.c b/libsemanage/src/database_join.c
index 2a2008e8..bf260952 100644
--- a/libsemanage/src/database_join.c
+++ b/libsemanage/src/database_join.c
@@ -271,6 +271,9 @@ int dbase_join_init(semanage_handle_t * handle,
 void dbase_join_release(dbase_join_t * dbase)
 {
 
+	if (!dbase)
+		return;
+
 	dbase_llist_drop_cache(&dbase->llist);
 	free(dbase);
 }
diff --git a/libsemanage/src/database_policydb.c b/libsemanage/src/database_policydb.c
index 19d90de5..6e922b5e 100644
--- a/libsemanage/src/database_policydb.c
+++ b/libsemanage/src/database_policydb.c
@@ -44,7 +44,7 @@ struct dbase_policydb {
 static void dbase_policydb_drop_cache(dbase_policydb_t * dbase)
 {
 
-	if (dbase->cache_serial >= 0) {
+	if (dbase && dbase->cache_serial >= 0) {
 		sepol_policydb_free(dbase->policydb);
 		dbase->cache_serial = -1;
 		dbase->modified = 0;
diff --git a/libsemanage/src/direct_api.c b/libsemanage/src/direct_api.c
index 3fa24331..83addbee 100644
--- a/libsemanage/src/direct_api.c
+++ b/libsemanage/src/direct_api.c
@@ -321,6 +321,7 @@ int semanage_direct_connect(semanage_handle_t * sh)
 
       err:
 	ERR(sh, "could not establish direct connection");
+	(void) semanage_direct_disconnect(sh);
 	return STATUS_ERR;
 }
 
diff --git a/libsemanage/src/handle.c b/libsemanage/src/handle.c
index f048f6d7..9bb84546 100644
--- a/libsemanage/src/handle.c
+++ b/libsemanage/src/handle.c
@@ -361,12 +361,11 @@ int semanage_access_check(semanage_handle_t * sh)
 
 int semanage_disconnect(semanage_handle_t * sh)
 {
-	assert(sh != NULL && sh->funcs != NULL
-	       && sh->funcs->disconnect != NULL);
+	assert(sh != NULL);
 	if (!sh->is_connected) {
 		return 0;
 	}
-	if (sh->funcs->disconnect(sh) < 0) {
+	if (sh->funcs && sh->funcs->disconnect(sh) < 0) {
 		return -1;
 	}
 	sh->is_in_transaction = 0;
-- 
2.45.2





[Index of Archives]     [Selinux Refpolicy]     [Linux SGX]     [Fedora Users]     [Fedora Desktop]     [Yosemite Photos]     [Yosemite Camping]     [Yosemite Campsites]     [KDE Users]     [Gnome Users]

  Powered by Linux