]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
replace switch_stristr implementation with one that shouldn't segfault.
authorMichael Jerris <mike@jerris.com>
Mon, 29 Oct 2007 06:16:41 +0000 (06:16 +0000)
committerMichael Jerris <mike@jerris.com>
Mon, 29 Oct 2007 06:16:41 +0000 (06:16 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@6080 d0543943-73ff-0310-b7d9-9358b9ac24b2

src/switch_utils.c

index e7fccce4c257b3a1737b7c76ad473176148d2e65..222b1ca5385fda5a112eeaf8ed9662e5d4ec5271 100644 (file)
@@ -199,24 +199,46 @@ SWITCH_DECLARE(switch_bool_t) switch_simple_email(char *to, char *from, char *he
 
 SWITCH_DECLARE(const char *) switch_stristr(const char *str, const char *instr)
 {
-       switch_size_t score = strlen(str), x = 0;
-       const char *a = str, *b = instr, *p = NULL;
-       while(*a && *b) {
-               if (tolower(*b) == tolower(*a)) {
-                       if (++x == score) {
-                               return b - x + 1;
-                       }
-                       a++;
-               } else {
-                       a = str;
-                       p = b+1;
-                       x = 0;
+/*
+** Rev History:  16/07/97  Greg Thayer         Optimized
+**               07/04/95  Bob Stout           ANSI-fy
+**               02/03/94  Fred Cole           Original
+**               09/01/03  Bob Stout           Bug fix (lines 40-41) per Fred Bulback
+**
+** Hereby donated to public domain.
+*/
+
+       const char *pptr, *sptr, *start;
+
+       if (!str || !instr)
+               return NULL;
+
+       for (start = str; *start; start++) {
+               /* find start of pattern in string */
+               for ( ; ((*start) && (toupper(*start) != toupper(*instr))); start++);
+
+               if (!*start)
+                       return NULL;
+
+               pptr = instr;
+               sptr = start;
+
+               while (toupper(*sptr) == toupper(*pptr)) {
+                       sptr++;
+                       pptr++;
+
+                       /* if end of pattern then pattern was found */
+                       if (!*pptr)
+                               return (start);
+
+                       if (!*sptr)
+                               return NULL;
                }
-               b++;
        }
        return NULL;
 }
 
+
 SWITCH_DECLARE(switch_status_t) switch_find_local_ip(char *buf, int len, int family)
 {
        switch_status_t status = SWITCH_STATUS_FALSE;