Clear handler status flag in handler init

Closes GH-13087
This commit is contained in:
haszi 2024-01-07 22:16:26 +01:00 committed by Jakub Zelenka
parent 6647d5f609
commit 3ce7bf2a77
No known key found for this signature in database
GPG key ID: 1C0779DC5C0A9DE4
5 changed files with 42 additions and 2 deletions

3
NEWS
View file

@ -73,6 +73,9 @@ PHP NEWS
. Added X509_PURPOSE_OCSP_HELPER and X509_PURPOSE_TIMESTAMP_SIGN constants.
(Vincent Jardin)
- Output:
. Clear output handler status flags during handler initialization. (haszi)
- PDO:
. Fixed setAttribute and getAttribute. (SakiTakamachi)
. Implemented PDO driver-specific subclasses RFC. (danack, kocsismate)

View file

@ -313,6 +313,10 @@ PHP 8.4 UPGRADE NOTES
. New serial_hex parameter added to openssl_csr_sign to allow setting serial
number in the hexadecimal format.
- Output:
. Output handler status flags passed to the flags parameter of ob_start
are now cleared.
- PDO:
. getAttribute, enabled to get the value of ATTR_STRINGIFY_FETCHES.

View file

@ -478,7 +478,7 @@ PHPAPI php_output_handler *php_output_handler_create_user(zval *output_handler,
default:
user = ecalloc(1, sizeof(php_output_handler_user_func_t));
if (SUCCESS == zend_fcall_info_init(output_handler, 0, &user->fci, &user->fcc, &handler_name, &error)) {
handler = php_output_handler_init(handler_name, chunk_size, (flags & ~0xf) | PHP_OUTPUT_HANDLER_USER);
handler = php_output_handler_init(handler_name, chunk_size, PHP_OUTPUT_HANDLER_ABILITY_FLAGS(flags) | PHP_OUTPUT_HANDLER_USER);
ZVAL_COPY(&user->zoh, output_handler);
handler->func.user = user;
} else {
@ -504,7 +504,7 @@ PHPAPI php_output_handler *php_output_handler_create_internal(const char *name,
php_output_handler *handler;
zend_string *str = zend_string_init(name, name_len, 0);
handler = php_output_handler_init(str, chunk_size, (flags & ~0xf) | PHP_OUTPUT_HANDLER_INTERNAL);
handler = php_output_handler_init(str, chunk_size, PHP_OUTPUT_HANDLER_ABILITY_FLAGS(flags) | PHP_OUTPUT_HANDLER_INTERNAL);
handler->func.internal = output_handler;
zend_string_release_ex(str, 0);

View file

@ -43,6 +43,8 @@
#define PHP_OUTPUT_HANDLER_DISABLED 0x2000
#define PHP_OUTPUT_HANDLER_PROCESSED 0x4000
#define PHP_OUTPUT_HANDLER_ABILITY_FLAGS(bitmask) ((bitmask) & ~0xf00f)
/* handler op return values */
typedef enum _php_output_handler_status_t {
PHP_OUTPUT_HANDLER_FAILURE,

View file

@ -0,0 +1,31 @@
--TEST--
ob_start(): Ensure that user supplied handler type and status flags are erased
--FILE--
<?php
define('PHP_OUTPUT_HANDLER_TYPE_INTERNAL', 0);
define('PHP_OUTPUT_HANDLER_TYPE_USER', 1);
ob_start(
fn ($s) => $s,
0,
PHP_OUTPUT_HANDLER_STDFLAGS |
PHP_OUTPUT_HANDLER_TYPE_INTERNAL |
PHP_OUTPUT_HANDLER_STARTED |
PHP_OUTPUT_HANDLER_DISABLED |
PHP_OUTPUT_HANDLER_PROCESSED
);
$bitmask = ob_get_status()['flags'];
var_dump($bitmask & PHP_OUTPUT_HANDLER_STDFLAGS);
var_dump($bitmask & PHP_OUTPUT_HANDLER_TYPE_USER);
var_dump($bitmask & PHP_OUTPUT_HANDLER_STARTED);
var_dump($bitmask & PHP_OUTPUT_HANDLER_DISABLED);
var_dump($bitmask & PHP_OUTPUT_HANDLER_PROCESSED);
?>
--EXPECT--
int(112)
int(1)
int(0)
int(0)
int(0)