cvs: php4 /main php_ini.c
| From: | Preston L. Bannister | Date: | Thu, 09 May 2002 20:34:53 +0000 |
| Subject: | cvs: php4 /main php_ini.c | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-11778@lists.php.net to get a copy of this message | ||
pbannister Thu May 9 16:34:53 2002 EDT
Modified files:
/php4/main php_ini.c
Log:
Add check for php.ini in same directory as php.exe (or equivalent executable that loaded
php4ts.dll). Check is done before looking in the Windows directory. This allows distinct php.ini
files when different applications using PHP are installed on the same system. Should be backwards
compatible.
Note that checking for in CWD php.ini may be a security risk(?), and can now be made compile-time
configurable by removing a single #define.
(This time with tabs for leading indent).
Index: php4/main/php_ini.c
diff -u php4/main/php_ini.c:1.87 php4/main/php_ini.c:1.88
--- php4/main/php_ini.c:1.87 Thu May 9 16:03:34 2002
+++ php4/main/php_ini.c Thu May 9 16:34:53 2002
@@ -16,7 +16,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: php_ini.c,v 1.87 2002/05/09 20:03:34 sniper Exp $ */
+/* $Id: php_ini.c,v 1.88 2002/05/09 20:34:53 pbannister Exp $ */
#include "php.h"
#ifndef PHP_WIN32
@@ -108,7 +108,7 @@
if (module) {
module_number = module->module_number;
- } else {
+ } else {
module_number = 0;
}
php_info_print_table_start();
@@ -122,25 +122,25 @@
#ifdef ZTS
# if (ZEND_DEBUG)
-# define ZEND_EXTENSION_TOKEN "zend_extension_debug_ts"
+# define ZEND_EXTENSION_TOKEN "zend_extension_debug_ts"
# else
-# define ZEND_EXTENSION_TOKEN "zend_extension_ts"
+# define ZEND_EXTENSION_TOKEN "zend_extension_ts"
# endif
#else
# if (ZEND_DEBUG)
-# define ZEND_EXTENSION_TOKEN "zend_extension_debug"
+# define ZEND_EXTENSION_TOKEN "zend_extension_debug"
# else
-# define ZEND_EXTENSION_TOKEN "zend_extension"
+# define ZEND_EXTENSION_TOKEN "zend_extension"
# endif
#endif
/* {{{ pvalue_config_destructor
*/
static void pvalue_config_destructor(zval *pvalue)
-{
- if (Z_TYPE_P(pvalue) == IS_STRING && Z_STRVAL_P(pvalue) != empty_string) {
- free(Z_STRVAL_P(pvalue));
- }
+{
+ if (Z_TYPE_P(pvalue) == IS_STRING && Z_STRVAL_P(pvalue) != empty_string) {
+ free(Z_STRVAL_P(pvalue));
+ }
}
/* }}} */
@@ -157,14 +157,14 @@
}
if (!strcasecmp(Z_STRVAL_P(arg1), "extension")) { /* load function module */
zval copy;
-
+
copy = *arg2;
zval_copy_ctor(©);
copy.refcount = 0;
- zend_llist_add_element(&extension_lists.functions, ©);
+ zend_llist_add_element(&extension_lists.functions, ©);
} else if (!strcasecmp(Z_STRVAL_P(arg1), ZEND_EXTENSION_TOKEN)) { /* load Zend extension */
char *extension_name = estrndup(Z_STRVAL_P(arg2), Z_STRLEN_P(arg2));
-
+
zend_llist_add_element(&extension_lists.engine, &extension_name);
} else {
zend_hash_update(&configuration_hash, Z_STRVAL_P(arg1), Z_STRLEN_P(arg1)+1, arg2,
sizeof(zval), (void **) &entry);
@@ -201,10 +201,8 @@
*/
int php_init_config(char *php_ini_path_override)
{
- char *env_location, *php_ini_search_path;
int safe_mode_state;
char *open_basedir;
- int free_ini_search_path=0;
zend_file_handle fh;
TSRMLS_FETCH();
@@ -214,71 +212,68 @@
zend_llist_init(&extension_lists.engine, sizeof(char *), (llist_dtor_func_t) free_estring, 1);
zend_llist_init(&extension_lists.functions, sizeof(zval), (llist_dtor_func_t)
ZVAL_DESTRUCTOR, 1);
-
+
safe_mode_state = PG(safe_mode);
open_basedir = PG(open_basedir);
+ PG(safe_mode) = 0;
+ PG(open_basedir) = NULL;
- env_location = getenv("PHPRC");
- if (!env_location) {
- env_location="";
- }
- if (php_ini_path_override) {
- php_ini_search_path = php_ini_path_override;
- free_ini_search_path = 0;
- } else {
- char *default_location;
- int free_default_location;
+ fh.handle.fp = NULL;
-#ifdef PHP_WIN32
- default_location = (char *) emalloc(512);
-
- if (!GetWindowsDirectory(default_location, 255)) {
- default_location[0]=0;
- }
- free_default_location=1;
-#else
- default_location = PHP_CONFIG_FILE_PATH;
- free_default_location=0;
-#endif
- php_ini_search_path = (char *)
emalloc(sizeof(".")+strlen(env_location)+strlen(default_location)+2+1);
- free_ini_search_path = 1;
- if (strcmp(sapi_module.name, "cli")==0) {
- if(env_location && env_location[0]) {
- sprintf(php_ini_search_path, "%s%c%s", env_location, ZEND_PATHS_SEPARATOR,
default_location);
- } else {
- sprintf(php_ini_search_path, "%s", default_location);
- }
- } else {
- if(env_location && env_location[0]) {
- sprintf(php_ini_search_path, ".%c%s%c%s", ZEND_PATHS_SEPARATOR, env_location,
ZEND_PATHS_SEPARATOR, default_location);
- } else {
- sprintf(php_ini_search_path, ".%c%s", ZEND_PATHS_SEPARATOR, default_location);
+ /* If no override given (usually from the command line) then check the environment. */
+ if (!php_ini_path_override) {
+ php_ini_path_override = getenv("PHPRC");
+ }
+ if (php_ini_path_override && *php_ini_path_override) {
+
+ /* Try to open php_ini_path_override if not a directory. */
+ struct stat st;
+ if ((0 == VCWD_STAT(php_ini_path_override, &st)) && (S_IFDIR != (st.st_mode &
S_IFMT))) {
+ fh.handle.fp = VCWD_FOPEN(php_ini_path_override, "r");
+ if (fh.handle.fp) {
+ php_ini_opened_path = estrdup(php_ini_path_override);
}
}
- if (free_default_location) {
- efree(default_location);
+
+ /* If we did not manage to open php_ini_path_override then search it as a directory. */
+ if (!fh.handle.fp) {
+ fh.handle.fp = php_fopen_with_path("php.ini", "r", php_ini_path_override,
&php_ini_opened_path TSRMLS_CC);
}
+
}
- PG(safe_mode) = 0;
- PG(open_basedir) = NULL;
+#define INI_CHECK_CWD
+#ifdef INI_CHECK_CWD
+ if (!fh.handle.fp && (0 != strcmp(sapi_module.name, "cli"))) {
+ /* Search the current directory - possible security risk? */
+ fh.handle.fp = php_fopen_with_path("php.ini", "r", ".",
&php_ini_opened_path TSRMLS_CC);
+ }
+#endif
- fh.handle.fp = NULL;
- /* Check if php_ini_path_override is a file */
- if (php_ini_path_override && php_ini_path_override[0]) {
- struct stat statbuf;
- if (!VCWD_STAT(php_ini_path_override, &statbuf)) {
- if (!((statbuf.st_mode & S_IFMT) == S_IFDIR)) {
- fh.handle.fp = VCWD_FOPEN(php_ini_path_override, "r");
- }
+#ifdef PHP_WIN32
+ if (!fh.handle.fp) {
+ /* Search for php.ini in the same directory as the executable. */
+ char search_path[MAX_PATH];
+ if (GetModuleFileName(0,search_path,sizeof(search_path))) {
+ char* p = strrchr(search_path,'\\');
+ if (p) *++p = 0;
+ fh.handle.fp = php_fopen_with_path("php.ini", "r", search_path,
&php_ini_opened_path TSRMLS_CC);
+ }
+ }
+ if (!fh.handle.fp) {
+ /* Search for php.ini in the Windows base directory. */
+ char search_path[MAX_PATH];
+ if (GetWindowsDirectory(search_path,sizeof(search_path))) {
+ fh.handle.fp = php_fopen_with_path("php.ini", "r", search_path,
&php_ini_opened_path TSRMLS_CC);
}
}
- /* Search php.ini file in search path */
- if (!fh.handle.fp)
- fh.handle.fp = php_fopen_with_path("php.ini", "r", php_ini_search_path,
&php_ini_opened_path TSRMLS_CC);
- if (free_ini_search_path) {
- efree(php_ini_search_path);
+#else
+ if (!fh.handle.fp) {
+ /* Search for php.ini in the (platform-specific) default places. */
+ fh.handle.fp = php_fopen_with_path("php.ini", "r", PHP_CONFIG_FILE_PATH,
&php_ini_opened_path TSRMLS_CC);
}
+#endif
+
PG(safe_mode) = safe_mode_state;
PG(open_basedir) = open_basedir;
@@ -289,10 +284,11 @@
fh.filename = php_ini_opened_path;
zend_parse_ini_file(&fh, 1, php_config_ini_parser_cb, &extension_lists);
-
+
+ /* If we succeeded in opening an INI file, preserve the name of the file opened. */
if (php_ini_opened_path) {
zval tmp;
-
+
Z_STRLEN(tmp) = strlen(php_ini_opened_path);
Z_STRVAL(tmp) = zend_strndup(php_ini_opened_path, Z_STRLEN(tmp));
Z_TYPE(tmp) = IS_STRING;
@@ -300,7 +296,7 @@
efree(php_ini_opened_path);
php_ini_opened_path = zend_strndup(Z_STRVAL(tmp), Z_STRLEN(tmp));
}
-
+
return SUCCESS;
}
/* }}} */
@@ -348,7 +344,7 @@
PHPAPI int cfg_get_long(char *varname, long *result)
{
zval *tmp, var;
-
+
if (zend_hash_find(&configuration_hash, varname, strlen(varname)+1, (void **)
&tmp)==FAILURE) {
*result=(long)NULL;
return FAILURE;
@@ -366,7 +362,7 @@
PHPAPI int cfg_get_double(char *varname, double *result)
{
zval *tmp, var;
-
+
if (zend_hash_find(&configuration_hash, varname, strlen(varname)+1, (void **)
&tmp)==FAILURE) {
*result=(double)0;
return FAILURE;