jay             Thu May  6 12:11:50 2004 EDT

  Modified files:              
    /php-src/ext/standard       string.c 
  Log:
  Fixed a segfault. (It's possible for large offsets to make strrpos()
  read past the end of the haystack string...)
  
  
http://cvs.php.net/diff.php/php-src/ext/standard/string.c?r1=1.414&r2=1.415&ty=u
Index: php-src/ext/standard/string.c
diff -u php-src/ext/standard/string.c:1.414 php-src/ext/standard/string.c:1.415
--- php-src/ext/standard/string.c:1.414 Fri Mar 26 14:23:42 2004
+++ php-src/ext/standard/string.c       Thu May  6 12:11:50 2004
@@ -18,7 +18,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: string.c,v 1.414 2004/03/26 19:23:42 pollita Exp $ */
+/* $Id: string.c,v 1.415 2004/05/06 16:11:50 jay Exp $ */
 
 /* Synced with php 3.0 revision 1.193 1999-06-16 [ssb] */
 
@@ -1614,7 +1614,9 @@
                e = haystack + haystack_len - needle_len;
        } else {
                p = haystack;
-               if (needle_len > -offset) {
+               if (-offset > haystack_len) {
+                       e = haystack - needle_len;
+               } else if (needle_len > -offset) {
                        e = haystack + haystack_len - needle_len;
                } else {
                        e = haystack + haystack_len + offset;
@@ -1681,7 +1683,11 @@
                        e = haystack + haystack_len - 1;
                } else {
                        p = haystack;
-                       e = haystack + haystack_len - offset;
+                       if (-offset > haystack_len) {
+                               e = haystack + haystack_len - 1;
+                       } else {
+                               e = haystack + haystack_len + offset;
+                       }
                }
                /* Borrow that ord_needle buffer to avoid repeatedly tolower()ing 
needle */
                *ord_needle = tolower(*needle);
@@ -1704,7 +1710,9 @@
                e = haystack_dup + haystack_len - needle_len;
        } else {
                p = haystack_dup;
-               if (needle_len > -offset) {
+               if (-offset > haystack_len) {
+                       e = haystack_dup - needle_len;
+               } else if (needle_len > -offset) {
                        e = haystack_dup + haystack_len - needle_len;
                } else {
                        e = haystack_dup + haystack_len + offset;

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to