From a064261e854317bcc48aab31f86f3cbee67855c3 Mon Sep 17 00:00:00 2001 From: Ivan Nardi <12729895+IvanNardi@users.noreply.github.com> Date: Sat, 11 May 2024 23:37:31 +0200 Subject: Revert `ndpi_strnstr()` optimization introduced in a813121e0 (#2439) New implementation fails tests 11b, 12 and 13. Revert to the original (BSD) implementation (with also some basic parameters check) --- example/ndpiReader.c | 10 ++++++++++ src/lib/ndpi_main.c | 51 ++++++++++++++++++--------------------------------- 2 files changed, 28 insertions(+), 33 deletions(-) diff --git a/example/ndpiReader.c b/example/ndpiReader.c index 7a326f71b..cf26d0841 100644 --- a/example/ndpiReader.c +++ b/example/ndpiReader.c @@ -5691,6 +5691,16 @@ void strnstrUnitTest(void) { /* Test 10: substring equal to the string */ assert(strcmp(ndpi_strnstr("string", "string", 6), "string") == 0); + + /* Test 11a,b: max_length bigger that string length */ + assert(strcmp(ndpi_strnstr("string", "string", 66), "string") == 0); + assert(ndpi_strnstr("string", "a", 66) == NULL); + + /* Test 12: substring longer than the string */ + assert(ndpi_strnstr("string", "stringA", 6) == NULL); + + /* Test 13 */ + assert(ndpi_strnstr("abcdef", "abc", 2) == NULL); } /* *********************************************** */ diff --git a/src/lib/ndpi_main.c b/src/lib/ndpi_main.c index f15d0cb8f..eb5959dd6 100644 --- a/src/lib/ndpi_main.c +++ b/src/lib/ndpi_main.c @@ -9687,42 +9687,27 @@ void ndpi_dump_risks_score(FILE *risk_out) { * first slen characters of s. */ char *ndpi_strnstr(const char *s, const char *find, size_t slen) { - if (s == NULL || find == NULL || slen == 0) { - return NULL; - } - - char c = *find; - - if (c == '\0') { - return (char *)s; - } - - if (*(find + 1) == '\0') { - return (char *)memchr(s, c, slen); - } - - size_t find_len = strnlen(find, slen); + char c; + size_t len; - if (find_len > slen) { + if(s == NULL || find == NULL || slen == 0) return NULL; - } - const char *end = s + slen - find_len; - - while (s <= end) { - if (memcmp(s, find, find_len) == 0) { - return (char *)s; - } - - size_t remaining_length = end - s; - s = (char *)memchr(s + 1, c, remaining_length); - - if (s == NULL || s > end) { - return NULL; - } - } - - return NULL; + if((c = *find++) != '\0') { + len = strnlen(find, slen); + do { + char sc; + + do { + if(slen-- < 1 || (sc = *s++) == '\0') + return(NULL); + } while(sc != c); + if(len > slen) + return(NULL); + } while(strncmp(s, find, len) != 0); + s--; + } + return((char *) s); } /* ****************************************************** */ -- cgit v1.2.3