Prevent buffer overflow on reading value 85/236785/1 accepted/tizen_5.5_unified accepted/tizen_5.5_unified_wearable_hotfix tizen_5.5 tizen_5.5_wearable_hotfix accepted/tizen/5.5/unified/20200625.165523 accepted/tizen/5.5/unified/wearable/hotfix/20201027.121457 submit/tizen_5.5/20200622.060545 submit/tizen_5.5/20200625.012015 submit/tizen_5.5_wearable_hotfix/20201026.184302
authorKichan Kwon <k_c.kwon@samsung.com>
Mon, 22 Jun 2020 03:30:38 +0000 (12:30 +0900)
committerKichan Kwon <k_c.kwon@samsung.com>
Mon, 22 Jun 2020 05:51:46 +0000 (14:51 +0900)
Change-Id: I4a6d5abce72c4f2165a0d190068ef75157cf4c35
Signed-off-by: Kichan Kwon <k_c.kwon@samsung.com>
src/init_db/system_info_db_init.c
src/system_info.c

index 7e62ac2fb20827dd7c619874ccc093954cc95546..b4efa8ab01494ac2f485701491527a82d93b8dd6 100644 (file)
@@ -175,6 +175,7 @@ static int db_get_value(const char *db_path, char *tag, char *name, char *type,
        char key_internal[KEY_MAX];
        size_t key_internal_len;
        char buf[PATH_MAX];
+       size_t value_internal_len;
        char *ptr;
        FILE *fp = NULL;
 
@@ -196,7 +197,9 @@ static int db_get_value(const char *db_path, char *tag, char *name, char *type,
        key_internal_len = strlen(key_internal);
        while ((ptr = fgets(buf, sizeof(buf), fp))) {
                if (!strncmp(buf, key_internal, key_internal_len) && buf[key_internal_len] == ' ') {
-                       sscanf(buf, "%*s %[^\n]s", value);
+                       value_internal_len = strcspn(buf + key_internal_len + 1, "\n") + 1;
+                       snprintf(value, val_len < value_internal_len ? val_len : value_internal_len,
+                                       "%s", buf + key_internal_len + 1);
                        break;
                }
        }
@@ -217,7 +220,7 @@ static int db_set_value_specific_runtime(const char *db_path, char *tag, char *n
        char value_intg[LANG_MAX + 1] = {0};
        int ret;
 
-       ret = db_get_value(db_path, tag, name, type, value_intg, LANG_MAX);
+       ret = db_get_value(db_path, tag, name, type, value_intg, LANG_MAX + 1);
        if (ret != 0)
                return ret;
 
index d02b5594e01135bbc18dcf69bed8b9906cb4c886..cfd2c93c7b2bb11fb0fe2a2764274f2ae091ae2d 100644 (file)
@@ -80,6 +80,7 @@ static int db_get_value(enum tag_type tag, const char *key,
        char key_internal[KEY_MAX];
        size_t key_internal_len;
        char buf[PATH_MAX];     // buffer size should be larger than KEY_MAX
+       size_t value_internal_len;
        FILE *fp = NULL;
        int ret;
        char *tag_s;
@@ -134,7 +135,9 @@ static int db_get_value(enum tag_type tag, const char *key,
        key_internal_len = strlen(key_internal);
        while ((temp = fgets(buf, sizeof(buf), fp))) {
                if (!strncmp(buf, key_internal, key_internal_len) && buf[key_internal_len] == ' ') {
-                       sscanf(buf, "%*s %[^\n]s", value);
+                       value_internal_len = strcspn(buf + key_internal_len + 1, "\n") + 1;
+                       snprintf(value, len < value_internal_len ? len : value_internal_len,
+                                       "%s", buf + key_internal_len + 1);
                        break;
                }
        }