summaryrefslogtreecommitdiff
path: root/ext/standard/string.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/standard/string.c')
-rw-r--r--ext/standard/string.c35
1 files changed, 23 insertions, 12 deletions
diff --git a/ext/standard/string.c b/ext/standard/string.c
index 1305e7f920..1efb266c82 100644
--- a/ext/standard/string.c
+++ b/ext/standard/string.c
@@ -978,7 +978,7 @@ PHP_FUNCTION(wordwrap)
newtext = zend_string_init(ZSTR_VAL(text), ZSTR_LEN(text), 0);
laststart = lastspace = 0;
- for (current = 0; current < ZSTR_LEN(text); current++) {
+ for (current = 0; current < (zend_long)ZSTR_LEN(text); current++) {
if (ZSTR_VAL(text)[current] == breakchar[0]) {
laststart = lastspace = current + 1;
} else if (ZSTR_VAL(text)[current] == ' ') {
@@ -1010,7 +1010,7 @@ PHP_FUNCTION(wordwrap)
newtextlen = 0;
laststart = lastspace = 0;
- for (current = 0; current < ZSTR_LEN(text); current++) {
+ for (current = 0; current < (zend_long)ZSTR_LEN(text); current++) {
if (chk <= 0) {
alloced += (size_t) (((ZSTR_LEN(text) - current + 1)/linelength + 1) * breakchar_len) + 1;
newtext = zend_string_extend(newtext, alloced, 0);
@@ -1670,7 +1670,11 @@ PHP_FUNCTION(dirname)
if (levels == 1) {
/* Defaut case */
+#ifdef PHP_WIN32
+ ZSTR_LEN(ret) = php_win32_ioutil_dirname(ZSTR_VAL(ret), str_len);
+#else
ZSTR_LEN(ret) = zend_dirname(ZSTR_VAL(ret), str_len);
+#endif
} else if (levels < 1) {
php_error_docref(NULL, E_WARNING, "Invalid argument, levels must be >= 1");
zend_string_free(ret);
@@ -1678,7 +1682,11 @@ PHP_FUNCTION(dirname)
} else {
/* Some levels up */
do {
+#ifdef PHP_WIN32
+ ZSTR_LEN(ret) = php_win32_ioutil_dirname(ZSTR_VAL(ret), str_len = ZSTR_LEN(ret));
+#else
ZSTR_LEN(ret) = zend_dirname(ZSTR_VAL(ret), str_len = ZSTR_LEN(ret));
+#endif
} while (ZSTR_LEN(ret) < str_len && --levels);
}
@@ -1746,7 +1754,7 @@ PHP_FUNCTION(pathinfo)
p = zend_memrchr(ZSTR_VAL(ret), '.', ZSTR_LEN(ret));
- idx = p ? (p - ZSTR_VAL(ret)) : ZSTR_LEN(ret);
+ idx = p ? (p - ZSTR_VAL(ret)) : (ptrdiff_t)ZSTR_LEN(ret);
add_assoc_stringl(&tmp, "filename", ZSTR_VAL(ret), idx);
}
@@ -2123,7 +2131,7 @@ PHP_FUNCTION(strrpos)
RETURN_FALSE;
}
p = ZSTR_VAL(haystack);
- if (-offset < needle_len) {
+ if ((size_t)-offset < needle_len) {
e = ZSTR_VAL(haystack) + ZSTR_LEN(haystack);
} else {
e = ZSTR_VAL(haystack) + ZSTR_LEN(haystack) + offset + needle_len;
@@ -2224,7 +2232,7 @@ PHP_FUNCTION(strripos)
RETURN_FALSE;
}
p = ZSTR_VAL(haystack_dup);
- if (-offset < ZSTR_LEN(needle)) {
+ if ((size_t)-offset < ZSTR_LEN(needle)) {
e = ZSTR_VAL(haystack_dup) + ZSTR_LEN(haystack);
} else {
e = ZSTR_VAL(haystack_dup) + ZSTR_LEN(haystack) + offset + ZSTR_LEN(needle);
@@ -2404,7 +2412,7 @@ PHP_FUNCTION(substr)
if (f > (zend_long)ZSTR_LEN(str)) {
RETURN_FALSE;
- } else if (f < 0 && -f > ZSTR_LEN(str)) {
+ } else if (f < 0 && (size_t)-f > ZSTR_LEN(str)) {
f = 0;
}
@@ -2510,7 +2518,7 @@ PHP_FUNCTION(substr_replace)
if (f < 0) {
f = 0;
}
- } else if (f > Z_STRLEN_P(str)) {
+ } else if ((size_t)f > Z_STRLEN_P(str)) {
f = Z_STRLEN_P(str);
}
/* if "length" position is negative, set it to the length
@@ -2523,7 +2531,7 @@ PHP_FUNCTION(substr_replace)
}
}
- if (l > Z_STRLEN_P(str) || (l < 0 && (size_t)(-l) > Z_STRLEN_P(str))) {
+ if ((size_t)l > Z_STRLEN_P(str) || (l < 0 && (size_t)(-l) > Z_STRLEN_P(str))) {
l = Z_STRLEN_P(str);
}
@@ -4204,8 +4212,8 @@ static void php_hebrev(INTERNAL_FUNCTION_PARAMETERS, int convert_newlines)
char *str;
char *heb_str, *tmp, *target;
size_t block_start, block_end, block_type, block_length, i;
- zend_long max_chars=0;
- size_t begin, end, char_count, orig_begin;
+ zend_long max_chars=0, char_count;
+ size_t begin, end, orig_begin;
size_t str_len;
zend_string *broken_str;
@@ -4614,6 +4622,9 @@ PHP_FUNCTION(parse_str)
symbol_table = zend_rebuild_symbol_table();
ZVAL_ARR(&tmp, symbol_table);
sapi_module.treat_data(PARSE_STRING, res, &tmp);
+ if (UNEXPECTED(zend_hash_del(symbol_table, CG(known_strings)[ZEND_STR_THIS]) == SUCCESS)) {
+ zend_throw_error(NULL, "Cannot re-assign $this");
+ }
} else {
zval ret;
@@ -5313,7 +5324,7 @@ PHP_FUNCTION(substr_count)
if (length <= 0) {
length += (haystack_len - offset);
}
- if ((length <= 0) || (length > (haystack_len - offset))) {
+ if ((length <= 0) || ((size_t)length > (haystack_len - offset))) {
php_error_docref(NULL, E_WARNING, "Invalid length value");
RETURN_FALSE;
}
@@ -5735,7 +5746,7 @@ PHP_FUNCTION(substr_compare)
RETURN_FALSE;
}
- cmp_len = (size_t) (len ? len : MAX(ZSTR_LEN(s2), (ZSTR_LEN(s1) - offset)));
+ cmp_len = len ? (size_t)len : MAX(ZSTR_LEN(s2), (ZSTR_LEN(s1) - offset));
if (!cs) {
RETURN_LONG(zend_binary_strncmp(ZSTR_VAL(s1) + offset, (ZSTR_LEN(s1) - offset), ZSTR_VAL(s2), ZSTR_LEN(s2), cmp_len));