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 | |
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)
-rw-r--r-- | source3/Makefile.in | 5 | ||||
-rw-r--r-- | source3/lib/util_str.c | 26 | ||||
-rwxr-xr-x | source3/stf/strings.py | 44 | ||||
-rw-r--r-- | source3/torture/t_strstr.c | 35 |
4 files changed, 102 insertions, 8 deletions
diff --git a/source3/Makefile.in b/source3/Makefile.in index 5792b00264..0008a85f75 100644 --- a/source3/Makefile.in +++ b/source3/Makefile.in @@ -1218,6 +1218,9 @@ bin/tdbdump@EXEEXT@: $(TDBDUMP_OBJ) bin/.dummy bin/t_strcmp@EXEEXT@: bin/libbigballofmud.@SHLIBEXT@ torture/t_strcmp.o $(CC) $(FLAGS) -o $@ $(LIBS) torture/t_strcmp.o -L ./bin -lbigballofmud +bin/t_strstr@EXEEXT@: bin/libbigballofmud.@SHLIBEXT@ torture/t_strstr.o + $(CC) $(FLAGS) -o $@ $(LIBS) torture/t_strstr.o -L ./bin -lbigballofmud + bin/t_stringoverflow@EXEEXT@: bin/libbigballofmud.@SHLIBEXT@ torture/t_stringoverflow.o $(CC) $(FLAGS) -o $@ torture/t_stringoverflow.o -L./bin -lbigballofmud @@ -1511,4 +1514,4 @@ check: check-programs # These are called by the test suite and need to be built before # running it. For the time being we don't build all of BIN_PROGS, # because they're not all needed. -check-programs: bin/t_strcmp bin/t_push_ucs2 bin/smbcontrol bin/t_snprintf +check-programs: bin/t_strcmp bin/t_strstr bin/t_push_ucs2 bin/smbcontrol bin/t_snprintf 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); diff --git a/source3/stf/strings.py b/source3/stf/strings.py index 328849b1ce..86f7acdeb4 100755 --- a/source3/stf/strings.py +++ b/source3/stf/strings.py @@ -94,8 +94,52 @@ class StrCaseCmp(comfychair.TestCase): for a, b, expect in cases: self.run_strcmp(a, b, expect) +class strstr_m(comfychair.TestCase): + """String comparisons in simple ASCII""" + def run_strstr(self, a, b, expect): + out, err = self.runcmd('t_strstr \"%s\" \"%s\"' % (a.encode('utf-8'), b.encode('utf-8'))) + if (out != (expect + '\n').encode('utf-8')): + self.fail("comparison failed:\n" + " a=%s\n" + " b=%s\n" + " expected=%s\n" + " result=%s\n" % (`a`, `b`, `expect+'\n'`, `out`)) + + def runtest(self): + # A, B, strstr_m(A, B) + cases = [('hello', 'hello', 'hello'), + ('hello', 'goodbye', '(null)'), + ('goodbye', 'hello', '(null)'), + ('hell', 'hello', '(null)'), + ('hello', 'hell', 'hello'), + ('', '', ''), + ('a', '', 'a'), + ('', 'a', '(null)'), + ('a', 'A', '(null)'), + ('aa', 'aA', '(null)'), + ('Aa', 'aa', '(null)'), + ('%v foo', '%v', '%v foo'), + ('foo %v foo', '%v', '%v foo'), + ('foo %v', '%v', '%v'), + ('longstring ' * 100, 'longstring ' * 99, 'longstring ' * 100), + ('longstring ' * 99, 'longstring ' * 100, '(null)'), + ('longstring a' * 99, 'longstring ' * 100 + 'a', '(null)'), + ('longstring ' * 100 + 'a', 'longstring ' * 100, 'longstring ' * 100 + 'a'), + (KATAKANA_LETTER_A, KATAKANA_LETTER_A + 'bcd', '(null)'), + (KATAKANA_LETTER_A + 'bcde', KATAKANA_LETTER_A + 'bcd', KATAKANA_LETTER_A + 'bcde'), + ('d'+KATAKANA_LETTER_A + 'bcd', KATAKANA_LETTER_A + 'bcd', KATAKANA_LETTER_A + 'bcd'), + ('d'+KATAKANA_LETTER_A + 'bd', KATAKANA_LETTER_A + 'bcd', '(null)'), + + ('e'+KATAKANA_LETTER_A + 'bcdf', KATAKANA_LETTER_A + 'bcd', KATAKANA_LETTER_A + 'bcdf'), + (KATAKANA_LETTER_A, KATAKANA_LETTER_A + 'bcd', '(null)'), + (KATAKANA_LETTER_A*3, 'a', '(null)'), + ] + for a, b, expect in cases: + self.run_strstr(a, b, expect) + # Define the tests exported by this module tests = [StrCaseCmp, + strstr_m, PushUCS2_Tests] # Handle execution of this file as a main program diff --git a/source3/torture/t_strstr.c b/source3/torture/t_strstr.c new file mode 100644 index 0000000000..25709526fe --- /dev/null +++ b/source3/torture/t_strstr.c @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2003 by Martin Pool + * + * Test harness for strstr_m + */ + +#include "includes.h" + +int main(int argc, char *argv[]) +{ + int i; + int iters = 1; + + char *ret; + + /* Needed to initialize character set */ + lp_load("/dev/null", True, False, False); + + if (argc < 3) { + fprintf(stderr, "usage: %s STRING1 STRING2 [ITERS]\n" + "Compares two strings, prints the results of strstr_m\n", + argv[0]); + return 2; + } + if (argc >= 4) + iters = atoi(argv[3]); + + for (i = 0; i < iters; i++) { + ret = strstr_m(argv[1], argv[2]); + } + + printf("%s\n", ret); + + return 0; +} |