116 lines
3.2 KiB
Diff
116 lines
3.2 KiB
Diff
From e6d03452223c2404b9cfd04855ac8fca556e409d Mon Sep 17 00:00:00 2001
|
|
From: =?UTF-8?q?Christian=20G=C3=B6ttsche?= <cgzones@googlemail.com>
|
|
Date: Mon, 11 Nov 2024 15:16:32 +0100
|
|
Subject: [PATCH] libsemanage: free resources on failed connect attempt
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
In case connecting to the semanage database fails, free all already
|
|
allocated resources.
|
|
|
|
Signed-off-by: Christian Göttsche <cgzones@googlemail.com>
|
|
Acked-by: James Carter <jwcart2@gmail.com>
|
|
|
|
Conflict:NA
|
|
Reference:https://github.com/SELinuxProject/selinux/commit/e6d03452223c2404b9cfd04855ac8fca556e409d
|
|
|
|
---
|
|
src/database_activedb.c | 3 +++
|
|
src/database_file.c | 3 +++
|
|
src/database_join.c | 3 +++
|
|
src/database_policydb.c | 2 +-
|
|
src/direct_api.c | 1 +
|
|
src/handle.c | 5 ++---
|
|
6 files changed, 13 insertions(+), 4 deletions(-)
|
|
|
|
diff --git a/src/database_activedb.c b/src/database_activedb.c
|
|
index fa6b6105..e0369963 100644
|
|
--- a/src/database_activedb.c
|
|
+++ b/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/src/database_file.c b/src/database_file.c
|
|
index a7773fb5..09b32f8f 100644
|
|
--- a/src/database_file.c
|
|
+++ b/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/src/database_join.c b/src/database_join.c
|
|
index 2a2008e8..bf260952 100644
|
|
--- a/src/database_join.c
|
|
+++ b/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/src/database_policydb.c b/src/database_policydb.c
|
|
index 95418365..54b82958 100644
|
|
--- a/src/database_policydb.c
|
|
+++ b/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/src/direct_api.c b/src/direct_api.c
|
|
index 8f8dc0da..ed4343dc 100644
|
|
--- a/src/direct_api.c
|
|
+++ b/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/src/handle.c b/src/handle.c
|
|
index f048f6d7..9bb84546 100644
|
|
--- a/src/handle.c
|
|
+++ b/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.33.0
|
|
|