]> granicus.if.org Git - php/commitdiff
Fixed memory leak in ext/standard/tests/strings/bug20927.phpt
authorXinchen Hui <laruence@gmail.com>
Sun, 23 Feb 2014 10:17:39 +0000 (18:17 +0800)
committerXinchen Hui <laruence@gmail.com>
Sun, 23 Feb 2014 10:17:39 +0000 (18:17 +0800)
ext/standard/string.c

index a5f2e6f4a34873bfbe2cb9bb4722ac0982398f68..1d465afcfa68215b6b348ac234e7768447d01c9b 100644 (file)
@@ -871,12 +871,12 @@ PHP_FUNCTION(ltrim)
 PHP_FUNCTION(wordwrap)
 {
        const char *text, *breakchar = "\n";
-       char *newtext;
        int textlen, breakcharlen = 1, newtextlen, chk;
        size_t alloced;
        long current = 0, laststart = 0, lastspace = 0;
        long linelength = 75;
        zend_bool docut = 0;
+       zend_string *newtext;
 
        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|lsb", &text, &textlen, &linelength, &breakchar, &breakcharlen, &docut) == FAILURE) {
                return;
@@ -899,7 +899,7 @@ PHP_FUNCTION(wordwrap)
        /* Special case for a single-character break as it needs no
           additional storage space */
        if (breakcharlen == 1 && !docut) {
-               newtext = estrndup(text, textlen);
+               newtext = STR_INIT(text, textlen, 0);
 
                laststart = lastspace = 0;
                for (current = 0; current < textlen; current++) {
@@ -907,28 +907,27 @@ PHP_FUNCTION(wordwrap)
                                laststart = lastspace = current + 1;
                        } else if (text[current] == ' ') {
                                if (current - laststart >= linelength) {
-                                       newtext[current] = breakchar[0];
+                                       newtext->val[current] = breakchar[0];
                                        laststart = current + 1;
                                }
                                lastspace = current;
                        } else if (current - laststart >= linelength && laststart != lastspace) {
-                               newtext[lastspace] = breakchar[0];
+                               newtext->val[lastspace] = breakchar[0];
                                laststart = lastspace + 1;
                        }
                }
 
-//???          RETURN_STRINGL(newtext, textlen, 0);
-               RETURN_STRINGL(newtext, textlen);
+               RETURN_STR(newtext);
        } else {
                /* Multiple character line break or forced cut */
                if (linelength > 0) {
                        chk = (int)(textlen/linelength + 1);
-                       newtext = safe_emalloc(chk, breakcharlen, textlen + 1);
+                       newtext = STR_ALLOC(chk * breakcharlen + textlen + 1, 0);
                        alloced = textlen + chk * breakcharlen + 1;
                } else {
                        chk = textlen;
                        alloced = textlen * (breakcharlen + 1) + 1;
-                       newtext = safe_emalloc(textlen, (breakcharlen + 1), 1);
+                       newtext = STR_ALLOC(textlen * (breakcharlen + 1) + 1, 0);
                }
 
                /* now keep track of the actual new text length */
@@ -938,7 +937,7 @@ PHP_FUNCTION(wordwrap)
                for (current = 0; current < textlen; current++) {
                        if (chk <= 0) {
                                alloced += (int) (((textlen - current + 1)/linelength + 1) * breakcharlen) + 1;
-                               newtext = erealloc(newtext, alloced);
+                               newtext = STR_REALLOC(newtext, alloced, 0);
                                chk = (int) ((textlen - current)/linelength) + 1;
                        }
                        /* when we hit an existing break, copy to new buffer, and
@@ -946,8 +945,8 @@ PHP_FUNCTION(wordwrap)
                        if (text[current] == breakchar[0]
                                && current + breakcharlen < textlen
                                && !strncmp(text+current, breakchar, breakcharlen)) {
-                               memcpy(newtext+newtextlen, text+laststart, current-laststart+breakcharlen);
-                               newtextlen += current-laststart+breakcharlen;
+                               memcpy(newtext->val + newtextlen, text + laststart, current - laststart + breakcharlen);
+                               newtextlen += current - laststart + breakcharlen;
                                current += breakcharlen - 1;
                                laststart = lastspace = current + 1;
                                chk--;
@@ -956,9 +955,9 @@ PHP_FUNCTION(wordwrap)
                         * copy and insert a break, or just keep track of it */
                        else if (text[current] == ' ') {
                                if (current - laststart >= linelength) {
-                                       memcpy(newtext+newtextlen, text+laststart, current-laststart);
+                                       memcpy(newtext->val + newtextlen, text + laststart, current - laststart);
                                        newtextlen += current - laststart;
-                                       memcpy(newtext+newtextlen, breakchar, breakcharlen);
+                                       memcpy(newtext->val + newtextlen, breakchar, breakcharlen);
                                        newtextlen += breakcharlen;
                                        laststart = current + 1;
                                        chk--;
@@ -970,9 +969,9 @@ PHP_FUNCTION(wordwrap)
                         * copy and insert a break. */
                        else if (current - laststart >= linelength
                                        && docut && laststart >= lastspace) {
-                               memcpy(newtext+newtextlen, text+laststart, current-laststart);
+                               memcpy(newtext->val + newtextlen, text + laststart, current - laststart);
                                newtextlen += current - laststart;
-                               memcpy(newtext+newtextlen, breakchar, breakcharlen);
+                               memcpy(newtext->val + newtextlen, breakchar, breakcharlen);
                                newtextlen += breakcharlen;
                                laststart = lastspace = current;
                                chk--;
@@ -982,9 +981,9 @@ PHP_FUNCTION(wordwrap)
                         * up the laststart */
                        else if (current - laststart >= linelength
                                        && laststart < lastspace) {
-                               memcpy(newtext+newtextlen, text+laststart, lastspace-laststart);
+                               memcpy(newtext->val + newtextlen, text + laststart, lastspace - laststart);
                                newtextlen += lastspace - laststart;
-                               memcpy(newtext+newtextlen, breakchar, breakcharlen);
+                               memcpy(newtext->val + newtextlen, breakchar, breakcharlen);
                                newtextlen += breakcharlen;
                                laststart = lastspace = lastspace + 1;
                                chk--;
@@ -993,16 +992,15 @@ PHP_FUNCTION(wordwrap)
 
                /* copy over any stragglers */
                if (laststart != current) {
-                       memcpy(newtext+newtextlen, text+laststart, current-laststart);
+                       memcpy(newtext->val + newtextlen, text + laststart, current - laststart);
                        newtextlen += current - laststart;
                }
 
-               newtext[newtextlen] = '\0';
+               newtext->val[newtextlen] = '\0';
                /* free unused memory */
-               newtext = erealloc(newtext, newtextlen+1);
+               newtext = STR_REALLOC(newtext, newtextlen, 0);
 
-//???          RETURN_STRINGL(newtext, newtextlen, 0);
-               RETURN_STRINGL(newtext, newtextlen);
+               RETURN_STR(newtext);
        }
 }
 /* }}} */