Fix calculation of aligned buffer size

As is, for requested size which are already aligned, we over-allocate,
so we fix this.  We also fix the allocation for chunk size 1.

This issue has been reported by @kkmuffme.

Thanks to @iluuu1994 for improving the fix!

Closes GH-16161.
This commit is contained in:
Christoph M. Becker 2024-10-03 12:24:36 +02:00
parent 4d3240261d
commit a1d4595d65
No known key found for this signature in database
GPG Key ID: D66C9593118BCCB6
3 changed files with 32 additions and 2 deletions

3
NEWS
View File

@ -5,6 +5,9 @@ PHP NEWS
- DOM:
. Added Dom\Element::$outerHTML. (nielsdos)
- Output:
. Fixed calculation of aligned buffer size. (cmb)
- PDO_PGSQL:
. Added Iterable support for PDO::pgsqlCopyFromArray. (KentarouTakeda)
. Implement GH-15387 Pdo\Pgsql::setAttribute(PDO::ATTR_PREFETCH, 0) or

View File

@ -81,8 +81,8 @@ typedef enum _php_output_handler_hook_t {
} php_output_handler_hook_t;
#define PHP_OUTPUT_HANDLER_INITBUF_SIZE(s) \
( ((s) > 1) ? \
(s) + PHP_OUTPUT_HANDLER_ALIGNTO_SIZE - ((s) % (PHP_OUTPUT_HANDLER_ALIGNTO_SIZE)) : \
( ((s) > 0) ? \
ZEND_MM_ALIGNED_SIZE_EX(s, PHP_OUTPUT_HANDLER_ALIGNTO_SIZE) : \
PHP_OUTPUT_HANDLER_DEFAULT_SIZE \
)
#define PHP_OUTPUT_HANDLER_ALIGNTO_SIZE 0x1000

27
tests/output/gh16135.phpt Normal file
View File

@ -0,0 +1,27 @@
--TEST--
GH-16135: output buffer over-allocated for aligned chunk sizes
--FILE--
<?php
ob_start(null, 0);
ob_start(null, 1);
ob_start(null, 2);
ob_start(null, 8191);
ob_start(null, 8192);
ob_start(null, 8193);
var_dump(array_map(fn ($s) => $s["buffer_size"], ob_get_status(true)));
?>
--EXPECT--
array(6) {
[0]=>
int(16384)
[1]=>
int(4096)
[2]=>
int(4096)
[3]=>
int(8192)
[4]=>
int(8192)
[5]=>
int(12288)
}