diff --git a/inc/lektor/database.h b/inc/lektor/database.h index bec11fba6383ea4c890ce6e822b5a1e988839675..3cadd8588df948fbe392773657ccd53ab3628e38 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 5bc62cc1def1cdab6d32bf1a9d1ca44216663d00..6771ce792b827db77cbfe5a01ab2d7b2cd79df01 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 a8420c0552001f33b805b5e9031da8d63bb470fd..a793aee7c7a82948bbac1185fb910fdc01e049dc 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);