@@ -788,6 +788,7 @@ static bool can_ct_eval_func_call(zend_string *name, uint32_t num_args, zval **a
788
788
|| zend_string_equals_literal (name , "array_diff" )
789
789
|| zend_string_equals_literal (name , "array_diff_assoc" )
790
790
|| zend_string_equals_literal (name , "array_diff_key" )
791
+ || zend_string_equals_literal (name , "array_flip" )
791
792
|| zend_string_equals_literal (name , "array_is_list" )
792
793
|| zend_string_equals_literal (name , "array_key_exists" )
793
794
|| zend_string_equals_literal (name , "array_keys" )
@@ -804,6 +805,7 @@ static bool can_ct_eval_func_call(zend_string *name, uint32_t num_args, zval **a
804
805
#endif
805
806
|| zend_string_equals_literal (name , "imagetypes" )
806
807
|| zend_string_equals_literal (name , "in_array" )
808
+ || zend_string_equals_literal (name , "implode" )
807
809
|| zend_string_equals_literal (name , "ltrim" )
808
810
|| zend_string_equals_literal (name , "php_sapi_name" )
809
811
|| zend_string_equals_literal (name , "php_uname" )
@@ -828,41 +830,6 @@ static bool can_ct_eval_func_call(zend_string *name, uint32_t num_args, zval **a
828
830
return true;
829
831
}
830
832
831
- /* For the following functions we need to check arguments to prevent warnings during
832
- * evaluation. */
833
- if (num_args == 1 ) {
834
- if (zend_string_equals_literal (name , "array_flip" )) {
835
- zval * entry ;
836
-
837
- if (Z_TYPE_P (args [0 ]) != IS_ARRAY ) {
838
- return false;
839
- }
840
- ZEND_HASH_FOREACH_VAL (Z_ARRVAL_P (args [0 ]), entry ) {
841
- /* Throws warning for non int/string values. */
842
- if (Z_TYPE_P (entry ) != IS_LONG && Z_TYPE_P (entry ) != IS_STRING ) {
843
- return false;
844
- }
845
- } ZEND_HASH_FOREACH_END ();
846
- return true;
847
- }
848
- if (zend_string_equals_literal (name , "implode" )) {
849
- zval * entry ;
850
-
851
- if (Z_TYPE_P (args [0 ]) != IS_ARRAY ) {
852
- return false;
853
- }
854
-
855
- ZEND_HASH_FOREACH_VAL (Z_ARRVAL_P (args [0 ]), entry ) {
856
- /* May throw warning during conversion to string. */
857
- if (Z_TYPE_P (entry ) > IS_STRING ) {
858
- return false;
859
- }
860
- } ZEND_HASH_FOREACH_END ();
861
- return true;
862
- }
863
- return false;
864
- }
865
-
866
833
if (num_args == 2 ) {
867
834
if (zend_string_equals_literal (name , "str_repeat" )) {
868
835
/* Avoid creating overly large strings at compile-time. */
@@ -871,29 +838,6 @@ static bool can_ct_eval_func_call(zend_string *name, uint32_t num_args, zval **a
871
838
&& Z_TYPE_P (args [1 ]) == IS_LONG
872
839
&& zend_safe_address (Z_STRLEN_P (args [0 ]), Z_LVAL_P (args [1 ]), 0 , & overflow ) < 64 * 1024
873
840
&& !overflow ;
874
- } else if (zend_string_equals_literal (name , "implode" )) {
875
- zval * entry ;
876
-
877
- if ((Z_TYPE_P (args [0 ]) != IS_STRING || Z_TYPE_P (args [1 ]) != IS_ARRAY )
878
- && (Z_TYPE_P (args [0 ]) != IS_ARRAY || Z_TYPE_P (args [1 ]) != IS_STRING )) {
879
- return false;
880
- }
881
-
882
- /* May throw warning during conversion to string. */
883
- if (Z_TYPE_P (args [0 ]) == IS_ARRAY ) {
884
- ZEND_HASH_FOREACH_VAL (Z_ARRVAL_P (args [0 ]), entry ) {
885
- if (Z_TYPE_P (entry ) > IS_STRING ) {
886
- return false;
887
- }
888
- } ZEND_HASH_FOREACH_END ();
889
- } else {
890
- ZEND_HASH_FOREACH_VAL (Z_ARRVAL_P (args [1 ]), entry ) {
891
- if (Z_TYPE_P (entry ) > IS_STRING ) {
892
- return false;
893
- }
894
- } ZEND_HASH_FOREACH_END ();
895
- }
896
- return true;
897
841
}
898
842
return false;
899
843
}
@@ -971,6 +915,10 @@ static inline int ct_eval_func_call(
971
915
execute_data -> prev_execute_data = & dummy_frame ;
972
916
EG (current_execute_data ) = execute_data ;
973
917
918
+ /* Enable suppression and counting of warnings. */
919
+ ZEND_ASSERT (EG (capture_warnings_during_sccp ) == 0 );
920
+ EG (capture_warnings_during_sccp ) = 1 ;
921
+
974
922
EX (func ) = func ;
975
923
EX_NUM_ARGS () = num_args ;
976
924
for (i = 0 ; i < num_args ; i ++ ) {
@@ -989,6 +937,12 @@ static inline int ct_eval_func_call(
989
937
retval = FAILURE ;
990
938
}
991
939
940
+ if (EG (capture_warnings_during_sccp ) > 1 ) {
941
+ zval_ptr_dtor (result );
942
+ retval = FAILURE ;
943
+ }
944
+ EG (capture_warnings_during_sccp ) = 0 ;
945
+
992
946
efree (execute_data );
993
947
EG (current_execute_data ) = prev_execute_data ;
994
948
return retval ;
0 commit comments