Blob Blame History Raw
diff --color -ru a/src/library/trust-file.c b/src/library/trust-file.c
--- a/src/library/trust-file.c	2021-12-13 09:37:56.633741747 +0100
+++ b/src/library/trust-file.c	2021-12-13 13:44:13.689151921 +0100
@@ -176,8 +176,11 @@
 	list_t content;
 	list_init(&content);
 	int rc = trust_file_load(fpath, &content);
-	if (rc)
+	// if trust file does not exist, we ignore it as it will be created while writing
+	if (rc == 2) {
+		// exit on parse error, we dont want invalid entries to be removed
 		return 1;
+	}
 
 	for (list_item_t *lptr = list->first; lptr; lptr = lptr->next) {
 		int i = 0;
@@ -187,9 +190,16 @@
 	list_merge(&content, list);
 	write_out_list(&content, fpath);
 	list_empty(&content);
-	return rc ? 1 : 0;
+	return 0;
 }
 
+/**
+ * @brief Load trust file into list
+ *
+ * @param fpath Full path to trust file
+ * @param list Trust file will be loaded into this list
+ * @return 0 on success, 1 if file can't be open, 2 on parsing error
+ */
 int trust_file_load(const char *fpath, list_t *list)
 {
 	char buffer[BUFFER_SIZE];
@@ -197,10 +207,8 @@
 	long line = 0;
 
 	FILE *file = fopen(fpath, "r");
-	if (!file) {
-		msg(LOG_ERR, "Cannot open %s", fpath);
+	if (!file)
 		return 1;
-	}
 
 	while (fgets(buffer, BUFFER_SIZE, file)) {
 		char name[4097], sha[65], *index = NULL, *data = NULL;
@@ -257,7 +265,17 @@
 {
 	list_t list;
 	list_init(&list);
-	trust_file_load(fpath, &list);
+	int rc = trust_file_load(fpath, &list);
+	switch (rc) {
+	case 1:
+		msg(LOG_ERR, "Cannot open %s", fpath);
+		return 0;
+	case 2:
+		list_empty(&list);
+		return -1;
+	default:
+		break;
+	}
 
 	int count = 0;
 	size_t path_len = strlen(path);
@@ -295,7 +313,17 @@
 {
 	list_t list;
 	list_init(&list);
-	trust_file_load(fpath, &list);
+	int rc = trust_file_load(fpath, &list);
+	switch (rc) {
+	case 1:
+		msg(LOG_ERR, "Cannot open %s", fpath);
+		return 0;
+	case 2:
+		list_empty(&list);
+		return -1;
+	default:
+		break;
+	}
 
 	int count = 0;
 	size_t path_len = strlen(path);
@@ -320,20 +348,26 @@
 {
 	list_t trust_file;
 	list_init(&trust_file);
-
 	int rc = trust_file_load(fpath, &trust_file);
-	if (rc)
-		goto cleanup;
-
+	switch (rc) {
+	case 1:
+		msg(LOG_ERR, "Cannot open %s", fpath);
+		return -1;
+	case 2:
+		list_empty(&trust_file);
+		return -1;
+	default:
+		break;
+	}
+	
 	for (list_item_t *lptr = trust_file.first; lptr; lptr = lptr->next) {
 		list_remove(list, lptr->index);
 		if (list->count == 0)
 			break;
 	}
 
-cleanup:
 	list_empty(&trust_file);
-	return rc;
+	return 0;
 }