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

[ SEMANAGE ] Resync to sepol changes (again)


Changes:

- add count function to POLICYDB record extension
- fill in all missing functions in the correct tables
- implement stub: dbase_policydb_count

Bugfixes:

- set STATUS_SUCCESS, not ERR in policydb exists() on the success path
- fix user parser bug, which did not allow multiple spaces between the user name and the "roles" - replace an error-prone inplace parse helper (which was wrong, and could crash), with a correct, and better one that uses malloc.
diff -Naurp --exclude CVS --exclude ChangeLog --exclude VERSION --exclude direct_api.c --exclude semanage_store.c --exclude libsemanage.map --exclude 'module_record*' --exclude 'database_directory*' --exclude Makefile old/libsemanage/src/booleans_policydb.c new/libsemanage/src/booleans_policydb.c
--- old/libsemanage/src/booleans_policydb.c	2005-10-24 12:32:56.000000000 -0400
+++ new/libsemanage/src/booleans_policydb.c	2005-10-24 17:30:44.000000000 -0400
@@ -25,8 +25,9 @@ record_policydb_table_t SEMANAGE_BOOL_PO
 	.add         = NULL, 
 	.modify      = NULL,
 	.set         = sepol_bool_set,
-	.query       = NULL, /* FIXME */
-	.exists      = NULL, /* FIXME */ 
+	.query       = sepol_bool_query,
+	.count       = sepol_bool_count,
+	.exists      = sepol_bool_exists, 
 	.iterate     = sepol_bool_iterate,
 };
 
diff -Naurp --exclude CVS --exclude ChangeLog --exclude VERSION --exclude direct_api.c --exclude semanage_store.c --exclude libsemanage.map --exclude 'module_record*' --exclude 'database_directory*' --exclude Makefile old/libsemanage/src/database_policydb.c new/libsemanage/src/database_policydb.c
--- old/libsemanage/src/database_policydb.c	2005-10-24 12:32:56.000000000 -0400
+++ new/libsemanage/src/database_policydb.c	2005-10-24 17:34:32.000000000 -0400
@@ -379,7 +379,7 @@ static int dbase_policydb_exists (
 		goto err;
 
 	exit_ro(handle, dbase);
-	return STATUS_ERR;
+	return STATUS_SUCCESS;
 
 	err:
 	/* FIXME: handle error */
@@ -395,10 +395,11 @@ static int dbase_policydb_count (
 	if (enter_ro(handle, dbase) < 0)
 		goto err;
 
-	/* Stub */
-	response = NULL;
+	if (dbase->rptable->count(dbase->policydb, response) < 0)
+		goto err;
+
 	exit_ro(handle, dbase);
-	return STATUS_ERR;
+	return STATUS_SUCCESS;
 
 	err:
 	/* FIXME: handle error */
diff -Naurp --exclude CVS --exclude ChangeLog --exclude VERSION --exclude direct_api.c --exclude semanage_store.c --exclude libsemanage.map --exclude 'module_record*' --exclude 'database_directory*' --exclude Makefile old/libsemanage/src/database_policydb.h new/libsemanage/src/database_policydb.h
--- old/libsemanage/src/database_policydb.h	2005-10-24 12:32:56.000000000 -0400
+++ new/libsemanage/src/database_policydb.h	2005-10-24 17:29:20.000000000 -0400
@@ -17,7 +17,8 @@ typedef struct record_policydb_table {
 		record_key_t* rkey,
 		record_t* record);
 
-	/* Modify policy record */
+	/* Modify policy record, or add if 
+	 * the key isn't found */
 	int (*modify) (
 		sepol_policydb_t* policydb, 
 		record_key_t* rkey,
@@ -29,12 +30,18 @@ typedef struct record_policydb_table {
 		record_key_t* rkey,
 		record_t* record);
 
-	/* Query policy record */
+	/* Query policy record  - return the record
+	 * or NULL if it isn't found */
 	int (*query) (
 		sepol_policydb_t* policydb,
 		record_key_t* rkey,
 		record_t** response);
 
+	/* Count records */
+	int (*count) (
+		sepol_policydb_t* policydb,
+		int* response);
+
 	/* Check if a record exists */
 	int (*exists) (
 		sepol_policydb_t* policydb,
diff -Naurp --exclude CVS --exclude ChangeLog --exclude VERSION --exclude direct_api.c --exclude semanage_store.c --exclude libsemanage.map --exclude 'module_record*' --exclude 'database_directory*' --exclude Makefile old/libsemanage/src/interfaces_policydb.c new/libsemanage/src/interfaces_policydb.c
--- old/libsemanage/src/interfaces_policydb.c	2005-10-24 12:32:56.000000000 -0400
+++ new/libsemanage/src/interfaces_policydb.c	2005-10-24 17:30:19.000000000 -0400
@@ -26,6 +26,7 @@ record_policydb_table_t SEMANAGE_IFACE_P
 	.modify      = sepol_iface_modify,
 	.set         = NULL,
 	.query       = sepol_iface_query,
+        .count       = sepol_iface_count,
 	.exists      = sepol_iface_exists, 
 	.iterate     = sepol_iface_iterate,
 };
diff -Naurp --exclude CVS --exclude ChangeLog --exclude VERSION --exclude direct_api.c --exclude semanage_store.c --exclude libsemanage.map --exclude 'module_record*' --exclude 'database_directory*' --exclude Makefile old/libsemanage/src/parse_utils.c new/libsemanage/src/parse_utils.c
--- old/libsemanage/src/parse_utils.c	2005-10-04 10:51:22.000000000 -0400
+++ new/libsemanage/src/parse_utils.c	2005-10-24 18:21:34.000000000 -0400
@@ -256,13 +256,24 @@ char* parse_filter_space_until(parse_inf
 	return NULL;
 }
 
-
-char* parse_fetch_string_inplace(parse_info_t* info) {
+int parse_fetch_string(parse_info_t* info, char** str) {
 	char* start = info->ptr;
+	int len = 0;
+	char* tmp_str = NULL;
 
-	while (*(info->ptr) && !isspace(*(info->ptr)))
+	while (*(info->ptr) && !isspace(*(info->ptr))) {
 		info->ptr++;
-	*(info->ptr)++ = '\0';
-
-	return start;
+		len ++;
+	}
+		
+	tmp_str = (char*) malloc(len + 1);
+	if (!tmp_str) {
+		/* FIXME: handle error */
+		return STATUS_ERR;	
+	}
+	
+	strncpy(tmp_str, start, len);
+	*(tmp_str + len)= '\0';
+	*str = tmp_str;
+	return STATUS_SUCCESS;
 } 
diff -Naurp --exclude CVS --exclude ChangeLog --exclude VERSION --exclude direct_api.c --exclude semanage_store.c --exclude libsemanage.map --exclude 'module_record*' --exclude 'database_directory*' --exclude Makefile old/libsemanage/src/parse_utils.h new/libsemanage/src/parse_utils.h
--- old/libsemanage/src/parse_utils.h	2005-10-04 10:51:22.000000000 -0400
+++ new/libsemanage/src/parse_utils.h	2005-10-24 18:23:24.000000000 -0400
@@ -81,10 +81,10 @@ extern char* parse_filter_space_until(
 	const char* substr);
 
 /* Extract the next string (delimited by 
- * whitespace), and move the read pointer past it. 
- * This string is overwritten when the next line 
- * is read (inplace storage) */
-extern char* parse_fetch_string_inplace(
-	parse_info_t* info);
+ * whitespace), and move the read pointer past it. */
+
+extern int parse_fetch_string(
+	parse_info_t* info,
+	char** str_ptr);
 
 #endif
diff -Naurp --exclude CVS --exclude ChangeLog --exclude VERSION --exclude direct_api.c --exclude semanage_store.c --exclude libsemanage.map --exclude 'module_record*' --exclude 'database_directory*' --exclude Makefile old/libsemanage/src/ports_policydb.c new/libsemanage/src/ports_policydb.c
--- old/libsemanage/src/ports_policydb.c	2005-10-24 12:32:56.000000000 -0400
+++ new/libsemanage/src/ports_policydb.c	2005-10-24 17:30:24.000000000 -0400
@@ -26,6 +26,7 @@ record_policydb_table_t SEMANAGE_PORT_PO
 	.modify      = sepol_port_modify,
 	.set         = NULL, 
 	.query       = sepol_port_query,
+        .count       = sepol_port_count,
 	.exists      = sepol_port_exists,
 	.iterate     = sepol_port_iterate,
 };
diff -Naurp --exclude CVS --exclude ChangeLog --exclude VERSION --exclude direct_api.c --exclude semanage_store.c --exclude libsemanage.map --exclude 'module_record*' --exclude 'database_directory*' --exclude Makefile old/libsemanage/src/users_file.c new/libsemanage/src/users_file.c
--- old/libsemanage/src/users_file.c	2005-10-24 12:32:56.000000000 -0400
+++ new/libsemanage/src/users_file.c	2005-10-24 18:27:55.000000000 -0400
@@ -70,13 +70,14 @@ static int user_parse(
 	int islist = 0;
 	char* mls = NULL;
 	char* start;
+	char* name_str = NULL;
 
 	if (parse_skip_space(info) < 0)
 		goto err;
 	if (!info->ptr)
 		goto last;
 
-	/* Parse user name */
+	/* Parse user header */
 	if (parse_assert_str(info, "user") < 0)
 		goto err;
 
@@ -87,7 +88,21 @@ static int user_parse(
 	if (parse_assert_noeof(info) < 0)
 		goto err;
 
-	if (semanage_user_set_name(user, parse_fetch_string_inplace(info)) < 0)
+	/* Parse user name */
+	if (parse_fetch_string(info, &name_str) < 0)
+		goto err;
+
+	if (semanage_user_set_name(user, name_str) < 0) {
+		free(name_str);
+                goto err;
+	}
+	free(name_str);
+
+	if (parse_assert_space(info) < 0)
+		goto err;
+	if (parse_skip_space(info) < 0)
+		goto err;
+	if (parse_assert_noeof(info) < 0)
                 goto err;
 
 	/* Parse roles header */
diff -Naurp --exclude CVS --exclude ChangeLog --exclude VERSION --exclude direct_api.c --exclude semanage_store.c --exclude libsemanage.map --exclude 'module_record*' --exclude 'database_directory*' --exclude Makefile old/libsemanage/src/users_policydb.c new/libsemanage/src/users_policydb.c
--- old/libsemanage/src/users_policydb.c	2005-10-24 12:32:56.000000000 -0400
+++ new/libsemanage/src/users_policydb.c	2005-10-24 17:29:43.000000000 -0400
@@ -25,7 +25,8 @@ record_policydb_table_t SEMANAGE_USER_PO
 	.add         = NULL,
 	.modify      = sepol_user_modify,
 	.set         = NULL,
-	.query       = NULL, /* FIXME */
+	.query       = sepol_user_query, 
+	.count       = sepol_user_count,
 	.exists      = sepol_user_exists,
 	.iterate     = sepol_user_iterate,
 };


This mailing list archive is a service of Copilot Consulting.