Blame SOURCES/fapolicyd-fgets-update-thread.patch

0aabf8
diff -up ./src/cli/fapolicyd-cli.c.upgrade-thread ./src/cli/fapolicyd-cli.c
0aabf8
--- ./src/cli/fapolicyd-cli.c.upgrade-thread	2022-08-03 18:00:02.374999369 +0200
0aabf8
+++ ./src/cli/fapolicyd-cli.c	2022-08-03 18:00:09.802830497 +0200
0aabf8
@@ -482,7 +482,7 @@ static int do_update(void)
0aabf8
 		}
0aabf8
 	}
0aabf8
 
0aabf8
-	ssize_t ret = write(fd, "1", 2);
0aabf8
+	ssize_t ret = write(fd, "1\n", 3);
0aabf8
 
0aabf8
 	if (ret == -1) {
0aabf8
 		fprintf(stderr, "Write: %s -> %s\n", _pipe, strerror(errno));
0aabf8
diff -up ./src/library/database.c.upgrade-thread ./src/library/database.c
0aabf8
--- ./src/library/database.c.upgrade-thread	2022-06-21 16:55:47.000000000 +0200
0aabf8
+++ ./src/library/database.c	2022-08-03 17:58:04.034689808 +0200
0aabf8
@@ -34,6 +34,7 @@
0aabf8
 #include <errno.h>
0aabf8
 #include <unistd.h>
0aabf8
 #include <fcntl.h>
0aabf8
+#include <ctype.h>
0aabf8
 #include <gcrypt.h>
0aabf8
 #include <signal.h>
0aabf8
 #include <sys/stat.h>
0aabf8
@@ -43,6 +44,7 @@
0aabf8
 #include "message.h"
0aabf8
 #include "llist.h"
0aabf8
 #include "file.h"
0aabf8
+#include "fd-fgets.h"
0aabf8
 
0aabf8
 #include "fapolicyd-backend.h"
0aabf8
 #include "backend-manager.h"
0aabf8
@@ -1181,6 +1183,7 @@ static void *update_thread_main(void *ar
0aabf8
 			return NULL;
0aabf8
 	}
0aabf8
 
0aabf8
+	fcntl(ffd[0].fd, F_SETFL, O_NONBLOCK);
0aabf8
 	ffd[0].events = POLLIN;
0aabf8
 
0aabf8
 	while (!stop) {
0aabf8
@@ -1200,97 +1203,102 @@ static void *update_thread_main(void *ar
0aabf8
 			} else {
0aabf8
 				msg(LOG_ERR, "Update poll error (%s)",
0aabf8
 				    strerror_r(errno, err_buff, BUFFER_SIZE));
0aabf8
-				goto err_out;
0aabf8
+				goto finalize;
0aabf8
 			}
0aabf8
 		} else if (rc == 0) {
0aabf8
 #ifdef DEBUG
0aabf8
 			msg(LOG_DEBUG, "Update poll timeout expired");
0aabf8
 #endif
0aabf8
-			if (db_operation != DB_NO_OP)
0aabf8
-				goto handle_db_ops;
0aabf8
 			continue;
0aabf8
 		} else {
0aabf8
 			if (ffd[0].revents & POLLIN) {
0aabf8
-				ssize_t count = read(ffd[0].fd, buff,
0aabf8
-						     BUFFER_SIZE-1);
0aabf8
 
0aabf8
-				if (count == -1) {
0aabf8
-					msg(LOG_ERR,
0aabf8
-					   "Failed to read from a pipe %s (%s)",
0aabf8
-					   fifo_path,
0aabf8
-					   strerror_r(errno, err_buff,
0aabf8
-						      BUFFER_SIZE));
0aabf8
-					goto err_out;
0aabf8
-				}
0aabf8
+				do {
0aabf8
+					fd_fgets_rewind();
0aabf8
+					int res = fd_fgets(buff, sizeof(buff), ffd[0].fd);
0aabf8
 
0aabf8
-				if (count == 0) {
0aabf8
-#ifdef DEBUG
0aabf8
-					msg(LOG_DEBUG,
0aabf8
-					    "Buffer contains zero bytes!");
0aabf8
-#endif
0aabf8
-					continue;
0aabf8
-				} else // Manually terminate buff
0aabf8
-					buff[count] = 0;
0aabf8
-#ifdef DEBUG
0aabf8
-				msg(LOG_DEBUG, "Buffer contains: \"%s\"", buff);
0aabf8
-#endif
0aabf8
-				for (int i = 0 ; i < count ; i++) {
0aabf8
-					// assume file name
0aabf8
-					// operation = 0
0aabf8
-					if (buff[i] == '/') {
0aabf8
-						db_operation = ONE_FILE;
0aabf8
+					// nothing to read
0aabf8
+					if (res == -1)
0aabf8
 						break;
0aabf8
-					}
0aabf8
+					else if (res > 0) {
0aabf8
+						char* end  = strchr(buff, '\n');
0aabf8
 
0aabf8
-					if (buff[i] == '1') {
0aabf8
-						db_operation = RELOAD_DB;
0aabf8
-						break;
0aabf8
+						if (end == NULL) {
0aabf8
+							msg(LOG_ERR, "Too long line?");
0aabf8
+							continue;
0aabf8
+						}
0aabf8
+
0aabf8
+						int count = end - buff;
0aabf8
+
0aabf8
+						*end = '\0';
0aabf8
+
0aabf8
+						for (int i = 0 ; i < count ; i++) {
0aabf8
+							// assume file name
0aabf8
+							// operation = 0
0aabf8
+							if (buff[i] == '/') {
0aabf8
+								db_operation = ONE_FILE;
0aabf8
+								break;
0aabf8
+							}
0aabf8
+
0aabf8
+							if (buff[i] == '1') {
0aabf8
+								db_operation = RELOAD_DB;
0aabf8
+								break;
0aabf8
+							}
0aabf8
+
0aabf8
+							if (buff[i] == '2') {
0aabf8
+								db_operation = FLUSH_CACHE;
0aabf8
+								break;
0aabf8
+							}
0aabf8
+
0aabf8
+							if (isspace(buff[i]))
0aabf8
+								continue;
0aabf8
+
0aabf8
+							msg(LOG_ERR, "Cannot handle data \"%s\" from pipe", buff);
0aabf8
+							break;
0aabf8
+						}
0aabf8
+
0aabf8
+						*end = '\n';
0aabf8
+
0aabf8
+						// got "1" -> reload db
0aabf8
+						if (db_operation == RELOAD_DB) {
0aabf8
+							db_operation = DB_NO_OP;
0aabf8
+							msg(LOG_INFO,
0aabf8
+								"It looks like there was an update of the system... Syncing DB.");
0aabf8
+
0aabf8
+							backend_close();
0aabf8
+							backend_init(config);
0aabf8
+							backend_load(config);
0aabf8
+
0aabf8
+							if ((rc = update_database(config))) {
0aabf8
+								msg(LOG_ERR,
0aabf8
+									"Cannot update trust database!");
0aabf8
+								close(ffd[0].fd);
0aabf8
+								backend_close();
0aabf8
+								unlink_fifo();
0aabf8
+								exit(rc);
0aabf8
+							}
0aabf8
+
0aabf8
+							msg(LOG_INFO, "Updated");
0aabf8
+
0aabf8
+							// Conserve memory
0aabf8
+							backend_close();
0aabf8
+							// got "2" -> flush cache
0aabf8
+						} else if (db_operation == FLUSH_CACHE) {
0aabf8
+							db_operation = DB_NO_OP;
0aabf8
+							needs_flush = true;
0aabf8
+						} else if (db_operation == ONE_FILE) {
0aabf8
+							db_operation = DB_NO_OP;
0aabf8
+							if (handle_record(buff))
0aabf8
+								continue;
0aabf8
+						}
0aabf8
 					}
0aabf8
 
0aabf8
-					if (buff[i] == '2') {
0aabf8
-						db_operation = FLUSH_CACHE;
0aabf8
-						break;
0aabf8
-					}
0aabf8
-				}
0aabf8
-
0aabf8
-handle_db_ops:
0aabf8
-				// got "1" -> reload db
0aabf8
-				if (db_operation == RELOAD_DB) {
0aabf8
-					db_operation = DB_NO_OP;
0aabf8
-					msg(LOG_INFO,
0aabf8
-	    "It looks like there was an update of the system... Syncing DB.");
0aabf8
-
0aabf8
-					backend_close();
0aabf8
-					backend_init(config);
0aabf8
-					backend_load(config);
0aabf8
-
0aabf8
-					if ((rc = update_database(config))) {
0aabf8
-						msg(LOG_ERR,
0aabf8
-						   "Cannot update trust database!");
0aabf8
-						close(ffd[0].fd);
0aabf8
-						backend_close();
0aabf8
-						unlink_fifo();
0aabf8
-						exit(rc);
0aabf8
-					} else
0aabf8
-						msg(LOG_INFO, "Updated");
0aabf8
-
0aabf8
-					// Conserve memory
0aabf8
-					backend_close();
0aabf8
-				// got "2" -> flush cache
0aabf8
-				} else if (db_operation == FLUSH_CACHE) {
0aabf8
-					db_operation = DB_NO_OP;
0aabf8
-					needs_flush = true;
0aabf8
-				} else if (db_operation == ONE_FILE) {
0aabf8
-					db_operation = DB_NO_OP;
0aabf8
-					if (handle_record(buff))
0aabf8
-						continue;
0aabf8
-				}
0aabf8
+				} while(!fd_fgets_eof());
0aabf8
 			}
0aabf8
 		}
0aabf8
-
0aabf8
 	}
0aabf8
 
0aabf8
-err_out:
0aabf8
+finalize:
0aabf8
 	close(ffd[0].fd);
0aabf8
 	unlink_fifo();
0aabf8