Skip to content

Commit 1095f8a

Browse files
author
Thies C. Arntzen
committed
@- explode() is now binary-safe. (Thies)
we save one buffer-copy as well (hehe)
1 parent db3cf21 commit 1095f8a

File tree

1 file changed

+17
-13
lines changed

1 file changed

+17
-13
lines changed

ext/standard/string.c

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -211,22 +211,24 @@ PHP_FUNCTION(ltrim)
211211

212212
PHPAPI void php_explode(pval *delim, pval *str, pval *return_value)
213213
{
214-
char *work_str, *p1, *p2;
214+
char *p1, *p2, *endp;
215215
int i = 0;
216216

217-
work_str = p1 = estrndup(str->value.str.val,str->value.str.len);
218-
p2 = strstr(p1, delim->value.str.val);
217+
endp = str->value.str.val + str->value.str.len;
218+
219+
p1 = str->value.str.val;
220+
p2 = php_memnstr(str->value.str.val, delim->value.str.val, delim->value.str.len, endp);
221+
219222
if (p2 == NULL) {
220-
add_index_string(return_value, i++, p1, 1);
223+
add_index_stringl(return_value, i++, p1, str->value.str.len, 1);
221224
} else do {
222-
p2[0] = 0;
223-
add_index_string(return_value, i++, p1, 1);
225+
add_index_stringl(return_value, i++, p1, p2-p1, 1);
224226
p1 = p2 + delim->value.str.len;
225-
} while ((p2 = strstr(p1, delim->value.str.val)) && p2 != work_str);
226-
if (p1 != work_str) {
227-
add_index_string(return_value, i++, p1, 1);
227+
} while (p2 = php_memnstr(p1, delim->value.str.val, delim->value.str.len, endp));
228+
229+
if (p1 <= endp) {
230+
add_index_stringl(return_value, i++, p1, endp-p1, 1);
228231
}
229-
efree(work_str);
230232
}
231233

232234
/* {{{ proto array explode(string separator, string str)
@@ -238,17 +240,19 @@ PHP_FUNCTION(explode)
238240
if (ARG_COUNT(ht) != 2 || getParametersEx(2, &delim, &str) == FAILURE) {
239241
WRONG_PARAM_COUNT;
240242
}
243+
241244
convert_to_string_ex(str);
242245
convert_to_string_ex(delim);
243246

244-
if (strlen((*delim)->value.str.val)==0) {
245-
/* the delimiter must be a valid C string that's at least 1 character long */
247+
if (! (*delim)->value.str.len) {
246248
php_error(E_WARNING,"Empty delimiter");
247249
RETURN_FALSE;
248250
}
251+
249252
if (array_init(return_value) == FAILURE) {
250-
return;
253+
RETURN_FALSE;
251254
}
255+
252256
php_explode(*delim, *str, return_value);
253257
}
254258
/* }}} */

0 commit comments

Comments
 (0)