All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] libsepol - cond_expr mapping and package num_sections bugs
@ 2006-01-27 20:55 Joshua Brindle
  2006-01-27 21:16 ` Stephen Smalley
  0 siblings, 1 reply; 5+ messages in thread
From: Joshua Brindle @ 2006-01-27 20:55 UTC (permalink / raw)
  To: SELinux, Stephen Smalley

[-- Attachment #1: Type: text/plain, Size: 681 bytes --]

This patch fixes a bug where a boolean expression node which was an
operation was trying to map the boolean value to the base policy during
linking and getting an index from the previous map ( 0 - 1). The
solution is to not map the boolean value if the expr_type is not COND_BOOL.

It also fixes a bug where a base module getting written after being read
(during linking) would end up with a num_sections of 4 since
num_sections was initialized during the read and then incremented during
write. The solution is to move the num_sections incrementing to the
functions where the sections are actually set, so that it is already
correct when entering package_write.

Joshua Brindle



[-- Attachment #2: 1-condexpr-mapping.diff --]
[-- Type: text/x-patch, Size: 1820 bytes --]

diff -x.svn -pruN libsepol/src/link.c libsepol/src/link.c
--- libsepol/src/link.c	2006-01-06 10:02:02.000000000 -0500
+++ libsepol/src/link.c	2006-01-27 15:09:18.000000000 -0500
@@ -1010,6 +1010,9 @@ static int copy_cond_list(cond_node_t *l
                         goto cleanup;
                 /* go back through and remap the expression */
                 for (cur_expr = new_node->expr; cur_expr != NULL; cur_expr = cur_expr->next) {
+			/* expression nodes don't have a bool value of 0 - don't map them */
+			if (cur_expr->expr_type != COND_BOOL)
+				continue;
                         assert(module->map[SYM_BOOLS][cur_expr->bool - 1] != 0);
                         cur_expr->bool = module->map[SYM_BOOLS][cur_expr->bool - 1];
                 }
diff -x.svn -pruN libsepol/src/module.c libsepol/src/module.c
--- libsepol/src/module.c	2006-01-26 14:51:34.000000000 -0500
+++ libsepol/src/module.c	2006-01-27 15:09:18.000000000 -0500
@@ -78,7 +78,7 @@ static int module_package_init(sepol_mod
 	if (sepol_policydb_create(&p->policy))
 		return -1;
 
-	p->num_sections = 0;
+	p->num_sections = 1;
 	p->version = 1;
 	return 0;
 }
@@ -131,6 +131,7 @@ int sepol_module_package_set_file_contex
 		memcpy(p->file_contexts, data, len);
 	}
 	p->file_contexts_len = len;
+	p->num_sections++;
 	return 0;
 }
  
@@ -536,9 +537,7 @@ int sepol_module_package_write(sepol_mod
 		if (policydb_write(&p->policy->p, &polfile))
 			return -1;
 		len = polfile.len;
-		if (polfile.len)
-			p->num_sections++;
-		else 
+		if (!polfile.len)
 			return -1;
 		
 	} else {
@@ -546,9 +545,6 @@ int sepol_module_package_write(sepol_mod
 		return -1;
 	}
 
-	if (p->file_contexts)
-		p->num_sections++;
-
 	buf[0] = cpu_to_le32(SEPOL_MODULE_PACKAGE_MAGIC);
 	buf[1] = cpu_to_le32(p->version);
 	buf[2] = cpu_to_le32(p->num_sections);


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

* Re: [PATCH] libsepol - cond_expr mapping and package num_sections bugs
  2006-01-27 20:55 [PATCH] libsepol - cond_expr mapping and package num_sections bugs Joshua Brindle
@ 2006-01-27 21:16 ` Stephen Smalley
  2006-01-30 18:51   ` Stephen Smalley
  0 siblings, 1 reply; 5+ messages in thread
From: Stephen Smalley @ 2006-01-27 21:16 UTC (permalink / raw)
  To: Joshua Brindle; +Cc: SELinux

On Fri, 2006-01-27 at 15:55 -0500, Joshua Brindle wrote:
> This patch fixes a bug where a boolean expression node which was an
> operation was trying to map the boolean value to the base policy during
> linking and getting an index from the previous map ( 0 - 1). The
> solution is to not map the boolean value if the expr_type is not COND_BOOL.
> 
> It also fixes a bug where a base module getting written after being read
> (during linking) would end up with a num_sections of 4 since
> num_sections was initialized during the read and then incremented during
> write. The solution is to move the num_sections incrementing to the
> functions where the sections are actually set, so that it is already
> correct when entering package_write.

diff -x.svn -pruN libsepol/src/module.c libsepol/src/module.c
--- libsepol/src/module.c	2006-01-26 14:51:34.000000000 -0500
+++ libsepol/src/module.c	2006-01-27 15:09:18.000000000 -0500
@@ -78,7 +78,7 @@ static int module_package_init(sepol_mod
 	if (sepol_policydb_create(&p->policy))
 		return -1;
 
-	p->num_sections = 0;
+	p->num_sections = 1;
 	p->version = 1;
 	return 0;
 }
@@ -131,6 +131,7 @@ int sepol_module_package_set_file_contex
 		memcpy(p->file_contexts, data, len);
 	}
 	p->file_contexts_len = len;
+	p->num_sections++;
 	return 0;
 }
  

This seems prone to similar bugs later.  Suppose I call
sepol_module_package_set_file_contexts multiple times; each time it
frees the old one and replaces it, so I shouldn't be incrementing the
number of sections here.

Possibly num_sections shouldn't be part of the state of the struct at
all; it should just be a local variable.  In the read case, we pull it
from the image/file and use it locally (just need to pass it back from
read_offsets to the caller).  For write, we always start with a count of
1 and increment it if we have a p->file_contexts.

@@ -536,9 +537,7 @@ int sepol_module_package_write(sepol_mod
 		if (policydb_write(&p->policy->p, &polfile))
 			return -1;
 		len = polfile.len;
-		if (polfile.len)
-			p->num_sections++;
-		else 
+		if (!polfile.len)
 			return -1;
 		
 	} else {
@@ -546,9 +545,6 @@ int sepol_module_package_write(sepol_mod
 		return -1;
 	}
 
-	if (p->file_contexts)
-		p->num_sections++;
-
 	buf[0] = cpu_to_le32(SEPOL_MODULE_PACKAGE_MAGIC);
 	buf[1] = cpu_to_le32(p->version);
 	buf[2] = cpu_to_le32(p->num_sections);


-- 
Stephen Smalley
National Security Agency


--
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] 5+ messages in thread

* Re: [PATCH] libsepol - cond_expr mapping and package num_sections bugs
  2006-01-27 21:16 ` Stephen Smalley
@ 2006-01-30 18:51   ` Stephen Smalley
  2006-01-30 19:27     ` Joshua Brindle
  0 siblings, 1 reply; 5+ messages in thread
From: Stephen Smalley @ 2006-01-30 18:51 UTC (permalink / raw)
  To: Joshua Brindle; +Cc: SELinux

On Fri, 2006-01-27 at 16:16 -0500, Stephen Smalley wrote:
> This seems prone to similar bugs later.  Suppose I call
> sepol_module_package_set_file_contexts multiple times; each time it
> frees the old one and replaces it, so I shouldn't be incrementing the
> number of sections here.
> 
> Possibly num_sections shouldn't be part of the state of the struct at
> all; it should just be a local variable.  In the read case, we pull it
> from the image/file and use it locally (just need to pass it back from
> read_offsets to the caller).  For write, we always start with a count of
> 1 and increment it if we have a p->file_contexts.

How about the patch below instead?

Index: libsepol/include/sepol/policydb/module.h
===================================================================
RCS file: /nfshome/pal/CVS/selinux-usr/libsepol/include/sepol/policydb/module.h,v
retrieving revision 1.4
diff -u -p -r1.4 module.h
--- libsepol/include/sepol/policydb/module.h	25 Oct 2005 12:09:09 -0000	1.4
+++ libsepol/include/sepol/policydb/module.h	30 Jan 2006 18:22:46 -0000
@@ -33,7 +33,6 @@
 struct sepol_module_package {
 	sepol_policydb_t *policy;
 	uint32_t	 version;
-	uint32_t	 num_sections;
 	char 		 *file_contexts;
 	size_t	         file_contexts_len;
 };
Index: libsepol/src/link.c
===================================================================
RCS file: /nfshome/pal/CVS/selinux-usr/libsepol/src/link.c,v
retrieving revision 1.13
diff -u -p -r1.13 link.c
--- libsepol/src/link.c	18 Oct 2005 13:28:24 -0000	1.13
+++ libsepol/src/link.c	30 Jan 2006 18:22:22 -0000
@@ -1010,6 +1010,9 @@ static int copy_cond_list(cond_node_t *l
                         goto cleanup;
                 /* go back through and remap the expression */
                 for (cur_expr = new_node->expr; cur_expr != NULL; cur_expr = cur_expr->next) {
+			/* expression nodes don't have a bool value of 0 - don't map them */
+			if (cur_expr->expr_type != COND_BOOL)
+				continue;
                         assert(module->map[SYM_BOOLS][cur_expr->bool - 1] != 0);
                         cur_expr->bool = module->map[SYM_BOOLS][cur_expr->bool - 1];
                 }
Index: libsepol/src/module.c
===================================================================
RCS file: /nfshome/pal/CVS/selinux-usr/libsepol/src/module.c,v
retrieving revision 1.14
diff -u -p -r1.14 module.c
--- libsepol/src/module.c	15 Nov 2005 12:58:29 -0000	1.14
+++ libsepol/src/module.c	30 Jan 2006 18:27:21 -0000
@@ -78,7 +78,6 @@ static int module_package_init(sepol_mod
 	if (sepol_policydb_create(&p->policy))
 		return -1;
 
-	p->num_sections = 0;
 	p->version = 1;
 	return 0;
 }
@@ -235,10 +234,12 @@ static int read_helper(char *buf, struct
 
 /* Get the section offsets from a package file, offsets will be malloc'd to
  * the appropriate size and the caller must free() them */
-static int module_package_read_offsets(sepol_module_package_t *mod, 
-				struct policy_file *file, size_t **offsets)
+static int module_package_read_offsets(sepol_module_package_t *mod,
+				       struct policy_file *file,
+				       size_t **offsets,
+				       uint32_t *sections)
 {
-	uint32_t *buf;
+	uint32_t *buf, nsec;
 	unsigned i;
 
 	buf = next_entry(file, sizeof(uint32_t) * 3);
@@ -252,26 +253,26 @@ static int module_package_read_offsets(s
 	}
 	
 	mod->version = le32_to_cpu(buf[1]);
-	mod->num_sections = le32_to_cpu(buf[2]);
+	nsec = *sections = le32_to_cpu(buf[2]);
 
-	if (mod->num_sections > MAXSECTIONS) {
-		ERR(file->handle, "too many sections (%u) in module package", mod->num_sections);
+	if (nsec > MAXSECTIONS) {
+		ERR(file->handle, "too many sections (%u) in module package", nsec);
 		return -1;
 	}
 
-	*offsets = (size_t *)malloc((mod->num_sections + 1) * sizeof(size_t));
+	*offsets = (size_t *)malloc((nsec + 1) * sizeof(size_t));
 	if (!*offsets) {
 		ERR(file->handle, "out of memory");
 		return -1;
 	}
 
-	buf = next_entry(file, sizeof(uint32_t) * mod->num_sections);
+	buf = next_entry(file, sizeof(uint32_t) * nsec);
 	if (!buf) {
 		ERR(file->handle, "module package offset array truncated");
 		return -1;
 	}
 
-	for (i = 0; i < mod->num_sections; i++) {
+	for (i = 0; i < nsec; i++) {
 		(*offsets)[i] = le32_to_cpu(buf[i]);
 		if (i && (*offsets)[i] < (*offsets)[i - 1]) {
 			ERR(file->handle, "offsets are not increasing (at %u, offset %u->%u)", i, (*offsets)[i-1], (*offsets)[i]);
@@ -279,7 +280,7 @@ static int module_package_read_offsets(s
 		}
 	}
 
-	(*offsets)[mod->num_sections] = policy_file_length(file);
+	(*offsets)[nsec] = policy_file_length(file);
 	return 0;
 }
 
@@ -291,17 +292,17 @@ int sepol_module_package_read(sepol_modu
 			      struct sepol_policy_file *spf, int verbose)
 {
 	struct policy_file *file= &spf->pf;
-	uint32_t *buf;
+	uint32_t *buf, nsec;
 	size_t *offsets, len;
         int retval = -1;
 	unsigned i, seen = 0;
 
-	if (module_package_read_offsets(mod, file, &offsets))
+	if (module_package_read_offsets(mod, file, &offsets, &nsec))
 		return -1;
 
 	/* we know the section offsets, seek to them and read in the data */
 
-	for (i = 0; i < mod->num_sections; i++ ) {
+	for (i = 0; i < nsec; i++ ) {
 	
 		if (policy_file_seek(file, offsets[i])) {
 			ERR(file->handle, "error seeking to offset %u for module package section %u", offsets[i], i);
@@ -383,18 +384,18 @@ int sepol_module_package_info(struct sep
 {
 	struct policy_file *file = &spf->pf;
 	sepol_module_package_t *mod = NULL;
-	uint32_t *buf, len;
+	uint32_t *buf, len, nsec;
 	size_t *offsets = NULL;
 	unsigned i, seen = 0;
 
 	if (sepol_module_package_create(&mod))
 		return -1;
 
-	if (module_package_read_offsets(mod, file, &offsets)) {
+	if (module_package_read_offsets(mod, file, &offsets, &nsec)) {
 		goto cleanup;
 	}
 
-	for (i = 0; i < mod->num_sections; i++ ) {
+	for (i = 0; i < nsec; i++ ) {
 	
 		if (policy_file_seek(file, offsets[i])) {
 			ERR(file->handle, "error seeking to offset %u for module package section %u", offsets[i], i);
@@ -525,7 +526,7 @@ int sepol_module_package_write(sepol_mod
 {
 	struct policy_file *file = &spf->pf;
 	policy_file_t polfile;
-	uint32_t buf[3], offsets[2], len, len2, idx;
+	uint32_t buf[3], offsets[2], len, len2, idx, nsec = 0;
 
 	if (p->policy) {
 		/* compute policy length */
@@ -536,10 +537,9 @@ int sepol_module_package_write(sepol_mod
 		if (policydb_write(&p->policy->p, &polfile))
 			return -1;
 		len = polfile.len;
-		if (polfile.len)
-			p->num_sections++;
-		else 
+		if (!polfile.len)
 			return -1;
+		nsec++;
 		
 	} else {
 		/* We don't support writing a package without a module at this point */
@@ -547,23 +547,23 @@ int sepol_module_package_write(sepol_mod
 	}
 
 	if (p->file_contexts)
-		p->num_sections++;
+		nsec++;
 
 	buf[0] = cpu_to_le32(SEPOL_MODULE_PACKAGE_MAGIC);
 	buf[1] = cpu_to_le32(p->version);
-	buf[2] = cpu_to_le32(p->num_sections);
+	buf[2] = cpu_to_le32(nsec);
 	if (put_entry(buf, sizeof(uint32_t), 3, file) != 3)
 		return -1;
 
 	/* first section offset */
-	offsets[0] = (p->num_sections + 3) * sizeof(uint32_t);
+	offsets[0] = (nsec + 3) * sizeof(uint32_t);
 	buf[0] = cpu_to_le32(offsets[0]);
 	if (p->file_contexts) {
 		/* second section offset is offset[0] +  module length  */	
 		offsets[1] = offsets[0] + len;
 		buf[1] = cpu_to_le32(offsets[1]);
 	}
-	if (put_entry(buf, sizeof(uint32_t), p->num_sections, file) != p->num_sections)
+	if (put_entry(buf, sizeof(uint32_t), nsec, file) != nsec)
 		return -1;
 
 	if (policydb_write(&p->policy->p, file))

-- 
Stephen Smalley
National Security Agency


--
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] 5+ messages in thread

* Re: [PATCH] libsepol - cond_expr mapping and package num_sections bugs
  2006-01-30 18:51   ` Stephen Smalley
@ 2006-01-30 19:27     ` Joshua Brindle
  2006-01-30 20:22       ` Stephen Smalley
  0 siblings, 1 reply; 5+ messages in thread
From: Joshua Brindle @ 2006-01-30 19:27 UTC (permalink / raw)
  To: Stephen Smalley; +Cc: SELinux

Stephen Smalley wrote:
> On Fri, 2006-01-27 at 16:16 -0500, Stephen Smalley wrote:
> 
>>This seems prone to similar bugs later.  Suppose I call
>>sepol_module_package_set_file_contexts multiple times; each time it
>>frees the old one and replaces it, so I shouldn't be incrementing the
>>number of sections here.
>>
>>Possibly num_sections shouldn't be part of the state of the struct at
>>all; it should just be a local variable.  In the read case, we pull it
>>from the image/file and use it locally (just need to pass it back from
>>read_offsets to the caller).  For write, we always start with a count of
>>1 and increment it if we have a p->file_contexts.
> 
> 
> How about the patch below instead?

ah! this is very close to a patch I was getting ready to send you, looks 
good to me, should solve the problem.

Btw, also getting ready to send a patch that adds 2 new sections to the 
package format so we'll see how flexible this really is then.

--
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] 5+ messages in thread

* Re: [PATCH] libsepol - cond_expr mapping and package num_sections bugs
  2006-01-30 19:27     ` Joshua Brindle
@ 2006-01-30 20:22       ` Stephen Smalley
  0 siblings, 0 replies; 5+ messages in thread
From: Stephen Smalley @ 2006-01-30 20:22 UTC (permalink / raw)
  To: Joshua Brindle; +Cc: SELinux

On Mon, 2006-01-30 at 14:27 -0500, Joshua Brindle wrote:
> ah! this is very close to a patch I was getting ready to send you, looks 
> good to me, should solve the problem.

Included in libsepol 1.11.10 along with Ivan's changes.
> 
> Btw, also getting ready to send a patch that adds 2 new sections to the 
> package format so we'll see how flexible this really is then.

-- 
Stephen Smalley
National Security Agency


--
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] 5+ messages in thread

end of thread, other threads:[~2006-01-30 20:22 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-01-27 20:55 [PATCH] libsepol - cond_expr mapping and package num_sections bugs Joshua Brindle
2006-01-27 21:16 ` Stephen Smalley
2006-01-30 18:51   ` Stephen Smalley
2006-01-30 19:27     ` Joshua Brindle
2006-01-30 20:22       ` 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.