ID:               18160
 Updated by:       [EMAIL PROTECTED]
 Reported By:      [EMAIL PROTECTED]
-Status:           Open
+Status:           Feedback
 Bug Type:         Apache related
 Operating System: RedHat Linux 7.2
 PHP Version:      4.2.1
 New Comment:

Please try using this CVS snapshot:

  http://snaps.php.net/php4-latest.tar.gz
 
For Windows:
 
  http://snaps.php.net/win32/php4-win32-latest.zip




Previous Comments:
------------------------------------------------------------------------

[2002-07-04 07:11:08] [EMAIL PROTECTED]

and if client put some env vars like LANG into some other value, will
this be set back to the original value when script shutdown?

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

[2002-07-04 07:02:12] [EMAIL PROTECTED]

apache 1.3.20 with php 4.2.1
setlocale get my apache vitural host not work (can not find any file I
requested, all 404).

repeat step(on my linux):
1.write a test file setlocale.php:
<?
//any valid setlocale will all repeat the bug.
setlocale(LCTIME,"C"); 
?>
2.place the file into my default virtual host htdocs dirtory.
3.in the browser refresh the url of setlocale.php. so first several
time get empty page, then get some 404 error, and then all is 404
error, any page in the virtual host will not be accessed again until I
reload or stop-start apache.

I notice my env var LANG in the phpinfo page is setting to
"zh_CN.GB2312" because I use chinese interface of kde.

I consider that this bug is because the php module does not restore the
correct locale setting before the script execute. so I try to fix this
bug by comment the line 1107 of file ext/standard/basic_functions.c
    if (BG(locale_string) != NULL) {
        setlocale(LC_ALL, "C"); <---change the second paremeter to ""
will be ok

        setlocale(LC_CTYPE, "");<---comment this line will also be ok
    }
after this simple fix, the bug not repeated.
but I think this is not a best way to fix this bug, so please check it.
(I think this is not a correct way to fix it, but 
when apache starting, I get 2 group locale value from a little code in
the main.c php_module_startup() line 920:
#if HAVE_SETLOCALE
        if (sapi_module.log_message) {
                sapi_module.log_message(setlocale(LC_ALL,NULL));
                sapi_module.log_message(setlocale(LC_CTYPE,NULL));
        }
        setlocale(LC_CTYPE, "");
        if (sapi_module.log_message) {
                sapi_module.log_message(setlocale(LC_CTYPE,NULL));
        }
#endif

the result:
first group:
C
C
zh_CN.GB2312

second group:(seems apache or php sometimes has set all locales)
LC_CTYPE=zh_CN.GB2312;LC_NUMERIC=C;LC_TIME=zh_CN.GB2312;LC_COLLATE=zh_CN.GB2312;LC_MONETARY=zh_CN.GB2312;LC_MESSAGES=zh_CN.GB2312;LC_PAPER=zh_CN.GB2312;LC_NAME=zh_CN.GB2312;LC_ADDRESS=zh_CN.GB2312;LC_TELEPHONE=zh_CN.GB2312;LC_MEASUREMENT=zh_CN.GB2312;LC_IDENTIFICATION=zh_CN.GB2312

zh_CN.GB2312
zh_CN.GB2312

and I add some print code into ext/standard/basic_functions.c: 
    /* Check if locale was changed and change it back
       to the value in startup environment */
    if (BG(locale_string) != NULL) {
        php_error(E_WARNING, "LC_ALL before shutdown function: '%s'",
setlocale(LC_ALL,NULL));
        setlocale(LC_ALL, "C");
        php_error(E_WARNING, "LC_ALL after set LC_ALL->C: '%s'",
setlocale(LC_ALL,NULL));
        setlocale(LC_CTYPE, "");
        php_error(E_WARNING, "LC_ALL after set LC_CTYPE->'': '%s'",
setlocale(LC_ALL,NULL));
    }
    STR_FREE(BG(locale_string));

---------
the result:
at the top of script I print original LC_ALL:
LC_CTYPE=zh_CN.GB2312;LC_NUMERIC=C;LC_TIME=zh_CN.GB2312;LC_COLLATE=zh_CN.GB2312;LC_MONETARY=zh_CN.GB2312;LC_MESSAGES=zh_CN.GB2312;LC_PAPER=zh_CN.GB2312;LC_NAME=zh_CN.GB2312;LC_ADDRESS=zh_CN.GB2312;LC_TELEPHONE=zh_CN.GB2312;LC_MEASUREMENT=zh_CN.GB2312;LC_IDENTIFICATION=zh_CN.GB2312


when exec shutdown function, get result:
Warning: LC_ALL before shutdown function:
'LC_CTYPE=zh_CN.GB2312;LC_NUMERIC=C;LC_TIME=C;LC_COLLATE=zh_CN.GB2312;LC_MONETARY=zh_CN.GB2312;LC_MESSAGES=zh_CN.GB2312;LC_PAPER=zh_CN.GB2312;LC_NAME=zh_CN.GB2312;LC_ADDRESS=zh_CN.GB2312;LC_TELEPHONE=zh_CN.GB2312;LC_MEASUREMENT=zh_CN.GB2312;LC_IDENTIFICATION=zh_CN.GB2312'
in Unknown on line 0

Warning: LC_ALL after set LC_ALL->C: 'C' in Unknown on line 0

Warning: LC_ALL after set LC_CTYPE->'':
'LC_CTYPE=zh_CN.GB2312;LC_NUMERIC=C;LC_TIME=C;LC_COLLATE=C;LC_MONETARY=C;LC_MESSAGES=C;LC_PAPER=C;LC_NAME=C;LC_ADDRESS=C;LC_TELEPHONE=C;LC_MEASUREMENT=C;LC_IDENTIFICATION=C'
in Unknown on line 0


definitely this setting does same with the value before the setlocale
executed. the fixs I used just now is indeed set LC_CTYPE and other
LC*s(mostly) to a same value('C' or 'zh_CN.GB2312', it just make my
apache can find my virtual host path, but not a good fix. good fix
should restore this values into it's original value before script
executed.
SO, we need a good perfect way to restory the locale values.

by the way, if several threads of apache share a common locale, it will
cause some another problems. if we can not resolve this problem, we
have to declare the setlocale is a dangerous function which should not
called by muti-user php applications.


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


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

Reply via email to