fix crash with display_startup_errors=1

This commit is contained in:
Michael Wallner 2012-01-25 17:22:46 +00:00
parent 0116466974
commit bfccc4ed58
2 changed files with 31 additions and 6 deletions

View File

@ -85,6 +85,18 @@ static inline void php_output_init_globals(zend_output_globals *G)
}
/* }}} */
/* {{{ stderr writer if not PHP_OUTPUT_ACTIVATED */
static int php_output_stderr(const char *str, size_t str_len)
{
fwrite(str, 1, str_len, stderr);
/* See http://support.microsoft.com/kb/190351 */
#ifdef PHP_WIN32
fflush(stderr);
#endif
return str_len;
}
/* }}} */
/* {{{ void php_output_startup(void)
* Set up module globals and initalize the conflict and reverse conflict hash tables */
PHPAPI void php_output_startup(void)
@ -117,6 +129,7 @@ PHPAPI int php_output_activate(TSRMLS_D)
#endif
zend_stack_init(&OG(handlers));
OG(flags) |= PHP_OUTPUT_ACTIVATED;
return SUCCESS;
}
@ -139,6 +152,8 @@ PHPAPI void php_output_deactivate(TSRMLS_D)
}
zend_stack_destroy(&OG(handlers));
}
OG(flags) ^= PHP_OUTPUT_ACTIVATED;
}
/* }}} */
@ -174,9 +189,11 @@ PHPAPI void php_output_set_status(int status TSRMLS_DC)
* Get output control status */
PHPAPI int php_output_get_status(TSRMLS_D)
{
return OG(flags)
| (OG(active) ? PHP_OUTPUT_ACTIVE : 0)
| (OG(running)? PHP_OUTPUT_LOCKED : 0);
return (
OG(flags)
| (OG(active) ? PHP_OUTPUT_ACTIVE : 0)
| (OG(running)? PHP_OUTPUT_LOCKED : 0)
) & 0xff;
}
/* }}} */
@ -187,7 +204,10 @@ PHPAPI int php_output_write_unbuffered(const char *str, size_t len TSRMLS_DC)
if (OG(flags) & PHP_OUTPUT_DISABLED) {
return 0;
}
return sapi_module.ub_write(str, len TSRMLS_CC);
if (OG(flags) & PHP_OUTPUT_ACTIVATED) {
return sapi_module.ub_write(str, len TSRMLS_CC);
}
return php_output_stderr(str, len);
}
/* }}} */
@ -198,8 +218,11 @@ PHPAPI int php_output_write(const char *str, size_t len TSRMLS_DC)
if (OG(flags) & PHP_OUTPUT_DISABLED) {
return 0;
}
php_output_op(PHP_OUTPUT_HANDLER_WRITE, str, len TSRMLS_CC);
return (int) len;
if (OG(flags) & PHP_OUTPUT_ACTIVATED) {
php_output_op(PHP_OUTPUT_HANDLER_WRITE, str, len TSRMLS_CC);
return (int) len;
}
return php_output_stderr(str, len);
}
/* }}} */

View File

@ -67,6 +67,8 @@ typedef enum _php_output_handler_status_t {
/* supplementary flags for php_output_get_status() */
#define PHP_OUTPUT_ACTIVE 0x10
#define PHP_OUTPUT_LOCKED 0x20
/* output layer is ready to use */
#define PHP_OUTPUT_ACTIVATED 0x100000
/* handler hooks */
typedef enum _php_output_handler_hook_t {