From 3d6b38fab31fe6521d9b894095c0c0be0501d44d Mon Sep 17 00:00:00 2001 From: JinWang An Date: Fri, 18 Jun 2021 14:44:25 +0900 Subject: [PATCH] fix __get_date_and_time() to avoid buffer overflow Change-Id: Ib5151f08b4daf8a2cf6a0d35b3becb75d5545f64 Signed-off-by: JinWang An --- i18ninfo/i18ninfo.cpp | 5 ++++- tests/utc-capi-base-utils-udatepg.c | 10 ++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/i18ninfo/i18ninfo.cpp b/i18ninfo/i18ninfo.cpp index 4c7df5a..7daf794 100644 --- a/i18ninfo/i18ninfo.cpp +++ b/i18ninfo/i18ninfo.cpp @@ -547,12 +547,15 @@ static int __get_date_and_time(char *input_time) /* To get default time zone id */ i18n_timezone_h tmz; char *timezone_id; + int timezone_id_len = 0; i18n_uchar default_timezone_id[BUF_SIZE] = {0, }; ret = i18n_timezone_create_default(&tmz); CHECK_ERROR("18n_timezone_create_default", ret); ret = i18n_timezone_get_id(tmz, &timezone_id); - i18n_ustring_copy_ua_n(default_timezone_id, timezone_id, strlen(timezone_id)); + timezone_id_len = strlen(timezone_id); + i18n_ustring_copy_ua_n(default_timezone_id, timezone_id, + (timezone_id_len > BUF_SIZE - 1)? BUF_SIZE - 1 : timezone_id_len); int pattern_len, len; i18n_uchar pattern[BUF_SIZE], skeleton[BUF_SIZE]; diff --git a/tests/utc-capi-base-utils-udatepg.c b/tests/utc-capi-base-utils-udatepg.c index b30823c..943fd29 100644 --- a/tests/utc-capi-base-utils-udatepg.c +++ b/tests/utc-capi-base-utils-udatepg.c @@ -107,7 +107,9 @@ int utc_capi_base_utils_i18n_udatepg_get_best_pattern_p(void) { assert_neq(dtpg, NULL); const char *a_skeleton = "MMMdd"; + const char *b_skeleton = "MMMM"; i18n_uchar skeleton[SKELETON_LEN] = { 0, }; + i18n_uchar bskeleton[SKELETON_LEN] = { 0, }; i18n_uchar best_pattern[I18N_ret_LEN] = { 0, }; int skeleton_len; int best_pattern_len; @@ -121,6 +123,14 @@ int utc_capi_base_utils_i18n_udatepg_get_best_pattern_p(void) capacity, &best_pattern_len); assert_eq(ret, I18N_ERROR_NONE); + i18n_ustring_copy_ua(bskeleton, b_skeleton); + skeleton_len = i18n_ustring_get_length(bskeleton); + capacity = (int)(sizeof(best_pattern)/sizeof(best_pattern[0])); + + ret = i18n_udatepg_get_best_pattern(dtpg, bskeleton, skeleton_len, best_pattern, + capacity, &best_pattern_len); + assert_eq(ret, I18N_ERROR_NONE); + return 0; } -- 2.34.1