All of lore.kernel.org
 help / color / mirror / Atom feed
* [SEMANAGE] Bugfixes
@ 2006-01-12 12:37 Ivan Gyurdiev
  2006-01-13 13:53 ` Stephen Smalley
  0 siblings, 1 reply; 2+ messages in thread
From: Ivan Gyurdiev @ 2006-01-12 12:37 UTC (permalink / raw)
  To: selinux; +Cc: Stephen Smalley

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

Various bugfixes and improvements for recent code:

- rename del_all -> clear, since I like that better
- remove requirement to run cache() prior to clear (change spec, and 
implementation)
  (and stop running it in join, that's ridiculous)
- BUGFIX: add clear pointer to activedb backend method table

- do not test for NULL record after record->split(), split is not 
allowed to return NULL
- remove old FIXME from fcontexts_local

- BUGFIX: clear user_extras (policy) dbase in apply_local_changes() 
function. Otherwise previous changes are left over, and that's not what 
we want - we want build from scratch. This is the equivalent of making a 
new policydb, or the direct_api.c processing that rebuilds the 
file_contexts file from the one in the package.

[-- Attachment #2: libsemanage.bugfixes.diff --]
[-- Type: text/x-patch, Size: 8031 bytes --]

diff -Naurp --exclude ports_local.c --exclude-from excludes old/libsemanage/src/database_activedb.c new/libsemanage/src/database_activedb.c
--- old/libsemanage/src/database_activedb.c	2006-01-12 03:44:37.000000000 -0700
+++ new/libsemanage/src/database_activedb.c	2006-01-12 05:26:08.000000000 -0700
@@ -157,6 +157,7 @@ dbase_table_t SEMANAGE_ACTIVEDB_DTABLE =
 	.add = (void*) dbase_llist_add,
 	.set = (void*) dbase_llist_set,
 	.del = (void*) dbase_llist_del, 
+	.clear = (void*) dbase_llist_clear,
 	.modify = (void*) dbase_llist_modify, 
 	.query = (void*) dbase_llist_query, 
 	.count = (void*) dbase_llist_count, 
diff -Naurp --exclude ports_local.c --exclude-from excludes old/libsemanage/src/database_file.c new/libsemanage/src/database_file.c
--- old/libsemanage/src/database_file.c	2006-01-12 03:47:32.000000000 -0700
+++ new/libsemanage/src/database_file.c	2006-01-12 05:20:08.000000000 -0700
@@ -228,7 +228,7 @@ dbase_table_t SEMANAGE_FILE_DTABLE = {
 	.add = (void*) dbase_llist_add,
 	.set = (void*) dbase_llist_set,
 	.del = (void*) dbase_llist_del, 
-	.del_all = (void*) dbase_llist_del_all,
+	.clear = (void*) dbase_llist_clear,
 	.modify = (void*) dbase_llist_modify, 
 	.query = (void*) dbase_llist_query, 
 	.count = (void*) dbase_llist_count, 
diff -Naurp --exclude ports_local.c --exclude-from excludes old/libsemanage/src/database.h new/libsemanage/src/database.h
--- old/libsemanage/src/database.h	2006-01-12 03:47:32.000000000 -0700
+++ new/libsemanage/src/database.h	2006-01-12 05:22:07.000000000 -0700
@@ -110,8 +110,10 @@ typedef struct dbase_table {
 		dbase_t* dbase,
 		const record_key_t* key);
 
-	/* Delete all records */
-	int (*del_all) (
+	/* Clear all records, and leave the database in
+	 * cached, modified state. This function does 
+	 * not require a call to cache() */
+	int (*clear) (
 		struct semanage_handle* handle,
 		dbase_t* dbase);
 
diff -Naurp --exclude ports_local.c --exclude-from excludes old/libsemanage/src/database_join.c new/libsemanage/src/database_join.c
--- old/libsemanage/src/database_join.c	2006-01-12 04:00:00.000000000 -0700
+++ new/libsemanage/src/database_join.c	2006-01-12 05:26:41.000000000 -0700
@@ -183,23 +183,14 @@ static int dbase_join_flush(
 	    !dbase_llist_is_modified(&dbase->llist))
 		return STATUS_SUCCESS;
 
-	/* First cache any dbase, (which should already be cached
-	 * unless somebody did a drop_cache on the underlying 
-	 * databases while we were working on the join, so this probably 
-	 * doesn't do anything - it's just a precaution) */
-	if (dtable1->cache(handle, dbase1) < 0)
-		goto err;
-	if (dtable2->cache(handle, dbase2) < 0)
-		goto err;
-
 	/* Then clear all records from the cache.
 	 * This is *not* the same as dropping the cache - it's an explicit
 	 * request to delete all current records. We need to do 
 	 * this because we don't store delete deltas for the join,
 	 * so we must re-add all records from scratch */
-	if (dtable1->del_all(handle, dbase1) < 0)
+	if (dtable1->clear(handle, dbase1) < 0)
 		goto err;
-	if (dtable2->del_all(handle, dbase2) < 0)
+	if (dtable2->clear(handle, dbase2) < 0)
 		goto err;
 
 	/* For each record, split, and add parts into their corresponding databases */
@@ -212,10 +203,10 @@ static int dbase_join_flush(
 			&record1, &record2) < 0)
 			goto err;
 
-		if (record1 && dtable1->add(handle, dbase1, rkey, record1) < 0)
+		if (dtable1->add(handle, dbase1, rkey, record1) < 0)
 			goto err;
 	
-		if (record2 && dtable2->add(handle, dbase2, rkey, record2) < 0)
+		if (dtable2->add(handle, dbase2, rkey, record2) < 0)
 			goto err;
 
 		rtable->key_free(rkey);
@@ -294,7 +285,7 @@ dbase_table_t SEMANAGE_JOIN_DTABLE = {
 	.add = (void*) dbase_llist_add,
 	.set = (void*) dbase_llist_set,
 	.del = (void*) dbase_llist_del, 
-	.del_all = (void*) dbase_llist_del_all,
+	.clear = (void*) dbase_llist_clear,
 	.modify = (void*) dbase_llist_modify, 
 	.query = (void*) dbase_llist_query, 
 	.count = (void*) dbase_llist_count, 
diff -Naurp --exclude ports_local.c --exclude-from excludes old/libsemanage/src/database_llist.c new/libsemanage/src/database_llist.c
--- old/libsemanage/src/database_llist.c	2006-01-12 03:47:32.000000000 -0700
+++ new/libsemanage/src/database_llist.c	2006-01-12 05:21:46.000000000 -0700
@@ -288,21 +288,24 @@ int dbase_llist_del(
 	return STATUS_SUCCESS;
 }
 
-int dbase_llist_del_all(
+int dbase_llist_clear(
 	semanage_handle_t* handle,
 	dbase_llist_t* dbase) {
 
-	cache_entry_t *prev, *ptr = dbase->cache;
-	while (ptr != NULL) {
-		prev = ptr;
-		ptr = ptr->next;
-		dbase->rtable->free(prev->data);
-		free(prev);
-        }
+	if (dbase->cached) {
+		cache_entry_t *prev, *ptr = dbase->cache;
+		while (ptr != NULL) {
+			prev = ptr;
+			ptr = ptr->next;
+			dbase->rtable->free(prev->data);
+			free(prev);
+	        }
+	}
 
 	dbase->cache = NULL;
 	dbase->cache_tail = NULL;
 	dbase->cache_sz = 0;
+	dbase->cached = 1;
         dbase->modified = 1;
 	handle = NULL;
 	return STATUS_SUCCESS;
diff -Naurp --exclude ports_local.c --exclude-from excludes old/libsemanage/src/database_llist.h new/libsemanage/src/database_llist.h
--- old/libsemanage/src/database_llist.h	2006-01-12 03:47:32.000000000 -0700
+++ new/libsemanage/src/database_llist.h	2006-01-12 05:26:16.000000000 -0700
@@ -138,7 +138,7 @@ extern int dbase_llist_del(
 	dbase_llist_t* dbase,
 	const record_key_t* key);
 
-extern int dbase_llist_del_all(
+extern int dbase_llist_clear(
 	semanage_handle_t* handle,
 	dbase_llist_t* dbase);
 
diff -Naurp --exclude ports_local.c --exclude-from excludes old/libsemanage/src/database_policydb.c new/libsemanage/src/database_policydb.c
--- old/libsemanage/src/database_policydb.c	2006-01-12 03:47:32.000000000 -0700
+++ new/libsemanage/src/database_policydb.c	2006-01-12 05:20:22.000000000 -0700
@@ -284,7 +284,7 @@ static int dbase_policydb_del (
 	return STATUS_ERR;
 }
 
-static int dbase_policydb_del_all (
+static int dbase_policydb_clear (
 	semanage_handle_t* handle,
 	dbase_policydb_t* dbase) {
 
@@ -453,7 +453,7 @@ dbase_table_t SEMANAGE_POLICYDB_DTABLE =
 	.add = dbase_policydb_add,
 	.set = dbase_policydb_set,
 	.del = dbase_policydb_del,
-	.del_all = dbase_policydb_del_all,
+	.clear = dbase_policydb_clear,
 	.modify = dbase_policydb_modify, 
 	.query = dbase_policydb_query,
 	.count = dbase_policydb_count,
diff -Naurp --exclude ports_local.c --exclude-from excludes old/libsemanage/src/fcontexts_local.c new/libsemanage/src/fcontexts_local.c
--- old/libsemanage/src/fcontexts_local.c	2006-01-11 16:23:42.000000000 -0700
+++ new/libsemanage/src/fcontexts_local.c	2006-01-12 05:23:02.000000000 -0700
@@ -101,8 +101,6 @@ static int validate_handler(
 	const char* type_str = semanage_fcontext_get_type_str(fcon);
 	semanage_context_t* con = semanage_fcontext_get_con(fcon);
 
-	/* FIXME: verify expr? */
-	
 	if (sepol_context_check(handle->sepolh, policydb, con) < 0)
 		goto invalid;
 
diff -Naurp --exclude ports_local.c --exclude-from excludes old/libsemanage/src/semanage_store.c new/libsemanage/src/semanage_store.c
--- old/libsemanage/src/semanage_store.c	2006-01-12 04:29:52.000000000 -0700
+++ new/libsemanage/src/semanage_store.c	2006-01-12 05:28:23.000000000 -0700
@@ -1399,6 +1399,12 @@ int semanage_apply_local_changes(
 	dbase_t* fcdbase = semanage_fcontext_dbase_policy(sh)->dbase;
 	fcdtable->drop_cache(fcdbase);
 
+	/* Clear the users_extra dbase completely */
+	dbase_table_t* uedtable = semanage_user_extra_dbase_policy(sh)->dtable;
+	dbase_t* uedbase = semanage_user_extra_dbase_policy(sh)->dbase;
+	if (uedtable->clear(sh, uedbase) < 0)
+		goto exit;	
+
 	/* Similarly, attaching the policydb will erase any existing cache */	
 	dbase_policydb_attach(semanage_user_base_dbase_policy(sh)->dbase, out);
 	dbase_policydb_attach(semanage_port_dbase_policy(sh)->dbase, out);
@@ -1412,6 +1418,7 @@ int semanage_apply_local_changes(
         dbase_policydb_detach(semanage_iface_dbase_policy(sh)->dbase);
         dbase_policydb_detach(semanage_bool_dbase_policy(sh)->dbase);
 
+	exit:
 	return retval;
 }
 

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

* Re: [SEMANAGE] Bugfixes
  2006-01-12 12:37 [SEMANAGE] Bugfixes Ivan Gyurdiev
@ 2006-01-13 13:53 ` Stephen Smalley
  0 siblings, 0 replies; 2+ messages in thread
From: Stephen Smalley @ 2006-01-13 13:53 UTC (permalink / raw)
  To: Ivan Gyurdiev; +Cc: selinux

On Thu, 2006-01-12 at 05:37 -0700, Ivan Gyurdiev wrote:
> Various bugfixes and improvements for recent code:
> 
> - rename del_all -> clear, since I like that better
> - remove requirement to run cache() prior to clear (change spec, and 
> implementation)
>   (and stop running it in join, that's ridiculous)
> - BUGFIX: add clear pointer to activedb backend method table
> 
> - do not test for NULL record after record->split(), split is not 
> allowed to return NULL
> - remove old FIXME from fcontexts_local
> 
> - BUGFIX: clear user_extras (policy) dbase in apply_local_changes() 
> function. Otherwise previous changes are left over, and that's not what 
> we want - we want build from scratch. This is the equivalent of making a 
> new policydb, or the direct_api.c processing that rebuilds the 
> file_contexts file from the one in the package.

Merged the join prereq, implementation, user extra data part 2, and this
patch as of libsemanage 1.5.13.

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

end of thread, other threads:[~2006-01-13 13:53 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-01-12 12:37 [SEMANAGE] Bugfixes Ivan Gyurdiev
2006-01-13 13:53 ` 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.