git.samba.org
/
samba.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge fixes and tests for jra's broken strstr_m() function from 3.0
[samba.git]
/
source
/
lib
/
util_str.c
diff --git
a/source/lib/util_str.c
b/source/lib/util_str.c
index cad0df48a494adddf9bb08a462c1596dc2549c29..b8cf052862f3e07dd55992ad848f688f50903372 100644
(file)
--- a/
source/lib/util_str.c
+++ b/
source/lib/util_str.c
@@
-1306,6
+1306,14
@@
char *strstr_m(const char *src, const char *findstr)
char *s2;
char *retp;
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);
/* 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) {
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;
}
}
return (char *)s;
}
}
@@
-1325,7
+1336,9
@@
char *strstr_m(const char *src, const char *findstr)
if (!*s)
return NULL;
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
/* 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;
}
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;
}
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);
*p = 0;
if (pull_ucs2_allocate(&s2, src_w) == (size_t)-1) {
SAFE_FREE(src_w);