Tried making the perm permissions faster by perparing queries

This commit is contained in:
fedir 2025-04-14 18:47:56 +02:00
parent 1bc25af6f1
commit 6fd6907121
Signed by: fedir
GPG Key ID: C959EE85F0C9362C

View File

@ -27,6 +27,7 @@ const int column_count = 2;
const char *const schema[] = {"executable", "filename"}; const char *const schema[] = {"executable", "filename"};
const char *const types[] = {"TEXT", "TEXT"}; const char *const types[] = {"TEXT", "TEXT"};
uid_t ruid, euid, current_pid; uid_t ruid, euid, current_pid;
sqlite3_stmt *perm_check_statement = NULL;
pthread_mutex_t uid_switch = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t uid_switch = PTHREAD_MUTEX_INITIALIZER;
void set_db_fsuid() { void set_db_fsuid() {
@ -141,6 +142,45 @@ int ensure_database_schema() {
return 0; 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. * Initializes the permanent permissions table.
* *
@ -169,17 +209,24 @@ int init_perm_permissions_table(const char *db_filename) {
int status = seteuid(ruid); int status = seteuid(ruid);
if (status < 0) { 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); exit(status);
} }
if (prepare_sql_queries()) {
fprintf(stderr, "Couldn't prepare sql queries.\n");
exit(status);
}
return 0; return 0;
} }
/** /**
* Destroys the permanent permissions table. * 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. * Checks if the process has a permanent access to the file.