From f970dd24fce3afce8a30d7db1201c7461ac30f97 Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Thu, 29 Dec 2022 16:34:14 +0800 Subject: [PATCH] fix(query): fix the invalid access. --- include/util/tutil.h | 4 ++++ source/util/src/tcompare.c | 17 +++++++++-------- source/util/src/tutil.c | 24 ++++++++++++++++++++++++ source/util/test/utilTests.cpp | 30 ++++++++++++++++++++++++++++++ 4 files changed, 67 insertions(+), 8 deletions(-) diff --git a/include/util/tutil.h b/include/util/tutil.h index 9f36cdba7c..9fb68aebdc 100644 --- a/include/util/tutil.h +++ b/include/util/tutil.h @@ -29,12 +29,16 @@ extern "C" { int32_t strdequote(char *src); size_t strtrim(char *src); char *strnchr(const char *haystack, char needle, int32_t len, bool skipquote); +TdUcs4* wcsnchr(const TdUcs4* haystack, TdUcs4 needle, size_t len); + char **strsplit(char *src, const char *delim, int32_t *num); char *strtolower(char *dst, const char *src); char *strntolower(char *dst, const char *src, int32_t n); char *strntolower_s(char *dst, const char *src, int32_t n); int64_t strnatoi(char *num, int32_t len); + size_t tstrncspn(const char *str, size_t ssize, const char *reject, size_t rsize); +size_t twcsncspn(const TdUcs4 *wcs, size_t size, const TdUcs4 *reject, size_t rsize); char *strbetween(char *string, char *begin, char *end); char *paGetToken(char *src, char **token, int32_t *tokenLen); diff --git a/source/util/src/tcompare.c b/source/util/src/tcompare.c index 54b6d6d265..62ccd2c50f 100644 --- a/source/util/src/tcompare.c +++ b/source/util/src/tcompare.c @@ -998,6 +998,7 @@ int32_t compareUint64Uint32(const void *pLeft, const void *pRight) { } int32_t compareJsonValDesc(const void *pLeft, const void *pRight) { return compareJsonVal(pRight, pLeft); } + /* * Compare two strings * TSDB_MATCH: Match @@ -1055,10 +1056,10 @@ int32_t patternMatch(const char *pattern, size_t psize, const char *str, size_t return TSDB_PATTERN_NOWILDCARDMATCH; } - c1 = str[j++]; - ++nMatchChar; + if (j < ssize) { + c1 = str[j++]; + ++nMatchChar; - if (j <= ssize) { if (c == '\\' && pattern[i] == '_' && c1 == '_') { i++; continue; @@ -1099,12 +1100,12 @@ int32_t wcsPatternMatch(const TdUcs4 *pattern, size_t psize, const TdUcs4 *str, return TSDB_PATTERN_MATCH; } - TdUcs4 acceptArray[3] = {towupper(c), towlower(c), 0}; + TdUcs4 rejectList[2] = {towupper(c), towlower(c)}; str += nMatchChar; int32_t remain = ssize - nMatchChar; while (1) { - size_t n = wcscspn(str, acceptArray); + size_t n = twcsncspn(str, remain, rejectList, 2); str += n; remain -= n; @@ -1122,10 +1123,10 @@ int32_t wcsPatternMatch(const TdUcs4 *pattern, size_t psize, const TdUcs4 *str, return TSDB_PATTERN_NOWILDCARDMATCH; } - c1 = str[j++]; - nMatchChar++; + if (j < ssize) { + c1 = str[j++]; + nMatchChar++; - if (j <= ssize) { if (c == L'\\' && pattern[i] == L'_' && c1 == L'_') { i++; continue; diff --git a/source/util/src/tutil.c b/source/util/src/tutil.c index 7297849870..cf1d3be3a6 100644 --- a/source/util/src/tutil.c +++ b/source/util/src/tutil.c @@ -144,6 +144,16 @@ char *strnchr(const char *haystack, char needle, int32_t len, bool skipquote) { return NULL; } +TdUcs4* wcsnchr(const TdUcs4* haystack, TdUcs4 needle, size_t len) { + for(int32_t i = 0; i < len; ++i) { + if (haystack[i] == needle) { + return (TdUcs4*) &haystack[i]; + } + } + + return NULL; +} + char *strtolower(char *dst, const char *src) { int32_t esc = 0; char quote = 0, *p = dst, c; @@ -432,3 +442,17 @@ size_t tstrncspn(const char *str, size_t size, const char *reject, size_t rsize) return size; } + +size_t twcsncspn(const TdUcs4 *wcs, size_t size, const TdUcs4 *reject, size_t rsize) { + if (rsize == 0 || rsize == 1) { + TdUcs4* p = wcsnchr(wcs, reject[0], size); + return (p == NULL)? size:(p-wcs); + } + + size_t index = 0; + while ((index < size) && (wcsnchr(reject, wcs[index], rsize) == NULL)) { + ++index; + } + + return index; +} diff --git a/source/util/test/utilTests.cpp b/source/util/test/utilTests.cpp index 5ab93bedd3..c56ef348cc 100644 --- a/source/util/test/utilTests.cpp +++ b/source/util/test/utilTests.cpp @@ -61,6 +61,21 @@ TEST(utilTest, wchar_pattern_match_test) { const TdWchar* str9 = L"6_66"; ret = wcsPatternMatch(reinterpret_cast(pattern9), 6, reinterpret_cast(str9), wcslen(str9), &pInfo); ASSERT_EQ(ret, TSDB_PATTERN_MATCH); + + const TdWchar* pattern10 = L"%"; + const TdWchar* str10 = L""; + ret = wcsPatternMatch(reinterpret_cast(pattern10), 1, reinterpret_cast(str10), 0, &pInfo); + ASSERT_EQ(ret, TSDB_PATTERN_MATCH); + + const TdWchar* pattern11 = L"china%"; + const TdWchar* str11 = L"CHI "; + ret = wcsPatternMatch(reinterpret_cast(pattern11), 6, reinterpret_cast(str11), 3, &pInfo); + ASSERT_EQ(ret, TSDB_PATTERN_NOMATCH); + + const TdWchar* pattern12 = L"abc%"; + const TdWchar* str12 = L""; + ret = wcsPatternMatch(reinterpret_cast(pattern12), 4, reinterpret_cast(str12), 0, &pInfo); + ASSERT_EQ(ret, TSDB_PATTERN_NOMATCH); } TEST(utilTest, wchar_pattern_match_no_terminated) { @@ -174,6 +189,21 @@ TEST(utilTest, char_pattern_match_test) { const char* str9 = "6_6"; ret = patternMatch(pattern9, 5, str9, strlen(str9), &pInfo); ASSERT_EQ(ret, TSDB_PATTERN_MATCH); + + const char* pattern10 = "%"; + const char* str10 = " "; + ret = patternMatch(pattern10, 1, str10, 0, &pInfo); + ASSERT_EQ(ret, TSDB_PATTERN_MATCH); + + const char* pattern11 = "china%"; + const char* str11 = "abc "; + ret = patternMatch(pattern11, 6, str11, 3, &pInfo); + ASSERT_EQ(ret, TSDB_PATTERN_NOMATCH); + + const char* pattern12 = "abc%"; + const char* str12 = NULL; + ret = patternMatch(pattern12, 4, str12, 0, &pInfo); + ASSERT_EQ(ret, TSDB_PATTERN_NOMATCH); } TEST(utilTest, char_pattern_match_no_terminated) { -- GitLab