summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/iconv/iconv.c32
-rw-r--r--ext/iconv/tests/bug37176.phpt10
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)