diff --git a/src/perm_permissions_table.c b/src/perm_permissions_table.c index d254013..3b5a8fd 100644 --- a/src/perm_permissions_table.c +++ b/src/perm_permissions_table.c @@ -27,6 +27,7 @@ const int column_count = 2; const char *const schema[] = {"executable", "filename"}; const char *const types[] = {"TEXT", "TEXT"}; uid_t ruid, euid, current_pid; +sqlite3_stmt *perm_check_statement = NULL; pthread_mutex_t uid_switch = PTHREAD_MUTEX_INITIALIZER; void set_db_fsuid() { @@ -141,6 +142,45 @@ int ensure_database_schema() { return 0; } +int prepare_sql_queries() { + const char *query_template = + "SELECT * FROM %s WHERE executable = ? AND filename = ?;"; + char *query_string = NULL; + int query_len = snprintf(NULL, 0, query_template, table_name) + 1; + + if (query_len < 0) { + fprintf(stderr, "Failed to prepare statement"); + perror(""); + return 1; + } + + query_string = malloc(query_len); + if (query_string == NULL) { + fprintf(stderr, "Failed to allocate memory for the query"); + perror(""); + return 1; + } + + int ret = snprintf(query_string, query_len, query_template, table_name); + if (ret < 0) { + fprintf(stderr, "Failed to prepare statement"); + perror(""); + free(query_string); + return 1; + } + + if (sqlite3_prepare_v2(perm_database, query_string, -1, &perm_check_statement, + NULL) != SQLITE_OK) { + fprintf(stderr, "Failed to prepare statement: %s\n", + sqlite3_errmsg(perm_database)); + free(query_string); + return 1; + } + free(query_string); + return 0; +} + +void free_sql_queries(void) { sqlite3_finalize(perm_check_statement); } /** * Initializes the permanent permissions table. * @@ -169,17 +209,24 @@ int init_perm_permissions_table(const char *db_filename) { int status = seteuid(ruid); if (status < 0) { - fprintf(stderr, "Couldn't set euid to ruid during database setup.\n"); + fprintf(stderr, "Couldn't set euid to ruid.\n"); exit(status); } + if (prepare_sql_queries()) { + fprintf(stderr, "Couldn't prepare sql queries.\n"); + exit(status); + } return 0; } /** * Destroys the permanent permissions table. */ -void destroy_perm_permissions_table() { sqlite3_close(perm_database); } +void destroy_perm_permissions_table(void) { + free_sql_queries(); + sqlite3_close(perm_database); +} /** * Checks if the process has a permanent access to the file.