I have found that VS2010 release mode builds of Apache/mod_perl crash on Windows Vista, Windows Server 2008 and Windows 7, and I believe that the problem may be something to do with the environment manipulation done by Apache (although Apache itself runs fine when not loading mod_perl).
The same build runs on Windows XP and Windows Server 2003, and also runs
(on all OSes) if I make a debug mode build or use VS2008 so it's quite a
strange problem, maybe even a bug in msvcr100.dll?
I'm using Apache 2.2.17, mod_perl 2.0.4 and Perl 5.12.2 (patched as per
5.13.9 to allow building with VS2010). Apache/mod_perl crashes during
start-up, downstream from ap_run_open_logs():
> msvcr100.dll!free(void * pBlock) Line 51 C
msvcr100.dll!__crtsetenv(char * * poption, const int primary)
Line 211 + 0xa bytes C
msvcr100.dll!_putenv_helper(const char * name, const char *
value) Line 265 + 0xb bytes C
msvcr100.dll!_putenv(const char * option) Line 77 + 0xa bytes
C
perl512.dll!ansify_path() Line 4798 C
perl512.dll!Perl_win32_init(int * argcp, char * * * argvp) Line
4862 C
perl512.dll!Perl_sys_init3(int * argc, char * * * argv, char * *
* env) Line 150 + 0x3b bytes C
mod_perl.so!modperl_sys_init() Line 561 + 0x11 bytes C
mod_perl.so!modperl_hook_init(apr_pool_t * pconf, apr_pool_t *
plog, apr_pool_t * ptemp, server_rec * s) Line 629 C
libhttpd.dll!ap_run_open_logs(apr_pool_t * pconf, apr_pool_t *
plog, apr_pool_t * ptemp, server_rec * s) Line 151 + 0x5b bytes
C
httpd.exe!main(int argc, const char * const * argv) Line 673 +
0x16 bytes C
httpd.exe!__tmainCRTStartup() Line 555 + 0x19 bytes C
httpd.exe!mainCRTStartup() Line 371 C
It all goes wrong doing a putenv() call in ansify_path(). If I comment
out the call to ansify_path() (which is only required for perl's -S
option processing) then Apache/mod_perl starts up, but then crashes
later on in our own proprietary software when that does a putenv()
call...
I've managed to reproduce the problem in a small standalone program
(attached) by copying the environment manipulation (conversion from
UTF-16 to UTF-8) done by httpd-2.2.17\srclib\apr\misc\win32\start.c and
then following that with a putenv() call.
This program runs (and prints "Ok") in a VS2010 release build on XP, but
the same binary crashes on Server 2008. In a VS2008 release build it
runs on Server 2008 too.
The crash comes here (which is exactly where the Apache/mod_perl setup
was crashing):
> msvcr100.dll!free(void * pBlock) Line 51 C
msvcr100.dll!__crtsetenv(char * * poption, const int primary)
Line 211 + 0xa bytes C
msvcr100.dll!_putenv_helper(const char * name, const char *
value) Line 265 + 0xb bytes C
msvcr100.dll!_putenv(const char * option) Line 77 + 0xa bytes
C
test.exe!main(int argc, char * * argv, char * * env) Line 97 +
0xb bytes C++
test.exe!__tmainCRTStartup() Line 555 + 0x17 bytes C
Can anyone shed any light on what the problem is? In particular, can it
be fixed (or at least worked around) in the Apache code, or is this a
problem with msvcr100.dll?
Steve
test.cpp
Description: test.cpp
