diff options
Diffstat (limited to 'Zend/zend_API.c')
-rw-r--r-- | Zend/zend_API.c | 40 |
1 files changed, 27 insertions, 13 deletions
diff --git a/Zend/zend_API.c b/Zend/zend_API.c index cc31a81a1c..a8aedeb964 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -254,6 +254,12 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_parameter_type_error(uint32_t n return; } + if ((expected_type == Z_EXPECTED_PATH || expected_type == Z_EXPECTED_PATH_OR_NULL) + && Z_TYPE_P(arg) == IS_STRING) { + zend_argument_value_error(num, "must not contain any null bytes"); + return; + } + zend_argument_type_error(num, "must be %s, %s given", expected_error[expected_type], zend_zval_type_name(arg)); } /* }}} */ @@ -668,10 +674,12 @@ static const char *zend_parse_arg_impl(zval *arg, va_list *va, const char **spec char **p = va_arg(*va, char **); size_t *pl = va_arg(*va, size_t *); if (!zend_parse_arg_path(arg, p, pl, check_null)) { - zend_spprintf(error, 0, "a valid path%s, %s given", - check_null ? " or null" : "", zend_zval_type_name(arg) - ); - return ""; + if (Z_TYPE_P(arg) == IS_STRING) { + zend_spprintf(error, 0, "must not contain any null bytes"); + return ""; + } else { + return check_null ? "?string" : "string"; + } } } break; @@ -680,10 +688,12 @@ static const char *zend_parse_arg_impl(zval *arg, va_list *va, const char **spec { zend_string **str = va_arg(*va, zend_string **); if (!zend_parse_arg_path_str(arg, str, check_null)) { - zend_spprintf(error, 0, "a valid path%s, %s given", - check_null ? " or null" : "", zend_zval_type_name(arg) - ); - return ""; + if (Z_TYPE_P(arg) == IS_STRING) { + zend_spprintf(error, 0, "must not contain any null bytes"); + return ""; + } else { + return check_null ? "?string" : "string"; + } } } break; @@ -762,7 +772,7 @@ static const char *zend_parse_arg_impl(zval *arg, va_list *va, const char **spec if (!zend_parse_arg_object(arg, p, ce, check_null)) { if (ce) { if (check_null) { - zend_spprintf(error, 0, "of type ?%s, %s given", ZSTR_VAL(ce->name), zend_zval_type_name(arg)); + zend_spprintf(error, 0, "must be of type ?%s, %s given", ZSTR_VAL(ce->name), zend_zval_type_name(arg)); return ""; } else { return ZSTR_VAL(ce->name); @@ -795,14 +805,14 @@ static const char *zend_parse_arg_impl(zval *arg, va_list *va, const char **spec } if (ce_base) { if ((!*pce || !instanceof_function(*pce, ce_base))) { - zend_spprintf(error, 0, "a class name derived from %s%s, %s given", + zend_spprintf(error, 0, "must be a class name derived from %s%s, %s given", ZSTR_VAL(ce_base->name), check_null ? " or null" : "", Z_STRVAL_P(arg)); *pce = NULL; return ""; } } if (!*pce) { - zend_spprintf(error, 0, "a valid class name%s, %s given", + zend_spprintf(error, 0, "must be a valid class name%s, %s given", check_null ? " or null" : "", Z_STRVAL_P(arg)); return ""; } @@ -833,7 +843,7 @@ static const char *zend_parse_arg_impl(zval *arg, va_list *va, const char **spec } if (is_callable_error) { - zend_spprintf(error, 0, "a valid callback%s, %s", check_null ? " or null" : "", is_callable_error); + zend_spprintf(error, 0, "must be a valid callback%s, %s", check_null ? " or null" : "", is_callable_error); efree(is_callable_error); return ""; } else { @@ -874,7 +884,11 @@ static zend_result zend_parse_arg(uint32_t arg_num, zval *arg, va_list *va, cons } if (!(flags & ZEND_PARSE_PARAMS_QUIET) && (*expected_type || error)) { if (error) { - zend_argument_type_error(arg_num, "must be %s", error); + if (strcmp(error, "must not contain any null bytes") == 0) { + zend_argument_value_error(arg_num, "%s", error); + } else { + zend_argument_type_error(arg_num, "%s", error); + } efree(error); } else { zend_argument_type_error(arg_num, "must be of type %s, %s given", expected_type, zend_zval_type_name(arg)); |