Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Fix GH-19685: Segfault when bzip2 filter has invalid parameters #19702

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
alexandre-daubois wants to merge 1 commit into php:PHP-8.3
base: PHP-8.3
Choose a base branch
Loading
from alexandre-daubois:stream-append-bz2-failure
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions NEWS
View file Open in desktop
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,10 @@ PHP NEWS
. Fixed bug GH-19613 (Stale array iterator pointer). (ilutov)
. Fixed bug GH-19679 (zend_ssa_range_widening may fail to converge). (Arnaud)

- Bz2:
. Fixed bug GH-19685 (Segfault when bzip2 filter has invalid parameters).
(alexandre-daubois)

- Date:
. Fixed date_sunrise() and date_sunset() with partial-hour UTC offset.
(ilutov)
Expand Down
8 changes: 8 additions & 0 deletions ext/bz2/bz2_filter.c
View file Open in desktop
Original file line number Diff line number Diff line change
Expand Up @@ -367,6 +367,10 @@ static php_stream_filter *php_bz2_filter_create(const char *filtername, zval *fi
zend_long blocks = zval_get_long(tmpzval);
if (blocks < 1 || blocks > 9) {
php_error_docref(NULL, E_WARNING, "Invalid parameter given for number of blocks to allocate (" ZEND_LONG_FMT ")", blocks);
pefree(data->strm.next_in, persistent);
Copy link
Member

@devnexen devnexen Sep 4, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: only if you want, on master only maybe, making a goto label to cover the 3 cases.

alexandre-daubois reacted with eyes emoji
pefree(data->strm.next_out, persistent);
pefree(data, persistent);
return NULL;
} else {
blockSize100k = (int) blocks;
}
Expand All @@ -377,6 +381,10 @@ static php_stream_filter *php_bz2_filter_create(const char *filtername, zval *fi
zend_long work = zval_get_long(tmpzval);
if (work < 0 || work > 250) {
php_error_docref(NULL, E_WARNING, "Invalid parameter given for work factor (" ZEND_LONG_FMT ")", work);
pefree(data->strm.next_in, persistent);
pefree(data->strm.next_out, persistent);
pefree(data, persistent);
return NULL;
} else {
workFactor = (int) work;
}
Expand Down
2 changes: 2 additions & 0 deletions ext/bz2/tests/bug72447.phpt
View file Open in desktop
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,5 @@ unlink('testfile');
?>
--EXPECTF--
Warning: stream_filter_append(): Invalid parameter given for number of blocks to allocate (0) in %s%ebug72447.php on line %d

Warning: stream_filter_append(): Unable to create or locate filter "bzip2.compress" in %s%ebug72447.php on line %d
46 changes: 46 additions & 0 deletions ext/bz2/tests/bz2_filter_invalid_params.phpt
View file Open in desktop
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
--TEST--
GH-19685: bzip2.compress filter with invalid parameters should fail gracefully
--EXTENSIONS--
bz2
--FILE--
<?php
$stream = fopen('php://memory', 'w+');

// too low
$filter = stream_filter_append($stream, 'bzip2.compress', STREAM_FILTER_WRITE, array('blocks' => 0));
var_dump($filter);

// too high
$filter = stream_filter_append($stream, 'bzip2.compress', STREAM_FILTER_WRITE, array('blocks' => 10));
var_dump($filter);

// too low work
$filter = stream_filter_append($stream, 'bzip2.compress', STREAM_FILTER_WRITE, array('work' => -1));
var_dump($filter);

// too high work
$filter = stream_filter_append($stream, 'bzip2.compress', STREAM_FILTER_WRITE, array('work' => 251));
var_dump($filter);

fclose($stream);
?>
--EXPECTF--
Warning: stream_filter_append(): Invalid parameter given for number of blocks to allocate (0) in %s on line %d

Warning: stream_filter_append(): Unable to create or locate filter "bzip2.compress" in %s on line %d
bool(false)

Warning: stream_filter_append(): Invalid parameter given for number of blocks to allocate (10) in %s on line %d

Warning: stream_filter_append(): Unable to create or locate filter "bzip2.compress" in %s on line %d
bool(false)

Warning: stream_filter_append(): Invalid parameter given for work factor (-1) in %s on line %d

Warning: stream_filter_append(): Unable to create or locate filter "bzip2.compress" in %s on line %d
bool(false)

Warning: stream_filter_append(): Invalid parameter given for work factor (251) in %s on line %d

Warning: stream_filter_append(): Unable to create or locate filter "bzip2.compress" in %s on line %d
bool(false)
Loading

AltStyle によって変換されたページ (->オリジナル) /