From: Michael Wallner Date: Wed, 16 Feb 2005 16:58:51 +0000 (+0000) Subject: * fix fatal erealloc error X-Git-Tag: RELEASE_0_5_0~16 X-Git-Url: https://git.m6w6.name/?a=commitdiff_plain;h=6564b507fceb20fd8065d839cf8ec0091a7c4627;p=m6w6%2Fext-http * fix fatal erealloc error --- diff --git a/http_api.c b/http_api.c index 238dd5a..b099b5a 100644 --- a/http_api.c +++ b/http_api.c @@ -1112,39 +1112,38 @@ PHP_HTTP_API void _http_ob_etaghandler(char *output, uint output_len, /* }}} */ /* {{{ STATUS http_start_ob_handler(php_output_handler_func_t, char *, uint, zend_bool) */ -PHP_HTTP_API STATUS _http_start_ob_handler(php_output_handler_func_t handler_func, +PHP_HTTP_API STATUS _http_start_ob_handler(php_output_handler_func_t handler_func, char *handler_name, uint chunk_size, zend_bool erase TSRMLS_DC) { php_ob_buffer **stack; int count, i; - STATUS result; - - count = OG(ob_nesting_level); - stack = emalloc(sizeof(php_ob_buffer *) * count); - if (count > 1) { - zend_stack_apply_with_argument(&OG(ob_buffers), ZEND_STACK_APPLY_BOTTOMUP, - (int (*)(void *elem, void *)) http_ob_stack_get, stack); - } - - if (count > 0) { - http_ob_stack_get(&OG(active_ob_buffer), stack); - } - - while (OG(ob_nesting_level)) { - php_end_ob_buffer(0, 0 TSRMLS_CC); + if (count = OG(ob_nesting_level)) { + stack = ecalloc(sizeof(php_ob_buffer), count); + + if (count > 1) { + zend_stack_apply_with_argument(&OG(ob_buffers), ZEND_STACK_APPLY_BOTTOMUP, + (int (*)(void *elem, void *)) http_ob_stack_get, stack); + } + + if (count > 0) { + http_ob_stack_get(&OG(active_ob_buffer), stack); + } + + while (OG(ob_nesting_level)) { + php_end_ob_buffer(0, 0 TSRMLS_CC); + } } - php_ob_set_internal_handler(handler_func, 0, handler_name, 0 TSRMLS_CC); - result = php_start_ob_buffer_named(handler_name, chunk_size, erase TSRMLS_CC); - + php_ob_set_internal_handler(handler_func, chunk_size, handler_name, erase TSRMLS_CC); + for (i = 0; i < count; i++) { php_ob_buffer *s = stack[i]; php_start_ob_buffer_named(s->handler_name, s->chunk_size, s->erase TSRMLS_CC); php_body_write(s->buffer, s->text_length TSRMLS_CC); } - - return result; + + return SUCCESS; } /* }}} */