diff -up ./src/daemon/fapolicyd.c.sighup ./src/daemon/fapolicyd.c --- ./src/daemon/fapolicyd.c.sighup 2022-06-21 16:55:47.000000000 +0200 +++ ./src/daemon/fapolicyd.c 2022-08-04 11:07:10.245069443 +0200 @@ -527,6 +527,7 @@ int main(int argc, const char *argv[]) while (!stop) { if (hup) { hup = 0; + msg(LOG_INFO, "Got SIGHUP"); reconfigure(); } rc = poll(pfd, 2, -1); diff -up ./src/library/database.c.sighup ./src/library/database.c --- ./src/library/database.c.sighup 2022-08-04 11:07:10.237069609 +0200 +++ ./src/library/database.c 2022-08-04 11:08:44.852057119 +0200 @@ -68,7 +68,7 @@ static int lib_symlink=0, lib64_symlink= static struct pollfd ffd[1] = { {0, 0, 0} }; static const char *fifo_path = "/run/fapolicyd/fapolicyd.fifo"; static integrity_t integrity; -static atomic_int db_operation; +static atomic_int reload_db = 0; static pthread_t update_thread; static pthread_mutex_t update_lock; @@ -1147,7 +1147,31 @@ static int handle_record(const char * bu void update_trust_database(void) { - db_operation = RELOAD_DB; + reload_db = 1; +} + +static void do_reload_db(conf_t* config) +{ + msg(LOG_INFO,"It looks like there was an update of the system... Syncing DB."); + + int rc; + backend_close(); + backend_init(config); + backend_load(config); + + if ((rc = update_database(config))) { + msg(LOG_ERR, + "Cannot update trust database!"); + close(ffd[0].fd); + backend_close(); + unlink_fifo(); + exit(rc); + } + + msg(LOG_INFO, "Updated"); + + // Conserve memory + backend_close(); } static void *update_thread_main(void *arg) @@ -1158,6 +1182,8 @@ static void *update_thread_main(void *ar char err_buff[BUFFER_SIZE]; conf_t *config = (conf_t *)arg; + int do_operation = DB_NO_OP;; + #ifdef DEBUG msg(LOG_DEBUG, "Update thread main started"); #endif @@ -1182,6 +1208,12 @@ static void *update_thread_main(void *ar rc = poll(ffd, 1, 1000); + // got SIGHUP + if (reload_db) { + reload_db = 0; + do_reload_db(config); + } + #ifdef DEBUG msg(LOG_DEBUG, "Update poll interrupted"); #endif @@ -1228,17 +1260,17 @@ static void *update_thread_main(void *ar // assume file name // operation = 0 if (buff[i] == '/') { - db_operation = ONE_FILE; + do_operation = ONE_FILE; break; } if (buff[i] == '1') { - db_operation = RELOAD_DB; + do_operation = RELOAD_DB; break; } if (buff[i] == '2') { - db_operation = FLUSH_CACHE; + do_operation = FLUSH_CACHE; break; } @@ -1252,34 +1284,16 @@ static void *update_thread_main(void *ar *end = '\n'; // got "1" -> reload db - if (db_operation == RELOAD_DB) { - db_operation = DB_NO_OP; - msg(LOG_INFO, - "It looks like there was an update of the system... Syncing DB."); - - backend_close(); - backend_init(config); - backend_load(config); - - if ((rc = update_database(config))) { - msg(LOG_ERR, - "Cannot update trust database!"); - close(ffd[0].fd); - backend_close(); - unlink_fifo(); - exit(rc); - } - - msg(LOG_INFO, "Updated"); + if (do_operation == RELOAD_DB) { + do_operation = DB_NO_OP; + do_reload_db(config); - // Conserve memory - backend_close(); // got "2" -> flush cache - } else if (db_operation == FLUSH_CACHE) { - db_operation = DB_NO_OP; + } else if (do_operation == FLUSH_CACHE) { + do_operation = DB_NO_OP; needs_flush = true; - } else if (db_operation == ONE_FILE) { - db_operation = DB_NO_OP; + } else if (do_operation == ONE_FILE) { + do_operation = DB_NO_OP; if (handle_record(buff)) continue; }