Skip to content

Commit b1340dd

Browse files
committed
inital fix
1 parent 3291dea commit b1340dd

4 files changed

Lines changed: 56 additions & 22 deletions

File tree

NEWS

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,7 @@ PHP NEWS
199199

200200
- Zlib:
201201
. deflate_init() now raises a TypeError when the value for option
202-
"strategy" is not of type int. (Weilin Du)
202+
"level", "memory", "window", or "strategy" is not of type int.
203+
(Weilin Du)
203204

204205
<<< NOTE: Insert NEWS from last stable release here prior to actual release! >>>

UPGRADING

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ PHP 8.6 UPGRADE NOTES
103103

104104
- Zlib:
105105
. deflate_init() now raises a TypeError when the value for option
106-
"strategy" is not of type int.
106+
"level", "memory", "window", or "strategy" is not of type int.
107107

108108
========================================
109109
2. New Features
Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,28 @@
11
--TEST--
2-
deflate_init(): strategy option type validation
2+
deflate_init(): options type validation
33
--EXTENSIONS--
44
zlib
55
--FILE--
66
<?php
77

8+
try {
9+
deflate_init(ZLIB_ENCODING_DEFLATE, ['level' => []]);
10+
} catch (TypeError $e) {
11+
echo $e->getMessage(), PHP_EOL;
12+
}
13+
14+
try {
15+
deflate_init(ZLIB_ENCODING_DEFLATE, ['memory' => []]);
16+
} catch (TypeError $e) {
17+
echo $e->getMessage(), PHP_EOL;
18+
}
19+
20+
try {
21+
deflate_init(ZLIB_ENCODING_DEFLATE, ['window' => []]);
22+
} catch (TypeError $e) {
23+
echo $e->getMessage(), PHP_EOL;
24+
}
25+
826
try {
927
deflate_init(ZLIB_ENCODING_DEFLATE, ['strategy' => []]);
1028
} catch (TypeError $e) {
@@ -13,4 +31,7 @@ try {
1331

1432
?>
1533
--EXPECT--
34+
deflate_init(): Argument #2 ($options) the value for option "level" must be of type int, array given
35+
deflate_init(): Argument #2 ($options) the value for option "memory" must be of type int, array given
36+
deflate_init(): Argument #2 ($options) the value for option "window" must be of type int, array given
1637
deflate_init(): Argument #2 ($options) the value for option "strategy" must be of type int, array given

ext/zlib/zlib.c

Lines changed: 31 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -854,6 +854,29 @@ static bool zlib_create_dictionary_string(HashTable *options, char **dict, size_
854854
return true;
855855
}
856856

857+
static bool zlib_get_long_option(HashTable *options, const char *option_name, size_t option_name_len, zend_long *value)
858+
{
859+
zval *option_buffer;
860+
bool failed = false;
861+
862+
if (!options || (option_buffer = zend_hash_str_find(options, option_name, option_name_len)) == NULL) {
863+
return true;
864+
}
865+
866+
ZVAL_DEINDIRECT(option_buffer);
867+
*value = zval_try_get_long(option_buffer, &failed);
868+
if (UNEXPECTED(failed)) {
869+
zend_argument_type_error(
870+
2,
871+
"the value for option \"%.*s\" must be of type int, %s given",
872+
(int) option_name_len, option_name, zend_zval_value_name(option_buffer)
873+
);
874+
return false;
875+
}
876+
877+
return true;
878+
}
879+
857880
/* {{{ Initialize an incremental inflate context with the specified encoding */
858881
PHP_FUNCTION(inflate_init)
859882
{
@@ -1081,48 +1104,37 @@ PHP_FUNCTION(deflate_init)
10811104
char *dict = NULL;
10821105
size_t dictlen = 0;
10831106
HashTable *options = NULL;
1084-
zval *option_buffer;
10851107

10861108
if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS(), "l|H", &encoding, &options)) {
10871109
RETURN_THROWS();
10881110
}
10891111

1090-
if (options && (option_buffer = zend_hash_str_find(options, ZEND_STRL("level"))) != NULL) {
1091-
ZVAL_DEINDIRECT(option_buffer);
1092-
level = zval_get_long(option_buffer);
1112+
if (!zlib_get_long_option(options, ZEND_STRL("level"), &level)) {
1113+
RETURN_THROWS();
10931114
}
10941115
if (level < -1 || level > 9) {
10951116
zend_value_error("deflate_init(): \"level\" option must be between -1 and 9");
10961117
RETURN_THROWS();
10971118
}
10981119

1099-
if (options && (option_buffer = zend_hash_str_find(options, ZEND_STRL("memory"))) != NULL) {
1100-
ZVAL_DEINDIRECT(option_buffer);
1101-
memory = zval_get_long(option_buffer);
1120+
if (!zlib_get_long_option(options, ZEND_STRL("memory"), &memory)) {
1121+
RETURN_THROWS();
11021122
}
11031123
if (memory < 1 || memory > 9) {
11041124
zend_value_error("deflate_init(): \"memory\" option must be between 1 and 9");
11051125
RETURN_THROWS();
11061126
}
11071127

1108-
if (options && (option_buffer = zend_hash_str_find(options, ZEND_STRL("window"))) != NULL) {
1109-
ZVAL_DEINDIRECT(option_buffer);
1110-
window = zval_get_long(option_buffer);
1128+
if (!zlib_get_long_option(options, ZEND_STRL("window"), &window)) {
1129+
RETURN_THROWS();
11111130
}
11121131
if (window < 8 || window > 15) {
11131132
zend_value_error("deflate_init(): \"window\" option must be between 8 and 15");
11141133
RETURN_THROWS();
11151134
}
11161135

1117-
if (options && (option_buffer = zend_hash_str_find(options, ZEND_STRL("strategy"))) != NULL) {
1118-
bool failed = false;
1119-
1120-
ZVAL_DEINDIRECT(option_buffer);
1121-
strategy = zval_try_get_long(option_buffer, &failed);
1122-
if (UNEXPECTED(failed)) {
1123-
zend_argument_type_error(2, "the value for option \"strategy\" must be of type int, %s given", zend_zval_value_name(option_buffer));
1124-
RETURN_THROWS();
1125-
}
1136+
if (!zlib_get_long_option(options, ZEND_STRL("strategy"), &strategy)) {
1137+
RETURN_THROWS();
11261138
}
11271139
switch (strategy) {
11281140
case Z_FILTERED:

0 commit comments

Comments
 (0)