jani Fri Nov 9 16:26:55 2007 UTC Modified files: /php-src/ext/standard dl.c dl.h /php-src/main php_ini.c Log: - Allow using full path to load modules using "extension" directive
http://cvs.php.net/viewvc.cgi/php-src/ext/standard/dl.c?r1=1.121&r2=1.122&diff_format=u Index: php-src/ext/standard/dl.c diff -u php-src/ext/standard/dl.c:1.121 php-src/ext/standard/dl.c:1.122 --- php-src/ext/standard/dl.c:1.121 Fri Nov 9 13:49:06 2007 +++ php-src/ext/standard/dl.c Fri Nov 9 16:26:55 2007 @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: dl.c,v 1.121 2007/11/09 13:49:06 jani Exp $ */ +/* $Id: dl.c,v 1.122 2007/11/09 16:26:55 jani Exp $ */ #include "php.h" #include "dl.h" @@ -80,7 +80,7 @@ /* {{{ php_dl */ -void php_dl(zval *file, int type, zval *return_value, int start_now TSRMLS_DC) +PHPAPI int php_load_extension(char *filename, int type, int start_now TSRMLS_DC) /* {{{ */ { void *handle; char *libpath; @@ -88,8 +88,6 @@ zend_module_entry *(*get_module)(void); int error_type; char *extension_dir; - char *filename; - int filename_len; if (type == MODULE_PERSISTENT) { extension_dir = INI_STR("extension_dir"); @@ -103,24 +101,16 @@ error_type = E_CORE_WARNING; } - if (Z_TYPE_P(file) == IS_UNICODE) { - if (FAILURE == php_stream_path_encode(NULL, &filename, &filename_len, Z_USTRVAL_P(file), Z_USTRLEN_P(file), REPORT_ERRORS, FG(default_context))) { - return; - } - } else { - filename = Z_STRVAL_P(file); - filename_len = Z_STRLEN_P(file); - } - - if (extension_dir && extension_dir[0]){ - int extension_dir_len = strlen(extension_dir); - + /* Check if passed filename contains directory separators */ + if (strchr(filename, '/') != NULL || strchr(filename, DEFAULT_SLASH) != NULL) { + /* Passing modules with full path is not supported for dynamically loaded extensions */ if (type == MODULE_TEMPORARY) { - if (strchr(filename, '/') != NULL || strchr(filename, DEFAULT_SLASH) != NULL) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Temporary module name should contain only filename"); - RETURN_FALSE; - } + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Temporary module name should contain only filename"); + return FAILURE; } + libpath = estrdup(filename); + } else if (extension_dir && extension_dir[0]) { + int extension_dir_len = strlen(extension_dir); if (IS_SLASH(extension_dir[extension_dir_len-1])) { spprintf(&libpath, 0, "%s%s", extension_dir, filename); /* SAFE */ @@ -128,11 +118,7 @@ spprintf(&libpath, 0, "%s%c%s", extension_dir, DEFAULT_SLASH, filename); /* SAFE */ } } else { - libpath = estrndup(filename, filename_len); - } - - if (Z_TYPE_P(file) == IS_UNICODE) { - efree(filename); + return FAILURE; /* Not full path given or extension_dir is not set */ } /* load dynamic symbol */ @@ -141,9 +127,8 @@ php_error_docref(NULL TSRMLS_CC, error_type, "Unable to load dynamic library '%s' - %s", libpath, GET_DL_ERROR()); GET_DL_ERROR(); /* free the buffer storing the error */ efree(libpath); - RETURN_FALSE; + return FAILURE; } - efree(libpath); get_module = (zend_module_entry *(*)(void)) DL_FETCH_SYMBOL(handle, "get_module"); @@ -158,8 +143,8 @@ if (!get_module) { DL_UNLOAD(handle); - php_error_docref(NULL TSRMLS_CC, error_type, "Invalid library (maybe not a PHP library) '%R'", Z_TYPE_P(file), Z_UNIVAL_P(file)); - RETURN_FALSE; + php_error_docref(NULL TSRMLS_CC, error_type, "Invalid library (maybe not a PHP library) '%s'", filename); + return FAILURE; } module_entry = get_module(); if ((module_entry->zend_debug != ZEND_DEBUG) || @@ -213,7 +198,7 @@ name, zend_api, zend_debug, zts, ZEND_MODULE_API_NO, ZEND_DEBUG, USING_ZTS); DL_UNLOAD(handle); - RETURN_FALSE; + return FAILURE; } module_entry->type = type; module_entry->module_number = zend_next_free_module(); @@ -221,22 +206,50 @@ if ((module_entry = zend_register_module_ex(module_entry TSRMLS_CC)) == NULL) { DL_UNLOAD(handle); - RETURN_FALSE; + return FAILURE; } if ((type == MODULE_TEMPORARY || start_now) && zend_startup_module_ex(module_entry TSRMLS_CC) == FAILURE) { DL_UNLOAD(handle); - RETURN_FALSE; + return FAILURE; } if ((type == MODULE_TEMPORARY || start_now) && module_entry->request_startup_func) { if (module_entry->request_startup_func(type, module_entry->module_number TSRMLS_CC) == FAILURE) { php_error_docref(NULL TSRMLS_CC, error_type, "Unable to initialize module '%s'", module_entry->name); DL_UNLOAD(handle); - RETURN_FALSE; + return FAILURE; } } - RETURN_TRUE; + return SUCCESS; +} +/* }}} */ + +/* {{{ php_dl + */ +PHPAPI void php_dl(zval *file, int type, zval *return_value, int start_now TSRMLS_DC) +{ + char *filename; + int filename_len; + + if (Z_TYPE_P(file) == IS_UNICODE) { + if (FAILURE == php_stream_path_encode(NULL, &filename, &filename_len, Z_USTRVAL_P(file), Z_USTRLEN_P(file), REPORT_ERRORS, FG(default_context))) { + return; + } + } else { + filename = Z_STRVAL_P(file); + } + + /* Load extension */ + if (php_load_extension(filename, type, start_now TSRMLS_CC) == FAILURE) { + RETVAL_FALSE; + } else { + RETVAL_TRUE; + } + + if (Z_TYPE_P(file) == IS_UNICODE) { + efree(filename); + } } /* }}} */ @@ -247,7 +260,7 @@ #else -void php_dl(zval *file, int type, zval *return_value, int start_now TSRMLS_DC) +PHPAPI void php_dl(zval *file, int type, zval *return_value, int start_now TSRMLS_DC) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot dynamically load %R - dynamic modules are not supported", Z_TYPE_P(file), Z_UNIVAL_P(file)); RETURN_FALSE; http://cvs.php.net/viewvc.cgi/php-src/ext/standard/dl.h?r1=1.26&r2=1.27&diff_format=u Index: php-src/ext/standard/dl.h diff -u php-src/ext/standard/dl.h:1.26 php-src/ext/standard/dl.h:1.27 --- php-src/ext/standard/dl.h:1.26 Mon Jan 1 09:29:31 2007 +++ php-src/ext/standard/dl.h Fri Nov 9 16:26:55 2007 @@ -18,12 +18,13 @@ +----------------------------------------------------------------------+ */ -/* $Id: dl.h,v 1.26 2007/01/01 09:29:31 sebastian Exp $ */ +/* $Id: dl.h,v 1.27 2007/11/09 16:26:55 jani Exp $ */ #ifndef DL_H #define DL_H -void php_dl(zval *file,int type, zval *return_value, int start_now TSRMLS_DC); +PHPAPI int php_load_extension(char *filename, int type, int start_now TSRMLS_DC); +PHPAPI void php_dl(zval *file,int type, zval *return_value, int start_now TSRMLS_DC); /* dynamic loading functions */ PHPAPI PHP_FUNCTION(dl); http://cvs.php.net/viewvc.cgi/php-src/main/php_ini.c?r1=1.161&r2=1.162&diff_format=u Index: php-src/main/php_ini.c diff -u php-src/main/php_ini.c:1.161 php-src/main/php_ini.c:1.162 --- php-src/main/php_ini.c:1.161 Fri Nov 9 16:02:50 2007 +++ php-src/main/php_ini.c Fri Nov 9 16:26:55 2007 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_ini.c,v 1.161 2007/11/09 16:02:50 jani Exp $ */ +/* $Id: php_ini.c,v 1.162 2007/11/09 16:26:55 jani Exp $ */ #include "php.h" #include "ext/standard/info.h" @@ -47,6 +47,7 @@ } php_extension_lists; /* True globals */ +static int is_special_section = 0; static HashTable *active_ini_hash; static HashTable configuration_hash; PHPAPI char *php_ini_opened_path=NULL; @@ -148,6 +149,7 @@ /* }}} */ /* php.ini support */ +#define PHP_EXTENSION_TOKEN "extension" #ifdef ZTS # if (ZEND_DEBUG) # define ZEND_EXTENSION_TOKEN "zend_extension_debug_ts" @@ -185,6 +187,7 @@ { zval *entry; HashTable *active_hash; + char *extension_name; if (active_ini_hash) { active_hash = active_ini_hash; @@ -199,19 +202,12 @@ break; } -/* FIXME: Should the extension loading be disabled for PATH sections? */ - /* PHP and Zend extensions are not added into configuration hash! */ - if (!strcasecmp(Z_STRVAL_P(arg1), "extension")) { /* load function module */ - zval copy; - - copy = *arg2; - zval_copy_ctor(©); - Z_SET_REFCOUNT(copy, 0); - 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)); - + if (!is_special_section && !strcasecmp(Z_STRVAL_P(arg1), "extension")) { /* load function module */ + extension_name = estrndup(Z_STRVAL_P(arg2), Z_STRLEN_P(arg2)); + zend_llist_add_element(&extension_lists.functions, &extension_name); + } else if (!is_special_section && !strcasecmp(Z_STRVAL_P(arg1), ZEND_EXTENSION_TOKEN)) { /* load Zend extension */ + extension_name = estrndup(Z_STRVAL_P(arg2), Z_STRLEN_P(arg2)); zend_llist_add_element(&extension_lists.engine, &extension_name); /* All other entries are added into either configuration_hash or active ini section array */ @@ -262,18 +258,21 @@ char *key = NULL; uint key_len; - /* Only PATH sections are handled here! */ + /* PATH sections */ if (!strncasecmp(Z_STRVAL_P(arg1), "PATH", sizeof("PATH") - 1)) { key = Z_STRVAL_P(arg1); key = key + sizeof("PATH") - 1; key_len = Z_STRLEN_P(arg1) - sizeof("PATH") + 1; + is_special_section = 1; -#if 0 /* Disable HOST sections for now. If someone can come up with some good usage case, then I can reconsider :) */ + /* HOST sections */ } else if (!strncasecmp(Z_STRVAL_P(arg1), "HOST", sizeof("HOST") - 1)) { key = Z_STRVAL_P(arg1); key = key + sizeof("HOST") - 1; key_len = Z_STRLEN_P(arg1) - sizeof("HOST") + 1; -#endif + is_special_section = 1; + } else { + is_special_section = 0; } if (key && key_len > 0) { @@ -313,14 +312,11 @@ } /* }}} */ -/* {{{ php_load_function_extension_cb +/* {{{ php_load_php_extension_cb */ -static void php_load_function_extension_cb(void *arg TSRMLS_DC) +static void php_load_php_extension_cb(void *arg TSRMLS_DC) { - zval *extension = (zval *) arg; - zval zval; - - php_dl(extension, MODULE_PERSISTENT, &zval, 0 TSRMLS_CC); + php_load_extension(*((char **) arg), MODULE_PERSISTENT, 0 TSRMLS_CC); } /* }}} */ @@ -351,7 +347,7 @@ } 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); + zend_llist_init(&extension_lists.functions, sizeof(zval), (llist_dtor_func_t) free_estring, 1); open_basedir = PG(open_basedir); @@ -678,7 +674,7 @@ void php_ini_register_extensions(TSRMLS_D) { zend_llist_apply(&extension_lists.engine, php_load_zend_extension_cb TSRMLS_CC); - zend_llist_apply(&extension_lists.functions, php_load_function_extension_cb TSRMLS_CC); + zend_llist_apply(&extension_lists.functions, php_load_php_extension_cb TSRMLS_CC); zend_llist_destroy(&extension_lists.engine); zend_llist_destroy(&extension_lists.functions);
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php