diff options
author | Andrew Bartlett <abartlet@samba.org> | 2004-03-09 11:42:58 +0000 |
---|---|---|
committer | Andrew Bartlett <abartlet@samba.org> | 2004-03-09 11:42:58 +0000 |
commit | 6100210db96e8647c33b4bf67458ce55f28a53e1 (patch) | |
tree | 1ee6975361dba073536e2d6012dcd87d67ee9157 /source3/lib/util_str.c | |
parent | fe5801d065a140dc79bec3ff4c41024470ab5cfd (diff) | |
download | samba-6100210db96e8647c33b4bf67458ce55f28a53e1.tar.gz samba-6100210db96e8647c33b4bf67458ce55f28a53e1.tar.bz2 samba-6100210db96e8647c33b4bf67458ce55f28a53e1.zip |
Merge fixes and tests for jra's broken strstr_m() function from 3.0
STF rules! (Pity we don't use it for more stuff)
Andrew Bartlett
(This used to be commit a9363b45b0ef652a5fd621915fafb97ada0c7d5e)
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); |