All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/1] semanage_select_store fun
@ 2007-11-20 22:09 Joshua Brindle
  2007-11-21 13:29 ` Stephen Smalley
  0 siblings, 1 reply; 6+ messages in thread
From: Joshua Brindle @ 2007-11-20 22:09 UTC (permalink / raw)
  To: SE Linux; +Cc: Stephen Smalley, Karl MacMillan, James Athey

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@tycho.nsa.gov with
the words "unsubscribe selinux" without quotes as the message.

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2007-12-05 17:50 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-11-20 22:09 [PATCH 1/1] semanage_select_store fun Joshua Brindle
2007-11-21 13:29 ` Stephen Smalley
2007-11-21 16:44   ` Joshua Brindle
2007-11-21 17:00     ` Stephen Smalley
2007-11-21 17:44       ` Stephen Smalley
2007-12-05 17:50         ` Stephen Smalley

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.