]> granicus.if.org Git - php/commitdiff
Fix #72320: iconv_substr returns false for empty strings
authorChristoph M. Becker <cmb@php.net>
Fri, 29 Jul 2016 09:28:33 +0000 (11:28 +0200)
committerChristoph M. Becker <cmbecker69@gmx.de>
Fri, 29 Jul 2016 09:33:50 +0000 (11:33 +0200)
For consistency with substr() and mb_substr(), iconv_substr() should return
an empty string instead of FALSE, when $offset == iconv_strlen($str).

ext/iconv/iconv.c
ext/iconv/tests/bug72320.phpt [new file with mode: 0644]

index d4a7f6e0af4e74a5d0d3245eff403cd102efc26f..364882305cf42fd1457216448dfe73b98c668d99 100644 (file)
@@ -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 (file)
index 0000000..0c83d33
--- /dev/null
@@ -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) ""