[PATCH 1/1] semanage_select_store fun

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

 



So, I got a report here that python scripts that call semanage_select_store will get a double free error when calling semanage_handle_destroy because the swig wrapper free's the buffer passed to semanage_select_store. I haven't seen this with semanage but the bug does appear legitimate to me, we should have never been assuming control of the buffer passed to semanage_select_store (especially without documenting it).

This is fun because semanage_select_store was originally a void but clearly this needs to strdup() instead of just setting the pointer. This patch can be applied trunk as it changes the API but the bug would still exist in stable (and the person who reported this will unfortunately have to patch it in their release of the stable repo).

---

libsemanage/include/semanage/handle.h |    3 ++-
libsemanage/src/handle.c              |   13 ++++++++++---
policycoreutils/semanage/seobject.py  |    4 +++-
policycoreutils/semodule/semodule.c   |    3 ++-
4 files changed, 17 insertions(+), 6 deletions(-)

---

Index: libsemanage/include/semanage/handle.h
===================================================================
--- libsemanage/include/semanage/handle.h	(revision 2677)
+++ libsemanage/include/semanage/handle.h	(working copy)
@@ -48,8 +48,9 @@
/* This function allows you to specify the store to  connect to.
* It must be called after semanage_handle_create but before * semanage_connect. The argument should be the full path to the store.
+ * path is duplicated and should be freed by the caller.
 */
-void semanage_select_store(semanage_handle_t * handle, char *path,
+int semanage_select_store(semanage_handle_t * handle, char *path,
			   enum semanage_connect_type storetype);

/* Just reload the policy */
Index: libsemanage/src/handle.c
===================================================================
--- libsemanage/src/handle.c	(revision 2677)
+++ libsemanage/src/handle.c	(working copy)
@@ -28,6 +28,7 @@
#include <stdlib.h>
#include <stdio.h>
#include <sys/time.h>
+#include <string.h>

#include "direct_api.h"
#include "handle.h"
@@ -123,7 +124,7 @@
	return sh->is_connected;
}

-void semanage_select_store(semanage_handle_t * sh, char *storename,
+int semanage_select_store(semanage_handle_t * sh, char *storename,
			   enum semanage_connect_type storetype)
{

@@ -131,10 +132,16 @@

/* This just sets the storename to what the user requests, no verification of existance will be done until connect */
-	sh->conf->store_path = storename;
+	
+	/* sh->conf->store_path could already exist if it was read from the
+ 	 * config file, free first */
+	free(sh->conf->store_path);
+	sh->conf->store_path = strdup(storename);
+	if (!sh->conf->store_path)
+		return -1;
	sh->conf->store_type = storetype;

-	return;
+	return 0;
}

int semanage_is_managed(semanage_handle_t * sh)
Index: policycoreutils/semanage/seobject.py
===================================================================
--- policycoreutils/semanage/seobject.py	(revision 2677)
+++ policycoreutils/semanage/seobject.py	(working copy)
@@ -219,7 +219,9 @@
		       raise ValueError(_("Could not create semanage handle"))
		
                if store != "":
-                       semanage_select_store(self.sh, store, SEMANAGE_CON_DIRECT);
+			rc = semanage_select_store(self.sh, store, SEMANAGE_CON_DIRECT);
+			if rc:
+				raise ValueError(_("Could not set store."))

		self.semanaged = semanage_is_managed(self.sh)

Index: policycoreutils/semodule/semodule.c
===================================================================
--- policycoreutils/semodule/semodule.c	(revision 2677)
+++ policycoreutils/semodule/semodule.c	(working copy)
@@ -293,7 +293,8 @@
		 * this will always set a direct connection now, an additional
* option will need to be used later to specify a policy server * location */
-		semanage_select_store(sh, store, SEMANAGE_CON_DIRECT);
+		if (semanage_select_store(sh, store, SEMANAGE_CON_DIRECT))
+			goto cleanup;
	}

	/* if installing base module create store if necessary, for bootstrapping */




--
This message was distributed to subscribers of the selinux mailing list.
If you no longer wish to subscribe, send mail to majordomo@xxxxxxxxxxxxx with
the words "unsubscribe selinux" without quotes as the message.

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

  Powered by Linux