From: Antony Dovgal Date: Tue, 8 Dec 2009 12:12:23 +0000 (+0000) Subject: sync with 5_3 X-Git-Tag: php-5.4.0alpha1~191^2~2281 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=754c06c6c52879ed770e8f742701b1636d1af530;p=php sync with 5_3 --- diff --git a/ext/iconv/iconv.c b/ext/iconv/iconv.c index d6c55ce627..487ec67eaf 100644 --- a/ext/iconv/iconv.c +++ b/ext/iconv/iconv.c @@ -740,36 +740,39 @@ static php_iconv_err_t _php_iconv_substr(smart_str *pretval, if (err != PHP_ICONV_ERR_SUCCESS) { return err; } - - /* normalize the offset and the length */ - if (offset < 0) { - if ((offset += total_len) < 0) { - offset = 0; - } - } + if (len < 0) { if ((len += (total_len - offset)) < 0) { - len = 0; + return PHP_ICONV_ERR_SUCCESS; } } - if((unsigned int) len > total_len) { + if (offset < 0) { + if ((offset += total_len) < 0) { + return PHP_ICONV_ERR_SUCCESS; + } + } + + if(len > total_len) { len = total_len; } - if ((unsigned int) offset >= total_len) { + + if (offset >= total_len) { return PHP_ICONV_ERR_SUCCESS; } - if ((unsigned int) (offset + len) > total_len) { + if ((offset + len) > total_len ) { /* trying to compute the length */ len = total_len - offset; } if (len == 0) { + smart_str_appendl(pretval, "", 0); + smart_str_0(pretval); return PHP_ICONV_ERR_SUCCESS; } - + cd1 = iconv_open(GENERIC_SUPERSET_NAME, enc); if (cd1 == (iconv_t)(-1)) {