From b550c93884af68a2ac9c5c7aa4e3226e614dccd7 Mon Sep 17 00:00:00 2001 From: fedir Date: Tue, 20 May 2025 11:07:28 +0200 Subject: [PATCH] Fixed arbitrary permission order --- src/temp_permissions_table.c | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/src/temp_permissions_table.c b/src/temp_permissions_table.c index f483d2c..d2ffa4d 100644 --- a/src/temp_permissions_table.c +++ b/src/temp_permissions_table.c @@ -192,26 +192,32 @@ access_t check_temp_access_noparent(const char *filename, pid_t pid) { // the process is the same as the one that was granted temporary access // to the file size_t filename_len = strlen(filename); + access_t ret = NDEF; + size_t maxlen = 0; for_each(&permission_entry->denied_files, denied_file) { size_t denied_file_len = strlen(*denied_file); - if (strncmp(*denied_file, filename, denied_file_len) == 0 && - ((denied_file_len < filename_len && - (*denied_file)[denied_file_len - 1] == '/') || - (denied_file_len == filename_len))) { - pthread_rwlock_unlock(&temp_permissions_table_lock); - return DENY; + if ((strncmp(*denied_file, filename, denied_file_len) == 0 && + ((denied_file_len < filename_len && + (*denied_file)[denied_file_len - 1] == '/') || + (denied_file_len == filename_len))) && + denied_file_len > maxlen) { + maxlen = denied_file_len; + ret = DENY; } } for_each(&permission_entry->allowed_files, allowed_file) { size_t allowed_file_len = strlen(*allowed_file); - if (strncmp(*allowed_file, filename, allowed_file_len) == 0 && - ((allowed_file_len < filename_len && - (*allowed_file)[allowed_file_len - 1] == '/') || - (allowed_file_len == filename_len))) { - pthread_rwlock_unlock(&temp_permissions_table_lock); - return ALLOW; + if ((strncmp(*allowed_file, filename, allowed_file_len) == 0 && + ((allowed_file_len < filename_len && + (*allowed_file)[allowed_file_len - 1] == '/') || + (allowed_file_len == filename_len))) && + allowed_file > maxlen) { + maxlen = allowed_file_len; + ret = ALLOW; } } + pthread_rwlock_unlock(&temp_permissions_table_lock); + return ret; } } pthread_rwlock_unlock(&temp_permissions_table_lock);