diff options
Diffstat (limited to 'main/php_ini.c')
-rw-r--r-- | main/php_ini.c | 138 |
1 files changed, 67 insertions, 71 deletions
diff --git a/main/php_ini.c b/main/php_ini.c index 623d21d8b4..33b09a6d7b 100644 --- a/main/php_ini.c +++ b/main/php_ini.c @@ -108,7 +108,7 @@ PHPAPI void display_ini_entries(zend_module_entry *module) if (module) { module_number = module->module_number; - } else { + } else { module_number = 0; } php_info_print_table_start(); @@ -122,25 +122,25 @@ PHPAPI void display_ini_entries(zend_module_entry *module) #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 @@ static void php_config_ini_parser_cb(zval *arg1, zval *arg2, int callback_type, } 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 @@ static void php_load_zend_extension_cb(void *arg TSRMLS_DC) */ 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 @@ int php_init_config(char *php_ini_path_override) 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); } } - /* 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); + 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); + } } +#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 @@ int php_init_config(char *php_ini_path_override) 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 @@ int php_init_config(char *php_ini_path_override) efree(php_ini_opened_path); php_ini_opened_path = zend_strndup(Z_STRVAL(tmp), Z_STRLEN(tmp)); } - + return SUCCESS; } /* }}} */ @@ -348,7 +344,7 @@ zval *cfg_get_entry(char *name, uint name_length) 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_long(char *varname, long *result) 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; |