Blame SOURCES/fapolicyd-fix-escaping.patch

7aaf18
diff --color -ru a/init/fapolicyd.trust b/init/fapolicyd.trust
7aaf18
--- a/init/fapolicyd.trust	2021-11-12 20:21:54.000000000 +0100
7aaf18
+++ b/init/fapolicyd.trust	2021-12-08 13:25:43.441187113 +0100
7aaf18
@@ -1,3 +1,4 @@
7aaf18
+# AUTOGENERATED FILE VERSION 2
7aaf18
 # This file contains a list of trusted files
7aaf18
 #
7aaf18
 #  FULL PATH        SIZE                             SHA256
7aaf18
diff --color -ru a/src/cli/file-cli.c b/src/cli/file-cli.c
7aaf18
--- a/src/cli/file-cli.c	2021-11-12 20:21:54.000000000 +0100
7aaf18
+++ b/src/cli/file-cli.c	2021-12-08 13:25:43.441187113 +0100
7aaf18
@@ -89,9 +89,6 @@
7aaf18
 	return 0;
7aaf18
 }
7aaf18
 
7aaf18
-
7aaf18
-
7aaf18
-
7aaf18
 int file_append(const char *path, const char *fname)
7aaf18
 {
7aaf18
 	set_message_mode(MSG_STDERR, DBG_NO);
7aaf18
@@ -110,11 +107,14 @@
7aaf18
 
7aaf18
 	char *dest = fname ? fapolicyd_strcat(TRUST_DIR_PATH, fname) :
7aaf18
 							TRUST_FILE_PATH;
7aaf18
+
7aaf18
 	int rc = trust_file_append(dest, &add_list);
7aaf18
 
7aaf18
+	list_empty(&add_list);
7aaf18
+
7aaf18
 	if (fname)
7aaf18
 		free(dest);
7aaf18
-	list_empty(&add_list);
7aaf18
+
7aaf18
 	return rc ? -1 : 0;
7aaf18
 }
7aaf18
 
7aaf18
diff --color -ru a/src/library/trust-file.c b/src/library/trust-file.c
7aaf18
--- a/src/library/trust-file.c	2021-11-12 20:21:54.000000000 +0100
7aaf18
+++ b/src/library/trust-file.c	2021-12-08 15:42:15.787206923 +0100
7aaf18
@@ -51,6 +51,7 @@
7aaf18
 #define FTW_NOPENFD 1024
7aaf18
 #define FTW_FLAGS (FTW_ACTIONRETVAL | FTW_PHYS)
7aaf18
 
7aaf18
+#define HEADER0 "# AUTOGENERATED FILE VERSION 2\n"
7aaf18
 #define HEADER1 "# This file contains a list of trusted files\n"
7aaf18
 #define HEADER2 "#\n"
7aaf18
 #define HEADER3 "#  FULL PATH        SIZE                             SHA256\n"
7aaf18
@@ -137,12 +138,19 @@
7aaf18
 		return 1;
7aaf18
 	}
7aaf18
 
7aaf18
-	size_t hlen = strlen(HEADER1);
7aaf18
+	size_t hlen;
7aaf18
+	hlen = strlen(HEADER0);
7aaf18
+	fwrite(HEADER0, hlen, 1, f);
7aaf18
+
7aaf18
+	hlen = strlen(HEADER1);
7aaf18
 	fwrite(HEADER1, hlen, 1, f);
7aaf18
+
7aaf18
 	hlen = strlen(HEADER2);
7aaf18
 	fwrite(HEADER2, hlen, 1, f);
7aaf18
+
7aaf18
 	hlen = strlen(HEADER3);
7aaf18
 	fwrite(HEADER3, hlen, 1, f);
7aaf18
+
7aaf18
 	hlen = strlen(HEADER4);
7aaf18
 	fwrite(HEADER4, hlen, 1, f);
7aaf18
 
7aaf18
@@ -163,50 +171,49 @@
7aaf18
 	return 0;
7aaf18
 }
7aaf18
 
7aaf18
-
7aaf18
-
7aaf18
-int trust_file_append(const char *fpath, const list_t *list) {
7aaf18
-	int fd = open(fpath, O_CREAT | O_WRONLY | O_APPEND, 0600);
7aaf18
-	if (fd == -1) {
7aaf18
-		msg(LOG_ERR, "Cannot open %s", fpath);
7aaf18
+int trust_file_append(const char *fpath, list_t *list)
7aaf18
+{
7aaf18
+	list_t content;
7aaf18
+	list_init(&content);
7aaf18
+	int rc = trust_file_load(fpath, &content);
7aaf18
+	if (rc)
7aaf18
 		return 1;
7aaf18
-	}
7aaf18
 
7aaf18
 	for (list_item_t *lptr = list->first; lptr; lptr = lptr->next) {
7aaf18
-		int count = 1;
7aaf18
-		char *line = make_path_string(lptr->index, &count);
7aaf18
-		if (!line)
7aaf18
-			continue;
7aaf18
-
7aaf18
-		if (write(fd, line, count) == -1) {
7aaf18
-			msg(LOG_ERR, "failed writing to %s\n", fpath);
7aaf18
-			free(line);
7aaf18
-			close(fd);
7aaf18
-			return 2;
7aaf18
-		}
7aaf18
-		free(line);
7aaf18
+		int i = 0;
7aaf18
+		lptr->data = make_path_string(lptr->index, &i);
7aaf18
 	}
7aaf18
 
7aaf18
-	close(fd);
7aaf18
-	return 0;
7aaf18
+	list_merge(&content, list);
7aaf18
+	write_out_list(&content, fpath);
7aaf18
+	list_empty(&content);
7aaf18
+	return rc ? 1 : 0;
7aaf18
 }
7aaf18
 
7aaf18
 int trust_file_load(const char *fpath, list_t *list)
7aaf18
 {
7aaf18
+	char buffer[BUFFER_SIZE];
7aaf18
+	int escaped = 0;
7aaf18
+	long line = 0;
7aaf18
+
7aaf18
 	FILE *file = fopen(fpath, "r");
7aaf18
 	if (!file) {
7aaf18
 		msg(LOG_ERR, "Cannot open %s", fpath);
7aaf18
 		return 1;
7aaf18
 	}
7aaf18
 
7aaf18
-	char buffer[BUFFER_SIZE];
7aaf18
 	while (fgets(buffer, BUFFER_SIZE, file)) {
7aaf18
-		char name[4097], sha[65], *index, *data;
7aaf18
+		char name[4097], sha[65], *index = NULL, *data = NULL;
7aaf18
 		unsigned long sz;
7aaf18
 		unsigned int tsource = SRC_FILE_DB;
7aaf18
 
7aaf18
-		if (iscntrl(buffer[0]) || buffer[0] == '#')
7aaf18
+		line++;
7aaf18
+
7aaf18
+		if (iscntrl(buffer[0]) || buffer[0] == '#') {
7aaf18
+			if (line == 1 && strncmp(buffer, HEADER0, strlen(HEADER0)) == 0)
7aaf18
+				escaped = 1;
7aaf18
 			continue;
7aaf18
+		}
7aaf18
 
7aaf18
 		if (sscanf(buffer, FILE_READ_FORMAT, name, &sz, sha) != 3) {
7aaf18
 			msg(LOG_WARNING, "Can't parse %s", buffer);
7aaf18
@@ -217,7 +224,7 @@
7aaf18
 		if (asprintf(&data, DATA_FORMAT, tsource, sz, sha) == -1)
7aaf18
 			data = NULL;
7aaf18
 
7aaf18
-		index = unescape(name);
7aaf18
+		index = escaped ? unescape(name) : strdup(name);
7aaf18
 		if (index == NULL) {
7aaf18
 			msg(LOG_ERR, "Could not unescape %s from %s", name, fpath);
7aaf18
 			free(data);
7aaf18
@@ -311,33 +318,22 @@
7aaf18
 
7aaf18
 int trust_file_rm_duplicates(const char *fpath, list_t *list)
7aaf18
 {
7aaf18
-	FILE *file = fopen(fpath, "r");
7aaf18
-	if (!file) {
7aaf18
-		msg(LOG_ERR, "Cannot open %s", fpath);
7aaf18
-		return 1;
7aaf18
-	}
7aaf18
-
7aaf18
-	char buffer[BUFFER_SIZE];
7aaf18
-	while (fgets(buffer, BUFFER_SIZE, file)) {
7aaf18
-		char thash[65], tpath[4097];
7aaf18
-		long unsigned size;
7aaf18
+	list_t trust_file;
7aaf18
+	list_init(&trust_file);
7aaf18
 
7aaf18
-		if (iscntrl(buffer[0]) || buffer[0] == '#')
7aaf18
-			continue;
7aaf18
+	int rc = trust_file_load(fpath, &trust_file);
7aaf18
+	if (rc)
7aaf18
+		goto cleanup;
7aaf18
 
7aaf18
-		if (sscanf(buffer, FILE_READ_FORMAT, tpath, &size, thash) != 3) {
7aaf18
-			msg(LOG_WARNING, "Can't parse %s", buffer);
7aaf18
-			fclose(file);
7aaf18
-			return 2;
7aaf18
-		}
7aaf18
-
7aaf18
-		list_remove(list, tpath);
7aaf18
+	for (list_item_t *lptr = trust_file.first; lptr; lptr = lptr->next) {
7aaf18
+		list_remove(list, lptr->index);
7aaf18
 		if (list->count == 0)
7aaf18
 			break;
7aaf18
 	}
7aaf18
 
7aaf18
-	fclose(file);
7aaf18
-	return 0;
7aaf18
+cleanup:
7aaf18
+	list_empty(&trust_file);
7aaf18
+	return rc;
7aaf18
 }
7aaf18
 
7aaf18
 
7aaf18
diff --color -ru a/src/library/trust-file.h b/src/library/trust-file.h
7aaf18
--- a/src/library/trust-file.h	2021-11-12 20:21:54.000000000 +0100
7aaf18
+++ b/src/library/trust-file.h	2021-12-08 13:25:43.441187113 +0100
7aaf18
@@ -30,8 +30,7 @@
7aaf18
 #define TRUST_FILE_PATH "/etc/fapolicyd/fapolicyd.trust"
7aaf18
 #define TRUST_DIR_PATH "/etc/fapolicyd/trust.d/"
7aaf18
 
7aaf18
-int trust_file_append(const char *fpath, const list_t *list);
7aaf18
-
7aaf18
+int trust_file_append(const char *fpath, list_t *list);
7aaf18
 int trust_file_load(const char *fpath, list_t *list);
7aaf18
 int trust_file_update_path(const char *fpath, const char *path);
7aaf18
 int trust_file_delete_path(const char *fpath, const char *path);