@@ -439,40 +439,40 @@ PHP_FUNCTION(bzerror)
439
439
/* {{{ Compresses a string into BZip2 encoded data */
440
440
PHP_FUNCTION (bzcompress )
441
441
{
442
- char * source ; /* Source data to compress */
443
- zend_long zblock_size = 0 ; /* Optional block size to use */
444
- zend_long zwork_factor = 0 ;/* Optional work factor to use */
445
- zend_string * dest = NULL ; /* Destination to place the compressed data into */
446
- int error , /* Error Container */
447
- block_size = 4 , /* Block size for compression algorithm */
448
- work_factor = 0 , /* Work factor for compression algorithm */
449
- argc = ZEND_NUM_ARGS (); /* Argument count */
450
- size_t source_len ; /* Length of the source data */
451
- unsigned int dest_len ; /* Length of the destination buffer */
452
-
453
- if (zend_parse_parameters (argc , "s|ll" , & source , & source_len , & zblock_size , & zwork_factor ) == FAILURE ) {
442
+ char * source ; /* Source data to compress */
443
+ zend_long zblock_size = 4 ; /* Block size for compression algorithm */
444
+ zend_long zwork_factor = 0 ; /* Work factor for compression algorithm */
445
+ zend_string * dest = NULL ; /* Destination to place the compressed data into */
446
+ size_t source_len ; /* Length of the source data */
447
+ unsigned int dest_len ; /* Length of the destination buffer */
448
+
449
+ if (zend_parse_parameters (ZEND_NUM_ARGS (), "s|ll" , & source , & source_len , & zblock_size , & zwork_factor ) == FAILURE ) {
454
450
RETURN_THROWS ();
455
451
}
456
452
453
+ if (zblock_size < 1 || zblock_size > 9 ) {
454
+ zend_argument_value_error (2 , "must be between 1 and 9" );
455
+ RETURN_THROWS ();
456
+ }
457
+ int block_size = (int ) zblock_size ;
458
+
459
+ if (zwork_factor < 0 || zwork_factor > 250 ) {
460
+ zend_argument_value_error (3 , "must be between 0 and 250" );
461
+ RETURN_THROWS ();
462
+ }
463
+ int work_factor = (int ) zwork_factor ;
464
+
457
465
/* Assign them to easy to use variables, dest_len is initially the length of the data
458
466
+ .01 x length of data + 600 which is the largest size the results of the compression
459
467
could possibly be, at least that's what the libbz2 docs say (thanks to jeremy@nirvani.net
460
468
for pointing this out). */
469
+ // TODO Check source string length fits in unsigned int
461
470
dest_len = (unsigned int ) (source_len + (0.01 * source_len ) + 600 );
462
471
463
472
/* Allocate the destination buffer */
464
473
dest = zend_string_alloc (dest_len , 0 );
465
474
466
- /* Handle the optional arguments */
467
- if (argc > 1 ) {
468
- block_size = zblock_size ;
469
- }
470
-
471
- if (argc > 2 ) {
472
- work_factor = zwork_factor ;
473
- }
474
-
475
- error = BZ2_bzBuffToBuffCompress (ZSTR_VAL (dest ), & dest_len , source , source_len , block_size , 0 , work_factor );
475
+ int error = BZ2_bzBuffToBuffCompress (ZSTR_VAL (dest ), & dest_len , source , source_len , block_size , 0 , work_factor );
476
476
if (error != BZ_OK ) {
477
477
zend_string_efree (dest );
478
478
RETURN_LONG (error );
@@ -512,6 +512,7 @@ PHP_FUNCTION(bzdecompress)
512
512
RETURN_FALSE ;
513
513
}
514
514
515
+ // TODO Check source string length fits in unsigned int
515
516
bzs .next_in = source ;
516
517
bzs .avail_in = source_len ;
517
518
0 commit comments