@@ -495,9 +495,11 @@ int php_date_global_timezone_db_enabled;
495
495
/* on 90'35; common sunrise declaration (sun body disappeared) */
496
496
#define DATE_SUNRISE_ZENITH "90.583333"
497
497
498
+ static PHP_INI_MH (OnUpdate_date_timezone );
499
+
498
500
/* {{{ INI Settings */
499
501
PHP_INI_BEGIN ()
500
- STD_PHP_INI_ENTRY ("date.timezone" , "" , PHP_INI_ALL , OnUpdateString , default_timezone , zend_date_globals , date_globals )
502
+ STD_PHP_INI_ENTRY ("date.timezone" , "" , PHP_INI_ALL , OnUpdate_date_timezone , default_timezone , zend_date_globals , date_globals )
501
503
PHP_INI_ENTRY ("date.default_latitude" , DATE_DEFAULT_LATITUDE , PHP_INI_ALL , NULL )
502
504
PHP_INI_ENTRY ("date.default_longitude" , DATE_DEFAULT_LONGITUDE , PHP_INI_ALL , NULL )
503
505
PHP_INI_ENTRY ("date.sunset_zenith" , DATE_SUNSET_ZENITH , PHP_INI_ALL , NULL )
@@ -599,6 +601,7 @@ static PHP_GINIT_FUNCTION(date)
599
601
date_globals -> default_timezone = NULL ;
600
602
date_globals -> timezone = NULL ;
601
603
date_globals -> tzcache = NULL ;
604
+ date_globals -> timezone_valid = 0 ;
602
605
}
603
606
/* }}} */
604
607
@@ -844,25 +847,53 @@ timelib_tzinfo *php_date_parse_tzfile_wrapper(char *formal_tzname, const timelib
844
847
}
845
848
/* }}} */
846
849
850
+ // created this callback method to check the date.timezone only when changed, to increase performance and error on an ini_set line
851
+ /* {{{ static PHP_INI_MH(OnUpdate_date_timezone) */
852
+ static PHP_INI_MH (OnUpdate_date_timezone )
853
+ {
854
+ if (OnUpdateString (entry , new_value , new_value_length , mh_arg1 , mh_arg2 , mh_arg3 , stage TSRMLS_CC ) == FAILURE ) {
855
+ return FAILURE ;
856
+ }
857
+
858
+ DATEG (timezone_valid ) = 0 ;
859
+ if (stage == PHP_INI_STAGE_RUNTIME ) {
860
+ if (!timelib_timezone_id_is_valid (DATEG (default_timezone ), DATE_TIMEZONEDB )) {
861
+ php_error_docref (NULL TSRMLS_CC , E_WARNING , DATE_TZ_ERRMSG );
862
+ } else {
863
+ DATEG (timezone_valid ) = 1 ;
864
+ }
865
+ }
866
+
867
+ return SUCCESS ;
868
+ }
869
+ /* }}} */
870
+
847
871
/* {{{ Helper functions */
848
872
static char * guess_timezone (const timelib_tzdb * tzdb TSRMLS_DC )
849
873
{
850
874
/* Checking configure timezone */
851
- if (DATEG (timezone ) && ( strlen (DATEG (timezone )) > 0 ) ) {
875
+ if (DATEG (timezone ) && strlen (DATEG (timezone )) > 0 ) {
852
876
return DATEG (timezone );
853
877
}
854
878
/* Check config setting for default timezone */
855
879
if (!DATEG (default_timezone )) {
856
880
/* Special case: ext/date wasn't initialized yet */
857
881
zval ztz ;
858
-
859
- if (SUCCESS == zend_get_configuration_directive ("date.timezone" , sizeof ("date.timezone" ), & ztz ) &&
860
- Z_TYPE (ztz ) == IS_STRING &&
861
- Z_STRLEN (ztz ) > 0 &&
862
- timelib_timezone_id_is_valid (Z_STRVAL (ztz ), tzdb )) {
882
+
883
+ if (SUCCESS == zend_get_configuration_directive ("date.timezone" , sizeof ("date.timezone" ), & ztz ) && Z_TYPE (ztz ) == IS_STRING && Z_STRLEN (ztz ) > 0 && timelib_timezone_id_is_valid (Z_STRVAL (ztz ), tzdb )) {
863
884
return Z_STRVAL (ztz );
864
885
}
865
- } else if (* DATEG (default_timezone ) && timelib_timezone_id_is_valid (DATEG (default_timezone ), tzdb )) {
886
+ } else if (* DATEG (default_timezone )) {
887
+ if (DATEG (timezone_valid ) == 1 ) { // timezone already checked and validated
888
+ return DATEG (default_timezone );
889
+ }
890
+
891
+ if (!timelib_timezone_id_is_valid (DATEG (default_timezone ), tzdb )) {
892
+ php_error_docref (NULL TSRMLS_CC , E_WARNING , "Invalid date.timezone value '%s', we selected the timezone 'UTC' for now." , DATEG (default_timezone ));
893
+ return "UTC" ;
894
+ }
895
+
896
+ DATEG (timezone_valid ) = 1 ;
866
897
return DATEG (default_timezone );
867
898
}
868
899
/* Fallback to UTC */
0 commit comments