@@ -651,14 +651,18 @@ PHP_FUNCTION(pcntl_exec)
651
651
efree (argv );
652
652
RETURN_THROWS ();
653
653
}
654
- // TODO Check element does not have nul bytes?
654
+ if (zend_str_has_nul_byte (Z_STR_P (element ))) {
655
+ zend_argument_value_error (2 , "individual argument must not contain null bytes" );
656
+ efree (argv );
657
+ RETURN_THROWS ();
658
+ }
655
659
656
660
* current_arg = Z_STRVAL_P (element );
657
661
current_arg ++ ;
658
662
} ZEND_HASH_FOREACH_END ();
659
663
* current_arg = NULL ;
660
664
} else {
661
- argv = safe_emalloc ( 2 , sizeof (char * ), 0 );
665
+ argv = emalloc ( 2 * sizeof (char * ));
662
666
argv [0 ] = path ;
663
667
argv [1 ] = NULL ;
664
668
}
@@ -679,25 +683,31 @@ PHP_FUNCTION(pcntl_exec)
679
683
goto cleanup_env_vars ;
680
684
}
681
685
686
+ if (zend_str_has_nul_byte (element_str )) {
687
+ zend_argument_value_error (3 , "value for environment variable must not contain null bytes" );
688
+ zend_string_release_ex (element_str , false);
689
+ goto cleanup_env_vars ;
690
+ }
691
+
692
+ /* putenv() allows integer environment variables */
682
693
if (!key ) {
683
- // TODO Does it even make sense to have an environment variable which is an integer?
684
694
key = zend_long_to_str ((zend_long ) key_num );
685
695
} else {
696
+ if (zend_str_has_nul_byte (key )) {
697
+ zend_argument_value_error (3 , "name for environment variable must not contain null bytes" );
698
+ zend_string_release_ex (element_str , false);
699
+ goto cleanup_env_vars ;
700
+ }
686
701
zend_string_addref (key );
687
702
}
688
703
689
- // TODO Check key and element do not have nul bytes?
690
-
691
704
/* Length of element + equal sign + length of key + null */
692
- const uint8_t equal_len = strlen ("=" );
693
- size_t pair_length = ZSTR_LEN (element_str ) + equal_len + ZSTR_LEN (key ) + 1 ;
694
- ZEND_ASSERT (pair_length < SIZE_MAX );
695
- * pair = emalloc (pair_length );
705
+ * pair = safe_emalloc (ZSTR_LEN (element_str ) + 1 , sizeof (char ), ZSTR_LEN (key ) + 1 );
696
706
/* Copy key=element + final null byte into buffer */
697
707
memcpy (* pair , ZSTR_VAL (key ), ZSTR_LEN (key ));
698
- memcpy (* pair + ZSTR_LEN (key ), "=" , equal_len ) ;
708
+ (* pair )[ ZSTR_LEN (key )] = '=' ;
699
709
/* Copy null byte */
700
- memcpy (* pair + ZSTR_LEN (key ) + equal_len , ZSTR_VAL (element_str ), ZSTR_LEN (element_str ) + 1 );
710
+ memcpy (* pair + ZSTR_LEN (key ) + 1 , ZSTR_VAL (element_str ), ZSTR_LEN (element_str ) + 1 );
701
711
702
712
/* Cleanup */
703
713
zend_string_release_ex (key , false);
0 commit comments