From: Xinchen Hui Date: Sun, 23 Feb 2014 10:17:39 +0000 (+0800) Subject: Fixed memory leak in ext/standard/tests/strings/bug20927.phpt X-Git-Tag: POST_PHPNG_MERGE~412^2~579 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5db2503fc0c209abc4d5a69b117166ee3e0dd446;p=php Fixed memory leak in ext/standard/tests/strings/bug20927.phpt --- diff --git a/ext/standard/string.c b/ext/standard/string.c index a5f2e6f4a3..1d465afcfa 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -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); } } /* }}} */