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