diff options
author | Christoph M. Becker <cmb@php.net> | 2016-07-29 11:28:33 +0200 |
---|---|---|
committer | Christoph M. Becker <cmbecker69@gmx.de> | 2016-07-29 11:33:50 +0200 |
commit | a837b2f6a35ab7cdfb49b9407ac0401caa672b23 (patch) | |
tree | c359302dec846331d68cf1ea267299cb2536b8bd /ext/iconv | |
parent | 293dd3d7017e3df8f06898d3a7d1c00eb935ee0c (diff) | |
download | php-git-a837b2f6a35ab7cdfb49b9407ac0401caa672b23.tar.gz |
Fix #72320: iconv_substr returns false for empty strings
For consistency with substr() and mb_substr(), iconv_substr() should return
an empty string instead of FALSE, when $offset == iconv_strlen($str).
Diffstat (limited to 'ext/iconv')
-rw-r--r-- | ext/iconv/iconv.c | 4 | ||||
-rw-r--r-- | ext/iconv/tests/bug72320.phpt | 14 |
2 files changed, 16 insertions, 2 deletions
diff --git a/ext/iconv/iconv.c b/ext/iconv/iconv.c index d4a7f6e0af..364882305c 100644 --- a/ext/iconv/iconv.c +++ b/ext/iconv/iconv.c @@ -858,7 +858,7 @@ static php_iconv_err_t _php_iconv_substr(smart_str *pretval, } - if ((size_t)offset >= total_len) { + if ((size_t)offset > total_len) { return PHP_ICONV_ERR_SUCCESS; } @@ -2108,7 +2108,7 @@ PHP_FUNCTION(iconv_substr) err = _php_iconv_substr(&retval, ZSTR_VAL(str), ZSTR_LEN(str), offset, length, charset); _php_iconv_show_error(err, GENERIC_SUPERSET_NAME, charset); - if (err == PHP_ICONV_ERR_SUCCESS && ZSTR_LEN(str) > 0 && retval.s != NULL) { + if (err == PHP_ICONV_ERR_SUCCESS && ZSTR_LEN(str) >= 0 && retval.s != NULL) { RETURN_NEW_STR(retval.s); } smart_str_free(&retval); diff --git a/ext/iconv/tests/bug72320.phpt b/ext/iconv/tests/bug72320.phpt new file mode 100644 index 0000000000..0c83d33db0 --- /dev/null +++ b/ext/iconv/tests/bug72320.phpt @@ -0,0 +1,14 @@ +--TEST-- +Bug #72320 (iconv_substr returns false for empty strings) +--SKIPIF-- +<?php +if (!extension_loaded('iconv')) die('skip ext/iconv required'); +?> +--FILE-- +<?php +var_dump(iconv_substr('', 0, 10, 'UTF-8')); +var_dump(iconv_substr('foo', 3, 10, 'UTF-8')); +?> +--EXPECT-- +string(0) "" +string(0) "" |