]> granicus.if.org Git - php/commitdiff
@- strpos() is now binary-safe. (Thies)
authorThies C. Arntzen <thies@php.net>
Mon, 6 Dec 1999 17:37:59 +0000 (17:37 +0000)
committerThies C. Arntzen <thies@php.net>
Mon, 6 Dec 1999 17:37:59 +0000 (17:37 +0000)
ext/standard/string.c

index 9fac617dda8df8e88fec971e53b3d7e0b7e9d52b..deb01a79c294416f85fb6575f89cfc3a92e1eefc 100644 (file)
@@ -34,6 +34,7 @@
 #include "php_globals.h"
 
 int php_tag_find(char *tag, int len, char *set);
+static inline char *php_memnstr(char *haystack, char *needle, int needle_len, char *end);
 
 /* this is read-only, so it's ok */
 static char hexconvtab[] = "0123456789abcdef";
@@ -602,6 +603,8 @@ PHP_FUNCTION(strpos)
        pval **haystack, **needle, **OFFSET;
        int offset = 0;
        char *found = NULL;
+       char *endp;
+       char *startp;
        
        switch(ARG_COUNT(ht)) {
        case 2:
@@ -615,25 +618,41 @@ PHP_FUNCTION(strpos)
                }
                convert_to_long_ex(OFFSET);
                offset = (*OFFSET)->value.lval;
+               if (offset < 0) {
+                       php_error(E_WARNING,"offset not contained in string");
+                       RETURN_FALSE;
+               }       
                break;
        default:
                WRONG_PARAM_COUNT;
        }
+
        convert_to_string_ex(haystack);
+
        if (offset > (*haystack)->value.str.len) {
                php_error(E_WARNING,"offset not contained in string");
                RETURN_FALSE;
        }
 
+       startp = (*haystack)->value.str.val;
+       startp+= offset;
+
+       endp = (*haystack)->value.str.val;
+       endp+= (*haystack)->value.str.len;
+
        if ((*needle)->type == IS_STRING) {
                if ((*needle)->value.str.len==0) {
                        php_error(E_WARNING,"Empty delimiter");
                        RETURN_FALSE;
                }
-               found = strstr((*haystack)->value.str.val+offset, (*needle)->value.str.val);
+               found = php_memnstr(startp, (*needle)->value.str.val, (*needle)->value.str.len, endp);
        } else {
+               char buf;
+
                convert_to_long_ex(needle);
-               found = strchr((*haystack)->value.str.val+offset, (char) (*needle)->value.lval);
+               buf = (char) (*needle)->value.lval;
+
+               found = php_memnstr(startp, &buf, 1, endp);
        }
 
        if (found) {