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

[ SEMANAGE ] Implement dbase_file_set, fix memleak


Changes:
- implement dbase_file_set
- fix a memory leak in dbase_file_modify that I've been trying to find - there are no more leaks that I know of


=============
I'll be really busy until the middle of next week - not sure if I can get a many patches written.

A short TODO:
- interface: pass handle into sepol records, or implement status codes
- stub: implement interface parse/print
- stub: implement dbase_policydb_list
- fix: fix port key handling of modify() [ do not replace an entire range on weak match (not exact) ] - improvement: track when the policy is modified, and do not rebuild on commit if it wasn't modified - add error messages everywhere (and further propagate handle), and make sure they're user-friendly - uncomment if0-ed code, add new semanage interfaces to semanage.h, and the map file

Not important at this time:
- stub: implement dbase_policydb_del    (not currently used)
- stub: implement dbase_policydb_flush  (not currently used)
- fix: users parser/genusers parser should not look for range substring - that's ambiguous
- fix: seusers parser should allow multiline MLS context with whitespace
diff -Naurp --exclude CVS --exclude ChangeLog --exclude direct_api.c --exclude semanage_store.c --exclude VERSION --exclude libsemanage.map --exclude 'module_record*' --exclude 'database_directory*' --exclude Makefile old/libsemanage/src/database_file.c new/libsemanage/src/database_file.c
--- old/libsemanage/src/database_file.c	2005-10-25 09:06:53.000000000 -0400
+++ new/libsemanage/src/database_file.c	2005-10-26 19:28:35.000000000 -0400
@@ -388,14 +388,26 @@ static int dbase_file_set(
 	record_key_t* key,
 	record_t* data) {
 
+	cache_entry_t* entry;
+	int status;
+
 	if (enter_rw(handle, dbase) < 0)
 		goto err;
 
-        /* Stub */
-        key = NULL;
-        data = NULL;
+	status = dbase_file_cache_locate(handle, dbase, key, &entry);
+	if (status < 0)
+		goto err;
+        if (status == STATUS_NODATA) {
+		/* FIXME: handle error */
+		goto err;
+	}
+	else {
+		dbase->rtable->free(entry->data);
+		entry->data = data;
+	}
+
 	dbase->modified = 1;
-        return STATUS_ERR;
+        return STATUS_SUCCESS;
 
 	err:
 	/* FIXME: handle error */
@@ -422,8 +434,10 @@ static int dbase_file_modify(
 		if (dbase_file_cache_add(dbase, data) < 0)
 			goto err;
 	}
-	else
+	else {
+		dbase->rtable->free(entry->data);
 		entry->data = data;
+	}
 
 	dbase->modified = 1;
 	return STATUS_SUCCESS;


This mailing list archive is a service of Copilot Consulting.