diff options
Diffstat (limited to 'ext/iconv/iconv.c')
-rw-r--r-- | ext/iconv/iconv.c | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/ext/iconv/iconv.c b/ext/iconv/iconv.c index 47aa983ab1..df44a5cda0 100644 --- a/ext/iconv/iconv.c +++ b/ext/iconv/iconv.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 7 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2017 The PHP Group | + | Copyright (c) 1997-2018 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -563,6 +563,8 @@ PHP_ICONV_API php_iconv_err_t php_iconv_string(const char *in_p, size_t in_len, size_t result; zend_string *ret, *out_buffer; + *out = NULL; + /* This is not the right way to get output size... This is not space efficient for large text. @@ -720,7 +722,6 @@ PHP_ICONV_API php_iconv_err_t php_iconv_string(const char *in_p, size_t in_len, default: /* other error */ - retval = PHP_ICONV_ERR_UNKNOWN; zend_string_free(out_buf); return PHP_ICONV_ERR_UNKNOWN; } @@ -2121,7 +2122,7 @@ PHP_FUNCTION(iconv_substr) PHP_FUNCTION(iconv_strpos) { char *charset = get_internal_encoding(); - size_t charset_len = 0; + size_t charset_len = 0, haystk_len; zend_string *haystk; zend_string *ndl; zend_long offset = 0; @@ -2142,8 +2143,17 @@ PHP_FUNCTION(iconv_strpos) } if (offset < 0) { - php_error_docref(NULL, E_WARNING, "Offset not contained in string."); - RETURN_FALSE; + /* Convert negative offset (counted from the end of string) */ + err = _php_iconv_strlen(&haystk_len, ZSTR_VAL(haystk), ZSTR_LEN(haystk), charset); + if (err != PHP_ICONV_ERR_SUCCESS) { + _php_iconv_show_error(err, GENERIC_SUPERSET_NAME, charset); + RETURN_FALSE; + } + offset += haystk_len; + if (offset < 0) { /* If offset before start */ + php_error_docref(NULL, E_WARNING, "Offset not contained in string."); + RETURN_FALSE; + } } if (ZSTR_LEN(ndl) < 1) { |