Edit report at http://bugs.php.net/bug.php?id=50918&edit=1

 ID:               50918
 Updated by:       paj...@php.net
 Reported by:      hardon at online dot no
 Summary:          Access violation in php.exe (Bug #49626 redux)
 Status:           Assigned
 Type:             Bug
 Package:          Reproducible crash
 Operating System: win32 only - Windows
 PHP Version:      5.3.1
 Assigned To:      pajoye

 New Comment:

btw, it is not windows specific, crashes occur on other platform as
well.


Previous Comments:
------------------------------------------------------------------------
[2010-03-17 14:52:42] paj...@php.net

Yes, current work around is to actually set the timezone in php.ini

------------------------------------------------------------------------
[2010-03-17 14:48:14] progunster at gmail dot com

Looks like it's the same bug.



Function     Arg 1     Arg 2     Arg 3   Source 

php5ts!guess_timezone+1c     00b2c5c8     00e4b670     00000001    

php5ts!get_timezone_info+1b     00e4b670     00e531b0     00000003    

php5ts!php_format_date+1b     00ad5aa4     0000000b     4ba0da0c    

php5ts!php_log_err+de     010d2128     00e4b670     0006fb80    

php5ts!php_error_cb+385     00000020     00abf924     00000000    

php5ts!zend_error+498     00000020     00abf8d4     010e46b8    

php5ts!php_verror+554     00000000     00abf7f8     00000020    

php5ts!php_error_docref0+23     00000000     00e4b670     00000020    

php5ts!php_load_extension+146     010e40d8     00000001     00000000   


php5ts!php_load_php_extension_cb+15     00e58828     00e4b670    
00267d78    

php5ts!zend_llist_apply+1c     00cb3bf4     0083afd0     00e4b670    

php5ts!php_ini_register_extensions+25     00e4b670     0006fea8    
00000001    

php5ts!php_module_startup+87c     007760a8     00776048     00000001   


php5apache2_2!php_apache2_startup+12     007760a8     007760a8    
00000001    

php5apache2_2!php_apache_server_startup+7b     0026de18     00632140    
005f2068    

libhttpd!ap_run_post_config+33     0026de18     00632140     005f2068   


httpd+176f     00000003     00267a80     00262868    

httpd+1fb2     00720065     004e0000     7ffdc000    

kernel32!BaseProcessStart+23     00401ecf     00000000     78746341

------------------------------------------------------------------------
[2010-02-07 09:49:41] j...@php.net

Pierre, it's the order of init which is buggy in Windows. Works fine on
all other OSes.

------------------------------------------------------------------------
[2010-02-03 10:37:54] paj...@php.net

I reproduced it randomly using TS and NTS version of PHP in the console.
Not sure which of the alternative should be used but the analyze is
correct.

------------------------------------------------------------------------
[2010-02-02 23:56:14] hardon at online dot no

Description:
------------
Bug #49626 is actually a bug, not bougus (have gotten this segfault many
times myself). Was unable to reopen/comment on it, so made a new bug. 



>From the stack trace and looking thru the code its obvious that an error
is in progress of being logged, but it segfaults in the process. This is
because tsrm_ls[date_globals_id] slot is not allocated and DATEG
segfaults. 



Segfault only visible in ZTS builds (non-ZTS build have a global/static
struct, zend_date_globals?), but it is still an error in non-ZTS; date
globals are not initialized (to zero) yet, thou hopefully zeroed by
compiler, but compiler doesn't guarantee this(?). Can possibly lead to
mysterious errors in non-ZTS as well.



Why is slot not allocated yet? The "date" extension isn't "started" yet
when error is logged (or if HAVE_DATE was not defined, never). I even
found the revision that "broke" it (I think it worked "better" before
this change):
http://svn.php.net/viewvc/php/php-src/trunk/main/main.c?r1=188608&r2=188607&pathrev=188608



But reverting this change is not the right fix, the change just provoked
the bug. Errors can be logged at any time during startup so can not rely
on "date" extension being initialized (HAVE_DATE can even be
undefined).



This code shows the "not initialized yet" problem is not new:



        /* Check config setting for default timezone */

        if (!DATEG(default_timezone)) {

                /* Special case: ext/date wasn't initialized yet */

                zval ztz;

                if (SUCCESS == zend_get_configuration_directive("date.timezone",
sizeof("date.timezone"), &ztz) &&



Thoughts on how to fix:

Alt1: initialize date "extension" as early as possible, maybe around
here?

main.c->php_module_startup:

#ifdef ZTS

        executor_globals = ts_resource(executor_globals_id);

+       date_globals = ts_resource(date_globals_id);



Alt2 (hackish..): define DATEG_VALID that (in ZTS builds) check if
date_globals_id is != 0 (hmm, possibly not zeroed by compiler..), and
only then use DATEG



Alt3: it's a bit weird that main.c require the "date" ext since it is
optional (HAVE_DATE). Maybe main.c should not have used anything from
"date" in the first place, or "date" should have been a part of the
"framework", not an ext.



But you guys probably have a better solution:-)





------------------------------------------------------------------------



-- 
Edit this bug report at http://bugs.php.net/bug.php?id=50918&edit=1

Reply via email to