From a1c6ee2164c9d48730c2027df4442aae413d245d Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 23 Apr 2021 10:47:08 +0200 Subject: [PATCH] Convert error filename to zend_string Error handling functions/callbacks now accept the error filename as a zend_string* instead of a const char*. --- Zend/zend.c | 35 +++++++++++++++-------------------- Zend/zend.h | 8 ++++---- Zend/zend_exceptions.c | 10 +++++----- Zend/zend_observer.c | 2 +- Zend/zend_observer.h | 4 ++-- Zend/zend_string.h | 1 + ext/opcache/ZendAccelerator.c | 12 ++++++------ ext/soap/soap.c | 8 ++++---- main/main.c | 24 ++++++++++++------------ 9 files changed, 50 insertions(+), 54 deletions(-) diff --git a/Zend/zend.c b/Zend/zend.c index b9663ad329f..eb0a4ddd7e3 100644 --- a/Zend/zend.c +++ b/Zend/zend.c @@ -77,7 +77,7 @@ ZEND_API FILE *(*zend_fopen)(zend_string *filename, zend_string **opened_path); ZEND_API zend_result (*zend_stream_open_function)(zend_file_handle *handle); ZEND_API void (*zend_ticks_function)(int ticks); ZEND_API void (*zend_interrupt_function)(zend_execute_data *execute_data); -ZEND_API void (*zend_error_cb)(int type, const char *error_filename, const uint32_t error_lineno, zend_string *message); +ZEND_API void (*zend_error_cb)(int type, zend_string *error_filename, const uint32_t error_lineno, zend_string *message); void (*zend_printf_to_smart_string)(smart_string *buf, const char *format, va_list ap); void (*zend_printf_to_smart_str)(smart_str *buf, const char *format, va_list ap); ZEND_API char *(*zend_getenv)(const char *name, size_t name_len); @@ -1316,7 +1316,7 @@ ZEND_API zval *zend_get_configuration_directive(zend_string *name) /* {{{ */ } while (0) static ZEND_COLD void zend_error_impl( - int orig_type, const char *error_filename, uint32_t error_lineno, zend_string *message) + int orig_type, zend_string *error_filename, uint32_t error_lineno, zend_string *message) { zval params[4]; zval retval; @@ -1381,7 +1381,7 @@ static ZEND_COLD void zend_error_impl( ZVAL_LONG(¶ms[0], type); if (error_filename) { - ZVAL_STRING(¶ms[2], error_filename); + ZVAL_STR_COPY(¶ms[2], error_filename); } else { ZVAL_NULL(¶ms[2]); } @@ -1449,7 +1449,7 @@ static ZEND_COLD void zend_error_impl( /* }}} */ static ZEND_COLD void zend_error_va_list( - int orig_type, const char *error_filename, uint32_t error_lineno, + int orig_type, zend_string *error_filename, uint32_t error_lineno, const char *format, va_list args) { zend_string *message = zend_vstrpprintf(0, format, args); @@ -1457,7 +1457,7 @@ static ZEND_COLD void zend_error_va_list( zend_string_release(message); } -static ZEND_COLD void get_filename_lineno(int type, const char **filename, uint32_t *lineno) { +static ZEND_COLD void get_filename_lineno(int type, zend_string **filename, uint32_t *lineno) { /* Obtain relevant filename and lineno */ switch (type) { case E_CORE_ERROR: @@ -1479,16 +1479,11 @@ static ZEND_COLD void get_filename_lineno(int type, const char **filename, uint3 case E_USER_DEPRECATED: case E_RECOVERABLE_ERROR: if (zend_is_compiling()) { - *filename = ZSTR_VAL(zend_get_compiled_filename()); + *filename = zend_get_compiled_filename(); *lineno = zend_get_compiled_lineno(); } else if (zend_is_executing()) { - *filename = zend_get_executed_filename(); - if ((*filename)[0] == '[') { /* [no active file] */ - *filename = NULL; - *lineno = 0; - } else { - *lineno = zend_get_executed_lineno(); - } + *filename = zend_get_executed_filename_ex(); + *lineno = zend_get_executed_lineno(); } else { *filename = NULL; *lineno = 0; @@ -1500,12 +1495,12 @@ static ZEND_COLD void get_filename_lineno(int type, const char **filename, uint3 break; } if (!*filename) { - *filename = "Unknown"; + *filename = ZSTR_KNOWN(ZEND_STR_UNKNOWN_CAPITALIZED); } } ZEND_API ZEND_COLD void zend_error_at( - int type, const char *filename, uint32_t lineno, const char *format, ...) { + int type, zend_string *filename, uint32_t lineno, const char *format, ...) { va_list args; if (!filename) { @@ -1519,7 +1514,7 @@ ZEND_API ZEND_COLD void zend_error_at( } ZEND_API ZEND_COLD void zend_error(int type, const char *format, ...) { - const char *filename; + zend_string *filename; uint32_t lineno; va_list args; @@ -1530,7 +1525,7 @@ ZEND_API ZEND_COLD void zend_error(int type, const char *format, ...) { } ZEND_API ZEND_COLD void zend_error_unchecked(int type, const char *format, ...) { - const char *filename; + zend_string *filename; uint32_t lineno; va_list args; @@ -1541,7 +1536,7 @@ ZEND_API ZEND_COLD void zend_error_unchecked(int type, const char *format, ...) } ZEND_API ZEND_COLD ZEND_NORETURN void zend_error_at_noreturn( - int type, const char *filename, uint32_t lineno, const char *format, ...) + int type, zend_string *filename, uint32_t lineno, const char *format, ...) { va_list args; @@ -1559,7 +1554,7 @@ ZEND_API ZEND_COLD ZEND_NORETURN void zend_error_at_noreturn( ZEND_API ZEND_COLD ZEND_NORETURN void zend_error_noreturn(int type, const char *format, ...) { - const char *filename; + zend_string *filename; uint32_t lineno; va_list args; @@ -1572,7 +1567,7 @@ ZEND_API ZEND_COLD ZEND_NORETURN void zend_error_noreturn(int type, const char * } ZEND_API ZEND_COLD void zend_error_zstr(int type, zend_string *message) { - const char *filename; + zend_string *filename; uint32_t lineno; get_filename_lineno(type, &filename, &lineno); zend_error_impl(type, filename, lineno, message); diff --git a/Zend/zend.h b/Zend/zend.h index 2c2096f8e43..b1a7e5a0993 100644 --- a/Zend/zend.h +++ b/Zend/zend.h @@ -215,7 +215,7 @@ struct _zend_class_entry { }; typedef struct _zend_utility_functions { - void (*error_function)(int type, const char *error_filename, const uint32_t error_lineno, zend_string *message); + void (*error_function)(int type, zend_string *error_filename, const uint32_t error_lineno, zend_string *message); size_t (*printf_function)(const char *format, ...) ZEND_ATTRIBUTE_PTR_FORMAT(printf, 1, 2); size_t (*write_function)(const char *str, size_t str_length); FILE *(*fopen_function)(zend_string *filename, zend_string **opened_path); @@ -310,7 +310,7 @@ extern ZEND_API zend_write_func_t zend_write; extern ZEND_API FILE *(*zend_fopen)(zend_string *filename, zend_string **opened_path); extern ZEND_API void (*zend_ticks_function)(int ticks); extern ZEND_API void (*zend_interrupt_function)(zend_execute_data *execute_data); -extern ZEND_API void (*zend_error_cb)(int type, const char *error_filename, const uint32_t error_lineno, zend_string *message); +extern ZEND_API void (*zend_error_cb)(int type, zend_string *error_filename, const uint32_t error_lineno, zend_string *message); extern ZEND_API void (*zend_on_timeout)(int seconds); extern ZEND_API zend_result (*zend_stream_open_function)(zend_file_handle *handle); extern void (*zend_printf_to_smart_string)(smart_string *buf, const char *format, va_list ap); @@ -330,8 +330,8 @@ ZEND_API ZEND_COLD ZEND_NORETURN void zend_error_noreturn(int type, const char * /* For custom format specifiers like H */ ZEND_API ZEND_COLD void zend_error_unchecked(int type, const char *format, ...); /* If filename is NULL the default filename is used. */ -ZEND_API ZEND_COLD void zend_error_at(int type, const char *filename, uint32_t lineno, const char *format, ...) ZEND_ATTRIBUTE_FORMAT(printf, 4, 5); -ZEND_API ZEND_COLD ZEND_NORETURN void zend_error_at_noreturn(int type, const char *filename, uint32_t lineno, const char *format, ...) ZEND_ATTRIBUTE_FORMAT(printf, 4, 5); +ZEND_API ZEND_COLD void zend_error_at(int type, zend_string *filename, uint32_t lineno, const char *format, ...) ZEND_ATTRIBUTE_FORMAT(printf, 4, 5); +ZEND_API ZEND_COLD ZEND_NORETURN void zend_error_at_noreturn(int type, zend_string *filename, uint32_t lineno, const char *format, ...) ZEND_ATTRIBUTE_FORMAT(printf, 4, 5); ZEND_API ZEND_COLD void zend_error_zstr(int type, zend_string *message); ZEND_API ZEND_COLD void zend_throw_error(zend_class_entry *exception_ce, const char *format, ...) ZEND_ATTRIBUTE_FORMAT(printf, 2, 3); diff --git a/Zend/zend_exceptions.c b/Zend/zend_exceptions.c index add3bb50a4c..af3eacdf288 100644 --- a/Zend/zend_exceptions.c +++ b/Zend/zend_exceptions.c @@ -872,7 +872,7 @@ ZEND_API ZEND_COLD zend_object *zend_throw_error_exception(zend_class_entry *exc } /* }}} */ -static void zend_error_va(int type, const char *file, uint32_t lineno, const char *format, ...) /* {{{ */ +static void zend_error_va(int type, zend_string *file, uint32_t lineno, const char *format, ...) /* {{{ */ { va_list args; va_start(args, format); @@ -900,8 +900,8 @@ ZEND_API ZEND_COLD zend_result zend_exception_error(zend_object *ex, int severit zend_long line = zval_get_long(GET_PROPERTY_SILENT(&exception, ZEND_STR_LINE)); int type = (ce_exception == zend_ce_parse_error ? E_PARSE : E_COMPILE_ERROR) | E_DONT_BAIL; - zend_observer_error_notify(type, ZSTR_VAL(file), line, message); - zend_error_cb(type, ZSTR_VAL(file), line, message); + zend_observer_error_notify(type, file, line, message); + zend_error_cb(type, file, line, message); zend_string_release_ex(file, 0); zend_string_release_ex(message, 0); @@ -930,7 +930,7 @@ ZEND_API ZEND_COLD zend_result zend_exception_error(zend_object *ex, int severit line = zval_get_long(GET_PROPERTY_SILENT(&zv, ZEND_STR_LINE)); } - zend_error_va(E_WARNING, (file && ZSTR_LEN(file) > 0) ? ZSTR_VAL(file) : NULL, line, + zend_error_va(E_WARNING, (file && ZSTR_LEN(file) > 0) ? file : NULL, line, "Uncaught %s in exception handling during call to %s::__toString()", ZSTR_VAL(Z_OBJCE(zv)->name), ZSTR_VAL(ce_exception->name)); @@ -944,7 +944,7 @@ ZEND_API ZEND_COLD zend_result zend_exception_error(zend_object *ex, int severit line = zval_get_long(GET_PROPERTY_SILENT(&exception, ZEND_STR_LINE)); zend_error_va(severity | E_DONT_BAIL, - (file && ZSTR_LEN(file) > 0) ? ZSTR_VAL(file) : NULL, line, + (file && ZSTR_LEN(file) > 0) ? file : NULL, line, "Uncaught %s\n thrown", ZSTR_VAL(str)); zend_string_release_ex(str, 0); diff --git a/Zend/zend_observer.c b/Zend/zend_observer.c index 2bb7f9afa2a..2c515c40ede 100644 --- a/Zend/zend_observer.c +++ b/Zend/zend_observer.c @@ -245,7 +245,7 @@ ZEND_API void zend_observer_error_register(zend_observer_error_cb cb) zend_llist_add_element(&zend_observer_error_callbacks, &cb); } -void zend_observer_error_notify(int type, const char *error_filename, uint32_t error_lineno, zend_string *message) +void zend_observer_error_notify(int type, zend_string *error_filename, uint32_t error_lineno, zend_string *message) { zend_llist_element *element; zend_observer_error_cb callback; diff --git a/Zend/zend_observer.h b/Zend/zend_observer.h index cb29729ec45..40f0b384a24 100644 --- a/Zend/zend_observer.h +++ b/Zend/zend_observer.h @@ -72,10 +72,10 @@ ZEND_API void ZEND_FASTCALL zend_observer_fcall_end( ZEND_API void zend_observer_fcall_end_all(void); -typedef void (*zend_observer_error_cb)(int type, const char *error_filename, uint32_t error_lineno, zend_string *message); +typedef void (*zend_observer_error_cb)(int type, zend_string *error_filename, uint32_t error_lineno, zend_string *message); ZEND_API void zend_observer_error_register(zend_observer_error_cb callback); -void zend_observer_error_notify(int type, const char *error_filename, uint32_t error_lineno, zend_string *message); +void zend_observer_error_notify(int type, zend_string *error_filename, uint32_t error_lineno, zend_string *message); END_EXTERN_C() diff --git a/Zend/zend_string.h b/Zend/zend_string.h index f90eac7f87a..b0205bd32d4 100644 --- a/Zend/zend_string.h +++ b/Zend/zend_string.h @@ -505,6 +505,7 @@ EMPTY_SWITCH_DEFAULT_CASE() _(ZEND_STR_PAAMAYIM_NEKUDOTAYIM, "::") \ _(ZEND_STR_ARGS, "args") \ _(ZEND_STR_UNKNOWN, "unknown") \ + _(ZEND_STR_UNKNOWN_CAPITALIZED, "Unknown") \ _(ZEND_STR_EVAL, "eval") \ _(ZEND_STR_INCLUDE, "include") \ _(ZEND_STR_REQUIRE, "require") \ diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c index 6829fc8fc44..de1a75e5aa5 100644 --- a/ext/opcache/ZendAccelerator.c +++ b/ext/opcache/ZendAccelerator.c @@ -122,7 +122,7 @@ static zend_class_entry* (*accelerator_orig_inheritance_cache_get)(zend_class_en static zend_class_entry* (*accelerator_orig_inheritance_cache_add)(zend_class_entry *ce, zend_class_entry *proto, zend_class_entry *parent, zend_class_entry **traits_and_interfaces, HashTable *dependencies); static zend_result (*accelerator_orig_zend_stream_open_function)(zend_file_handle *handle ); static zend_string *(*accelerator_orig_zend_resolve_path)(zend_string *filename); -static void (*accelerator_orig_zend_error_cb)(int type, const char *error_filename, const uint32_t error_lineno, zend_string *message); +static void (*accelerator_orig_zend_error_cb)(int type, zend_string *error_filename, const uint32_t error_lineno, zend_string *message); static zif_handler orig_chdir = NULL; static ZEND_INI_MH((*orig_include_path_on_modify)) = NULL; static zend_result (*orig_post_startup_cb)(void); @@ -1686,12 +1686,12 @@ static void zend_accel_set_auto_globals(int mask) ZCG(auto_globals_mask) |= mask; } -static void persistent_error_cb(int type, const char *error_filename, const uint32_t error_lineno, zend_string *message) { +static void persistent_error_cb(int type, zend_string *error_filename, const uint32_t error_lineno, zend_string *message) { if (ZCG(record_warnings)) { zend_recorded_warning *warning = emalloc(sizeof(zend_recorded_warning)); warning->type = type; warning->error_lineno = error_lineno; - warning->error_filename = zend_string_init(error_filename, strlen(error_filename), 0); + warning->error_filename = zend_string_copy(error_filename); warning->error_message = zend_string_copy(message); ZCG(num_warnings)++; @@ -1705,7 +1705,7 @@ static void replay_warnings(zend_persistent_script *script) { for (uint32_t i = 0; i < script->num_warnings; i++) { zend_recorded_warning *warning = script->warnings[i]; accelerator_orig_zend_error_cb( - warning->type, ZSTR_VAL(warning->error_filename), warning->error_lineno, + warning->type, warning->error_filename, warning->error_lineno, warning->error_message); } } @@ -4084,13 +4084,13 @@ static void preload_link(void) if (!(ce->ce_flags & ZEND_ACC_ANON_CLASS) && zend_hash_exists(EG(class_table), key)) { zend_error_at( - E_WARNING, ZSTR_VAL(ce->info.user.filename), ce->info.user.line_start, + E_WARNING, ce->info.user.filename, ce->info.user.line_start, "Can't preload already declared class %s", ZSTR_VAL(ce->name)); } else { const char *kind, *name; get_unlinked_dependency(ce, &kind, &name); zend_error_at( - E_WARNING, ZSTR_VAL(ce->info.user.filename), ce->info.user.line_start, + E_WARNING, ce->info.user.filename, ce->info.user.line_start, "Can't preload unlinked class %s: %s%s", ZSTR_VAL(ce->name), kind, name); } diff --git a/ext/soap/soap.c b/ext/soap/soap.c index 1d25373fc65..a50718d4cd6 100644 --- a/ext/soap/soap.c +++ b/ext/soap/soap.c @@ -68,7 +68,7 @@ static void delete_service(void *service); static void delete_url(void *handle); static void delete_hashtable(void *hashtable); -static void soap_error_handler(int error_num, const char *error_filename, const uint32_t error_lineno, zend_string *message); +static void soap_error_handler(int error_num, zend_string *error_filename, const uint32_t error_lineno, zend_string *message); #define SOAP_SERVER_BEGIN_CODE() \ bool _old_handler = SOAP_GLOBAL(use_soap_error_handler);\ @@ -164,7 +164,7 @@ zend_class_entry* soap_var_class_entry; ZEND_DECLARE_MODULE_GLOBALS(soap) -static void (*old_error_handler)(int, const char *, const uint32_t, zend_string *); +static void (*old_error_handler)(int, zend_string *, const uint32_t, zend_string *); PHP_RINIT_FUNCTION(soap); PHP_MINIT_FUNCTION(soap); @@ -1799,7 +1799,7 @@ static ZEND_NORETURN void soap_server_fault(char* code, char* string, char *acto } /* }}} */ -static zend_never_inline ZEND_COLD void soap_real_error_handler(int error_num, const char *error_filename, const uint32_t error_lineno, zend_string *message) /* {{{ */ +static zend_never_inline ZEND_COLD void soap_real_error_handler(int error_num, zend_string *error_filename, const uint32_t error_lineno, zend_string *message) /* {{{ */ { bool _old_in_compilation; zend_execute_data *_old_current_execute_data; @@ -1900,7 +1900,7 @@ static zend_never_inline ZEND_COLD void soap_real_error_handler(int error_num, c } /* }}} */ -static void soap_error_handler(int error_num, const char *error_filename, const uint32_t error_lineno, zend_string *message) /* {{{ */ +static void soap_error_handler(int error_num, zend_string *error_filename, const uint32_t error_lineno, zend_string *message) /* {{{ */ { if (EXPECTED(!SOAP_GLOBAL(use_soap_error_handler))) { old_error_handler(error_num, error_filename, error_lineno, message); diff --git a/main/main.c b/main/main.c index 734a1e9ed2a..1988f3855a8 100644 --- a/main/main.c +++ b/main/main.c @@ -1151,7 +1151,7 @@ static void clear_last_error() { #if ZEND_DEBUG /* {{{ report_zend_debug_error_notify_cb */ -static void report_zend_debug_error_notify_cb(int type, const char *error_filename, uint32_t error_lineno, zend_string *message) +static void report_zend_debug_error_notify_cb(int type, zend_string *error_filename, uint32_t error_lineno, zend_string *message) { if (PG(report_zend_debug)) { bool trigger_break; @@ -1168,7 +1168,7 @@ static void report_zend_debug_error_notify_cb(int type, const char *error_filena break; } - zend_output_debug_string(trigger_break, "%s(%" PRIu32 ") : %s", error_filename, error_lineno, ZSTR_VAL(message)); + zend_output_debug_string(trigger_break, "%s(%" PRIu32 ") : %s", ZSTR_VAL(error_filename), error_lineno, ZSTR_VAL(message)); } } /* }}} */ @@ -1176,7 +1176,7 @@ static void report_zend_debug_error_notify_cb(int type, const char *error_filena /* {{{ php_error_cb extended error handling function */ -static ZEND_COLD void php_error_cb(int orig_type, const char *error_filename, const uint32_t error_lineno, zend_string *message) +static ZEND_COLD void php_error_cb(int orig_type, zend_string *error_filename, const uint32_t error_lineno, zend_string *message) { bool display; int type = orig_type & E_ALL; @@ -1188,7 +1188,7 @@ static ZEND_COLD void php_error_cb(int orig_type, const char *error_filename, co if (zend_string_equals(PG(last_error_message), message) || (!PG(ignore_repeated_source) && ((PG(last_error_lineno) != (int)error_lineno) - || strcmp(PG(last_error_file), error_filename)))) { + || strcmp(PG(last_error_file), ZSTR_VAL(error_filename))))) { display = 1; } else { display = 0; @@ -1223,11 +1223,11 @@ static ZEND_COLD void php_error_cb(int orig_type, const char *error_filename, co if (display) { clear_last_error(); if (!error_filename) { - error_filename = "Unknown"; + error_filename = ZSTR_KNOWN(ZEND_STR_UNKNOWN_CAPITALIZED); } PG(last_error_type) = type; PG(last_error_message) = zend_string_copy(message); - PG(last_error_file) = strdup(error_filename); + PG(last_error_file) = strdup(ZSTR_VAL(error_filename)); PG(last_error_lineno) = error_lineno; } @@ -1287,14 +1287,14 @@ static ZEND_COLD void php_error_cb(int orig_type, const char *error_filename, co syslog(LOG_ALERT, "PHP %s: %s (%s)", error_type_str, ZSTR_VAL(message), GetCommandLine()); } #endif - spprintf(&log_buffer, 0, "PHP %s: %s in %s on line %" PRIu32, error_type_str, ZSTR_VAL(message), error_filename, error_lineno); + spprintf(&log_buffer, 0, "PHP %s: %s in %s on line %" PRIu32, error_type_str, ZSTR_VAL(message), ZSTR_VAL(error_filename), error_lineno); php_log_err_with_severity(log_buffer, syslog_type_int); efree(log_buffer); } if (PG(display_errors) && ((module_initialized && !PG(during_request_startup)) || (PG(display_startup_errors)))) { if (PG(xmlrpc_errors)) { - php_printf("faultCode" ZEND_LONG_FMT "faultString%s:%s in %s on line %" PRIu32 "", PG(xmlrpc_error_number), error_type_str, ZSTR_VAL(message), error_filename, error_lineno); + php_printf("faultCode" ZEND_LONG_FMT "faultString%s:%s in %s on line %" PRIu32 "", PG(xmlrpc_error_number), error_type_str, ZSTR_VAL(message), ZSTR_VAL(error_filename), error_lineno); } else { char *prepend_string = INI_STR("error_prepend_string"); char *append_string = INI_STR("error_append_string"); @@ -1302,22 +1302,22 @@ static ZEND_COLD void php_error_cb(int orig_type, const char *error_filename, co if (PG(html_errors)) { if (type == E_ERROR || type == E_PARSE) { zend_string *buf = escape_html(ZSTR_VAL(message), ZSTR_LEN(message)); - php_printf("%s
\n%s: %s in %s on line %" PRIu32 "
\n%s", STR_PRINT(prepend_string), error_type_str, ZSTR_VAL(buf), error_filename, error_lineno, STR_PRINT(append_string)); + php_printf("%s
\n%s: %s in %s on line %" PRIu32 "
\n%s", STR_PRINT(prepend_string), error_type_str, ZSTR_VAL(buf), ZSTR_VAL(error_filename), error_lineno, STR_PRINT(append_string)); zend_string_free(buf); } else { - php_printf("%s
\n%s: %s in %s on line %" PRIu32 "
\n%s", STR_PRINT(prepend_string), error_type_str, ZSTR_VAL(message), error_filename, error_lineno, STR_PRINT(append_string)); + php_printf("%s
\n%s: %s in %s on line %" PRIu32 "
\n%s", STR_PRINT(prepend_string), error_type_str, ZSTR_VAL(message), ZSTR_VAL(error_filename), error_lineno, STR_PRINT(append_string)); } } else { /* Write CLI/CGI errors to stderr if display_errors = "stderr" */ if ((!strcmp(sapi_module.name, "cli") || !strcmp(sapi_module.name, "cgi") || !strcmp(sapi_module.name, "phpdbg")) && PG(display_errors) == PHP_DISPLAY_ERRORS_STDERR ) { - fprintf(stderr, "%s: %s in %s on line %" PRIu32 "\n", error_type_str, ZSTR_VAL(message), error_filename, error_lineno); + fprintf(stderr, "%s: %s in %s on line %" PRIu32 "\n", error_type_str, ZSTR_VAL(message), ZSTR_VAL(error_filename), error_lineno); #ifdef PHP_WIN32 fflush(stderr); #endif } else { - php_printf("%s\n%s: %s in %s on line %" PRIu32 "\n%s", STR_PRINT(prepend_string), error_type_str, ZSTR_VAL(message), error_filename, error_lineno, STR_PRINT(append_string)); + php_printf("%s\n%s: %s in %s on line %" PRIu32 "\n%s", STR_PRINT(prepend_string), error_type_str, ZSTR_VAL(message), ZSTR_VAL(error_filename), error_lineno, STR_PRINT(append_string)); } } }