From 25eb4266048e6cfb63adf89037576be4077553f4 Mon Sep 17 00:00:00 2001 From: Kubat <mael.martin31@gmail.com> Date: Wed, 1 Dec 2021 16:37:29 +0100 Subject: [PATCH] DB: The 'unsigned int' version of config_get should be an octal version --- inc/lektor/database.h | 6 +++--- src/database/config.c | 19 +++++++++++++------ src/module/module_repo.c | 4 ++-- 3 files changed, 18 insertions(+), 11 deletions(-) diff --git a/inc/lektor/database.h b/inc/lektor/database.h index bec11fba..3cadd858 100644 --- a/inc/lektor/database.h +++ b/inc/lektor/database.h @@ -186,7 +186,7 @@ bool database_config_set_strv_1_2 (lkt_db *db, const char *section, const bool database_config_get_text (lkt_db *db, const char *section, const char *key, char *value, size_t len); bool database_config_get_text_nospace (lkt_db *db, const char *section, const char *key, char *value, size_t len); bool database_config_get_int (lkt_db *db, const char *section, const char *key, int *value); -bool database_config_get_uint (lkt_db *db, const char *section, const char *key, unsigned int *value); +bool database_config_get_octal (lkt_db *db, const char *section, const char *key, unsigned int *value); bool database_config_exists (lkt_db *db, const char *section, const char *key); bool database_config_queue (lkt_db *db, const char *option, int value); bool database_config_queue_default (lkt_db *db); @@ -201,8 +201,8 @@ void database_config_set_optional_fields(lkt_db *db); #define DBCONF_GET_INT(db, section, key, value) \ FAIL_UNLESS(database_config_get_int(db, section, key, value), \ "Failed to get config '%s/%s' from database", section, key); -#define DBCONF_GET_UINT(db, section, key, value) \ - FAIL_UNLESS(database_config_get_uint(db, section, key, value), \ +#define DBCONF_GET_OCTAL(db, section, key, value) \ + FAIL_UNLESS(database_config_get_octal(db, section, key, value), \ "Failed to get config '%s/%s' from database", section, key); /* Dump configuration to any stream, form is undefined, this function is here diff --git a/src/database/config.c b/src/database/config.c index 5bc62cc1..6771ce79 100644 --- a/src/database/config.c +++ b/src/database/config.c @@ -154,13 +154,20 @@ error: } bool -database_config_get_uint(lkt_db *db, const char *section, const char *key, unsigned int *value) +database_config_get_octal(lkt_db *db, const char *section, const char *key, unsigned int *value) { - int int_value; - const bool ret = database_config_get_int(db, section, key, &int_value); - FAIL_IF(int_value < 0, "Can't cast a negative value to unsigned int!"); - *value = (unsigned int)int_value; - return ret; + char str_value[LKT_LINE_MAX]; + unless (database_config_get_text_nospace(db, section, key, str_value, LKT_LINE_MAX)) + return false; + + const long octal = strtol(str_value, NULL, 8); + if (octal < 0 || octal > UINT_MAX) { + LOG_ERROR("DB", "The octal value is negative or to big for a uint!"); + return false; + } + + *value = (unsigned int)octal; + return true; } bool diff --git a/src/module/module_repo.c b/src/module/module_repo.c index a8420c05..a793aee7 100644 --- a/src/module/module_repo.c +++ b/src/module/module_repo.c @@ -438,7 +438,7 @@ ___handle_got_json_internal_callback(const char *key, const char *val, int comp, uint64_t filestamp = 0; bool magic_valid = 0; unsigned int umask = 0; - DBCONF_GET_UINT(kara->db, "database", "dir_permission", &umask); + DBCONF_GET_OCTAL(kara->db, "database", "dir_permission", &umask); /* Add the kara because it's not present */ kara->repo->craft_filename(kara->filename, kara, umask); @@ -473,7 +473,7 @@ ___handle_got_json_internal_callback(const char *key, const char *val, int comp, int current_id = 0; bool magic_valid = 0; unsigned int umask = 0; - DBCONF_GET_UINT(kara->db, "database", "dir_permission", &umask); + DBCONF_GET_OCTAL(kara->db, "database", "dir_permission", &umask); /* Timestamp and presence verification */ kara->repo->craft_filename(kara->filename, kara, umask); -- GitLab