From 32591162b48bc7c9b8fc4d6ed848ccb641959474 Mon Sep 17 00:00:00 2001 From: Ganlin Zhao Date: Thu, 9 Jun 2022 17:17:10 +0800 Subject: [PATCH 1/2] fix(query): add to_iso8601 function timezone validation TD-16372 --- source/libs/function/src/builtins.c | 47 +++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/source/libs/function/src/builtins.c b/source/libs/function/src/builtins.c index eca4587c03..b628128670 100644 --- a/source/libs/function/src/builtins.c +++ b/source/libs/function/src/builtins.c @@ -1020,6 +1020,22 @@ static int32_t translateCast(SFunctionNode* pFunc, char* pErrBuf, int32_t len) { * */ +static bool validateHourRange(int8_t hour) { + if (hour < 0 || hour > 12) { + return false; + } + + return true; +} + +static bool validateMinuteRange(int8_t hour, int8_t minute) { + if (minute == 0 || (minute == 30 && (hour == 3 || hour == 5))) { + return true; + } + + return false; +} + static bool validateTimezoneFormat(const SValueNode* pVal) { if (TSDB_DATA_TYPE_BINARY != pVal->node.resType.type) { return false; @@ -1028,6 +1044,8 @@ static bool validateTimezoneFormat(const SValueNode* pVal) { char* tz = varDataVal(pVal->datum.p); int32_t len = varDataLen(pVal->datum.p); + char buf[3] = {0}; + int8_t hour = -1, minute = -1; if (len == 0) { return false; } else if (len == 1 && (tz[0] == 'z' || tz[0] == 'Z')) { @@ -1040,6 +1058,20 @@ static bool validateTimezoneFormat(const SValueNode* pVal) { if (!isdigit(tz[i])) { return false; } + + if (i == 2) { + memcpy(buf, &tz[i - 1], 2); + hour = taosStr2Int8(buf, NULL, 10); + if (!validateHourRange(hour)) { + return false; + } + } else if (i == 4) { + memcpy(buf, &tz[i - 1], 2); + minute = taosStr2Int8(buf, NULL, 10); + if (!validateMinuteRange(hour, minute)) { + return false; + } + } } break; } @@ -1051,9 +1083,24 @@ static bool validateTimezoneFormat(const SValueNode* pVal) { } continue; } + if (!isdigit(tz[i])) { return false; } + + if (i == 2) { + memcpy(buf, &tz[i - 1], 2); + hour = taosStr2Int8(buf, NULL, 10); + if (!validateHourRange(hour)) { + return false; + } + } else if (i == 5) { + memcpy(buf, &tz[i - 1], 2); + minute = taosStr2Int8(buf, NULL, 10); + if (!validateMinuteRange(hour, minute)) { + return false; + } + } } break; } From cbfa116d069c10a42360bcd6504e4080d2d236be Mon Sep 17 00:00:00 2001 From: Ganlin Zhao Date: Thu, 9 Jun 2022 17:17:10 +0800 Subject: [PATCH 2/2] fix(query): add to_iso8601 function timezone validation TD-16372 --- source/libs/function/src/builtins.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source/libs/function/src/builtins.c b/source/libs/function/src/builtins.c index b628128670..04b171b9af 100644 --- a/source/libs/function/src/builtins.c +++ b/source/libs/function/src/builtins.c @@ -1028,8 +1028,8 @@ static bool validateHourRange(int8_t hour) { return true; } -static bool validateMinuteRange(int8_t hour, int8_t minute) { - if (minute == 0 || (minute == 30 && (hour == 3 || hour == 5))) { +static bool validateMinuteRange(int8_t hour, int8_t minute, char sign) { + if (minute == 0 || (minute == 30 && (hour == 3 || hour == 5) && sign == '-')) { return true; } @@ -1068,7 +1068,7 @@ static bool validateTimezoneFormat(const SValueNode* pVal) { } else if (i == 4) { memcpy(buf, &tz[i - 1], 2); minute = taosStr2Int8(buf, NULL, 10); - if (!validateMinuteRange(hour, minute)) { + if (!validateMinuteRange(hour, minute, tz[0])) { return false; } } @@ -1097,7 +1097,7 @@ static bool validateTimezoneFormat(const SValueNode* pVal) { } else if (i == 5) { memcpy(buf, &tz[i - 1], 2); minute = taosStr2Int8(buf, NULL, 10); - if (!validateMinuteRange(hour, minute)) { + if (!validateMinuteRange(hour, minute, tz[0])) { return false; } }