diff options
| -rw-r--r-- | ext/iconv/iconv.c | 32 | ||||
| -rw-r--r-- | ext/iconv/tests/bug37176.phpt | 10 |
2 files changed, 24 insertions, 18 deletions
diff --git a/ext/iconv/iconv.c b/ext/iconv/iconv.c index 4c78ac022f..6b7c483759 100644 --- a/ext/iconv/iconv.c +++ b/ext/iconv/iconv.c @@ -822,18 +822,16 @@ static php_iconv_err_t _php_iconv_strpos(unsigned int *pretval, j += GENERIC_SUPERSET_NBYTES; } - if (!_php_iconv_memequal(buf, &ndl_buf[i], sizeof(buf))) { - i = 0; - } - - if (i == 0) { - match_ofs = (unsigned int)-1; - } else { + if (_php_iconv_memequal(buf, &ndl_buf[i], sizeof(buf))) { match_ofs += (lim - i) / GENERIC_SUPERSET_NBYTES; i += GENERIC_SUPERSET_NBYTES; + ndl_buf_p = &ndl_buf[i]; + ndl_buf_left = ndl_buf_len - i; + } else { + match_ofs = (unsigned int)-1; + ndl_buf_p = ndl_buf; + ndl_buf_left = ndl_buf_len; } - ndl_buf_p = &ndl_buf[i]; - ndl_buf_left = ndl_buf_len - i; } } } else { @@ -867,18 +865,16 @@ static php_iconv_err_t _php_iconv_strpos(unsigned int *pretval, j += GENERIC_SUPERSET_NBYTES; } - if (!_php_iconv_memequal(buf, &ndl_buf[i], sizeof(buf))) { - i = 0; - } - - if (i == 0) { - match_ofs = (unsigned int)-1; - } else { + if (_php_iconv_memequal(buf, &ndl_buf[i], sizeof(buf))) { match_ofs += (lim - i) / GENERIC_SUPERSET_NBYTES; i += GENERIC_SUPERSET_NBYTES; + ndl_buf_p = &ndl_buf[i]; + ndl_buf_left = ndl_buf_len - i; + } else { + match_ofs = (unsigned int)-1; + ndl_buf_p = ndl_buf; + ndl_buf_left = ndl_buf_len; } - ndl_buf_p = &ndl_buf[i]; - ndl_buf_left = ndl_buf_len - i; } } } diff --git a/ext/iconv/tests/bug37176.phpt b/ext/iconv/tests/bug37176.phpt new file mode 100644 index 0000000000..3923dbd49c --- /dev/null +++ b/ext/iconv/tests/bug37176.phpt @@ -0,0 +1,10 @@ +--TEST-- +Bug #37176 (iconv_strpos() fails to find a string) +--FILE-- +<?php +var_dump(iconv_strpos('11--','1-',0,'UTF-8')); +var_dump(iconv_strpos('-11--','1-',0,'UTF-8')); +?> +--EXPECT-- +int(1) +int(2) |
