]> granicus.if.org Git - php/commitdiff
Fixed bug #20927 and updated the test case for the bug.
authorIlia Alshanetsky <iliaa@php.net>
Thu, 12 Dec 2002 13:38:19 +0000 (13:38 +0000)
committerIlia Alshanetsky <iliaa@php.net>
Thu, 12 Dec 2002 13:38:19 +0000 (13:38 +0000)
ext/standard/string.c
ext/standard/tests/strings/bug20927.phpt

index 62e50224499975fb058bda53541d09811630d3de..261e76cc7d52867d1dffa3517107b7d3602320bf 100644 (file)
@@ -628,7 +628,7 @@ PHP_FUNCTION(wordwrap)
 {
        const char *text, *breakchar = "\n";
        char *newtext;
-       int textlen, breakcharlen = 1, newtextlen;
+       int textlen, breakcharlen = 1, newtextlen, alloced, chk;
        long current = 0, laststart = 0, lastspace = 0;
        long linelength = 75;
        zend_bool docut = 0;
@@ -670,18 +670,24 @@ PHP_FUNCTION(wordwrap)
        } else {
                /* Multiple character line break or forced cut */
                if (linelength > 0) {
-                       /* Add extra 10% to accomodate strings with unpredicatable number of breaks */
-                       newtextlen = textlen + (int)((textlen/linelength + 1) * breakcharlen * 1.1) + 1;
+                       chk = (int)(textlen/linelength + 1);
+                       alloced = textlen + chk * breakcharlen + 1;
                } else {
-                       newtextlen = textlen * (breakcharlen + 1) + 1;
+                       chk = textlen;
+                       alloced = textlen * (breakcharlen + 1) + 1;
                }
-               newtext = emalloc(newtextlen);
-       
+               newtext = emalloc(alloced);
+
                /* now keep track of the actual new text length */
                newtextlen = 0;
 
                laststart = lastspace = 0;
                for (current = 0; current < textlen; current++) {
+                       if (chk <= 0) {
+                               alloced += (int) (((textlen - current + 1)/linelength + 1) * breakcharlen) + 1;
+                               newtext = erealloc(newtext, alloced);
+                               chk = (int) ((textlen - current)/linelength) + 1;
+                       }
                        /* when we hit an existing break, copy to new buffer, and
                         * fix up laststart and lastspace */
                        if (text[current] == breakchar[0]
@@ -691,6 +697,7 @@ PHP_FUNCTION(wordwrap)
                                newtextlen += current-laststart+breakcharlen;
                                current += breakcharlen - 1;
                                laststart = lastspace = current + 1;
+                               chk--;
                        }
                        /* if it is a space, check if it is at the line boundary,
                         * copy and insert a break, or just keep track of it */
@@ -701,6 +708,7 @@ PHP_FUNCTION(wordwrap)
                                        memcpy(newtext+newtextlen, breakchar, breakcharlen);
                                        newtextlen += breakcharlen;
                                        laststart = current + 1;
+                                       chk--;
                                }
                                lastspace = current;
                        }
@@ -714,6 +722,7 @@ PHP_FUNCTION(wordwrap)
                                memcpy(newtext+newtextlen, breakchar, breakcharlen);
                                newtextlen += breakcharlen;
                                laststart = lastspace = current;
+                               chk--;
                        }
                        /* if the current word puts us over the linelength, copy
                         * back up until the last space, insert a break, and move
@@ -725,6 +734,7 @@ PHP_FUNCTION(wordwrap)
                                memcpy(newtext+newtextlen, breakchar, breakcharlen);
                                newtextlen += breakcharlen;
                                laststart = lastspace = lastspace + 1;
+                               chk--;
                        }
                }
 
index 4ac941b09e18edd45cae87c2d0abf160aac80f03..fc6d6d059d8a797e92d0256cc7f23df7e8df9125 100644 (file)
@@ -3,17 +3,16 @@ Segfault on wordwrap statement bug #20927
 --SKIPIF--
 --FILE--
 <?php
-$x = "ADV:CLAIM YOUR FORTUNE NOW !!MAKE";
-$x .= " xxxxxxxxxxHUNDREDS OF THOUSANDSxxxxxxxxxxxx";
-$b = "CANITBREAKFOO\n";
-$x = wordwrap($x, 20, $b, 1);
-$x = wordwrap($x, 20, $b, 1);
-print "$x\n";
+$string                = str_repeat("1234567890 X ", 10);
+$break         = str_repeat("a-very-long-break-string-to-clobber-the-heap", 8);
+$linelength    = 10;
+
+echo "Length of original string:  ".strlen($string)."\n";
+echo "Length of break string:     ".strlen($break)."\n";
+
+var_dump(wordwrap($string, $linelength, $break, 1));
 ?>
 --EXPECT--
-ADV:CLAIM YOURCANITBREAKFOO
-FORTUNE NOW !!MAKECANITBREAKFOO
-xxxxxxxxxxHUNDREDSCANITBREAKFOO
-OFCANITBREAKFOO
-THOUSANDSxxxxxxxxxxxCANITBREAKFOO
-x
+Length of original string:  130
+Length of break string:     352
+string(6799) "1234567890a-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapXa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heap1234567890a-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapXa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heap1234567890a-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapXa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heap1234567890a-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapXa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heap1234567890a-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapXa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heap1234567890a-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapXa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heap1234567890a-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapXa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heap1234567890a-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapXa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heap1234567890a-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapXa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heap1234567890a-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapa-very-long-break-string-to-clobber-the-heapX "