@@ -247,7 +247,7 @@ PHP_FUNCTION(http_build_query)
247247}
248248/* }}} */
249249
250- static zend_result cache_request_parse_body_option (HashTable * options , zval * option , int cache_offset )
250+ static zend_result cache_request_parse_body_option (zval * option , int cache_offset , const char * option_name , bool allow_negative )
251251{
252252 if (option ) {
253253 zend_long result ;
@@ -265,6 +265,10 @@ static zend_result cache_request_parse_body_option(HashTable *options, zval *opt
265265 zend_value_error ("Invalid %s value in $options argument" , zend_zval_value_name (option ));
266266 return FAILURE ;
267267 }
268+ if (!allow_negative && result < 0 ) {
269+ zend_value_error ("Invalid negative value for \"%s\" option in $options argument" , option_name );
270+ return FAILURE ;
271+ }
268272 SG (request_parse_body_context ).options_cache [cache_offset ].set = true;
269273 SG (request_parse_body_context ).options_cache [cache_offset ].value = result ;
270274 } else {
@@ -288,9 +292,9 @@ static zend_result cache_request_parse_body_options(HashTable *options)
288292 return FAILURE ;
289293 }
290294
291- #define CHECK_OPTION (name ) \
295+ #define CHECK_OPTION (name , allow_negative ) \
292296 if (zend_string_equals_literal_ci(key, #name)) { \
293- if (cache_request_parse_body_option(options, value, REQUEST_PARSE_BODY_OPTION_ ## name) == FAILURE) { \
297+ if (cache_request_parse_body_option(value, REQUEST_PARSE_BODY_OPTION_ ## name, #name, allow_negative ) == FAILURE) { \
294298 return FAILURE; \
295299 } \
296300 continue; \
@@ -299,25 +303,25 @@ static zend_result cache_request_parse_body_options(HashTable *options)
299303 switch (ZSTR_VAL (key )[0 ]) {
300304 case 'm' :
301305 case 'M' :
302- CHECK_OPTION (max_file_uploads );
303- CHECK_OPTION (max_input_vars );
304- CHECK_OPTION (max_multipart_body_parts );
306+ CHECK_OPTION (max_file_uploads , false );
307+ CHECK_OPTION (max_input_vars , false );
308+ CHECK_OPTION (max_multipart_body_parts , true );
305309 break ;
306310 case 'p' :
307311 case 'P' :
308- CHECK_OPTION (post_max_size );
312+ CHECK_OPTION (post_max_size , false );
309313 break ;
310314 case 'u' :
311315 case 'U' :
312- CHECK_OPTION (upload_max_filesize );
316+ CHECK_OPTION (upload_max_filesize , false );
313317 break ;
314318 }
315319
316320 zend_value_error ("Invalid key \"%s\" in $options argument" , ZSTR_VAL (key ));
317321 return FAILURE ;
318322 } ZEND_HASH_FOREACH_END ();
319323
320- #undef CACHE_OPTION
324+ #undef CHECK_OPTION
321325
322326 return SUCCESS ;
323327}
0 commit comments