From 04c1158b526d52a29fcbb3a97601258d18f87c58 Mon Sep 17 00:00:00 2001 From: Michael Jerris Date: Mon, 29 Oct 2007 06:16:41 +0000 Subject: [PATCH] replace switch_stristr implementation with one that shouldn't segfault. git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@6080 d0543943-73ff-0310-b7d9-9358b9ac24b2 --- src/switch_utils.c | 48 +++++++++++++++++++++++++++++++++------------- 1 file changed, 35 insertions(+), 13 deletions(-) diff --git a/src/switch_utils.c b/src/switch_utils.c index e7fccce4c2..222b1ca538 100644 --- a/src/switch_utils.c +++ b/src/switch_utils.c @@ -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;