diff options
-rw-r--r-- | source3/Makefile.in | 5 | ||||
-rw-r--r-- | source3/lib/util_str.c | 18 | ||||
-rwxr-xr-x | source3/stf/strings.py | 44 | ||||
-rw-r--r-- | source3/torture/t_strstr.c | 35 |
4 files changed, 94 insertions, 8 deletions
diff --git a/source3/Makefile.in b/source3/Makefile.in index 4699926012..5cb2f92628 100644 --- a/source3/Makefile.in +++ b/source3/Makefile.in @@ -1198,6 +1198,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 @@ -1476,4 +1479,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 7f3c30f61e..b8cf052862 100644 --- a/source3/lib/util_str.c +++ b/source3/lib/util_str.c @@ -1309,6 +1309,11 @@ char *strstr_m(const char *src, const char *findstr) 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); @@ -1331,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 @@ -1346,18 +1353,15 @@ char *strstr_m(const char *src, const char *findstr) DEBUG(0,("strstr_m: find malloc fail\n")); return NULL; } - - find_w_len = strlen_w(find_w); - for (p = src_w; (p = strchr_w(p, *find_w)) != NULL; p++) { - if (strncmp_w(p, find_w, find_w_len) == 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; +} |