diff options
Diffstat (limited to 'source3/lib/util_str.c')
-rw-r--r-- | source3/lib/util_str.c | 26 |
1 files changed, 19 insertions, 7 deletions
diff --git a/source3/lib/util_str.c b/source3/lib/util_str.c index cad0df48a4..b8cf052862 100644 --- a/source3/lib/util_str.c +++ b/source3/lib/util_str.c @@ -1306,6 +1306,14 @@ char *strstr_m(const char *src, const char *findstr) char *s2; char *retp; + size_t findstr_len = 0; + size_t find_w_len; + + /* for correctness */ + if (!findstr[0]) { + return src; + } + /* Samba does single character findstr calls a *lot*. */ if (findstr[1] == '\0') return strchr_m(src, *findstr); @@ -1316,7 +1324,10 @@ char *strstr_m(const char *src, const char *findstr) for (s = src; *s && !(((unsigned char)s[0]) & 0x80); s++) { if (*s == *findstr) { - if (strcmp(s, findstr) == 0) { + if (!findstr_len) + findstr_len = strlen(findstr); + + if (strncmp(s, findstr, findstr_len) == 0) { return (char *)s; } } @@ -1325,7 +1336,9 @@ char *strstr_m(const char *src, const char *findstr) if (!*s) return NULL; -#ifdef BROKEN_UNICODE_COMPOSE_CHARACTERS +#if 1 /* def BROKEN_UNICODE_COMPOSE_CHARACTERS */ + /* 'make check' fails unless we do this */ + /* With compose characters we must restart from the beginning. JRA. */ s = src; #endif @@ -1340,16 +1353,15 @@ char *strstr_m(const char *src, const char *findstr) DEBUG(0,("strstr_m: find malloc fail\n")); return NULL; } - - for (p = src_w; (p = strchr_w(p, *find_w)) != NULL; p++) { - if (strcmp_w(p, find_w) == 0) - break; - } + + p = strstr_w(src_w, find_w); + if (!p) { SAFE_FREE(src_w); SAFE_FREE(find_w); return NULL; } + *p = 0; if (pull_ucs2_allocate(&s2, src_w) == (size_t)-1) { SAFE_FREE(src_w); |