diff options
author | Francois Laupretre <francois@php.net> | 2017-07-13 14:27:19 +0200 |
---|---|---|
committer | Anatol Belski <ab@php.net> | 2017-07-13 14:27:19 +0200 |
commit | 0782a7fc6314c8bd3cbfd57f12d0479bf9cc8dc7 (patch) | |
tree | 8c054f98a3d9db3d728bcfd33ff8a00b70b28efb | |
parent | 613102bd678ab72fca412ce089e942bc33eb4046 (diff) | |
download | php-git-0782a7fc6314c8bd3cbfd57f12d0479bf9cc8dc7.tar.gz |
Fixed bug #74866 extension_dir = "./ext" now use current directory for base
-rw-r--r-- | Zend/zend_extensions.c | 19 | ||||
-rw-r--r-- | Zend/zend_extensions.h | 1 | ||||
-rw-r--r-- | ext/standard/dl.c | 59 | ||||
-rw-r--r-- | ext/standard/dl.h | 1 | ||||
-rw-r--r-- | main/php_ini.c | 17 |
5 files changed, 66 insertions, 31 deletions
diff --git a/Zend/zend_extensions.c b/Zend/zend_extensions.c index ceda2a3e8d..e556eb07bc 100644 --- a/Zend/zend_extensions.c +++ b/Zend/zend_extensions.c @@ -29,8 +29,6 @@ int zend_load_extension(const char *path) { #if ZEND_EXTENSIONS_SUPPORT DL_HANDLE handle; - zend_extension *new_extension; - zend_extension_version_info *extension_version_info; handle = DL_LOAD(path); if (!handle) { @@ -43,6 +41,22 @@ int zend_load_extension(const char *path) #endif return FAILURE; } + return zend_load_extension_handle(handle, path); +#else + fprintf(stderr, "Extensions are not supported on this platform.\n"); +/* See http://support.microsoft.com/kb/190351 */ +#ifdef ZEND_WIN32 + fflush(stderr); +#endif + return FAILURE; +#endif +} + +int zend_load_extension_handle(DL_HANDLE handle, const char *path) +{ +#if ZEND_EXTENSIONS_SUPPORT + zend_extension *new_extension; + zend_extension_version_info *extension_version_info; extension_version_info = (zend_extension_version_info *) DL_FETCH_SYMBOL(handle, "extension_version_info"); if (!extension_version_info) { @@ -62,7 +76,6 @@ int zend_load_extension(const char *path) return FAILURE; } - /* allow extension to proclaim compatibility with any Zend version */ if (extension_version_info->zend_extension_api_no != ZEND_EXTENSION_API_NO &&(!new_extension->api_no_check || new_extension->api_no_check(ZEND_EXTENSION_API_NO) != SUCCESS)) { if (extension_version_info->zend_extension_api_no > ZEND_EXTENSION_API_NO) { diff --git a/Zend/zend_extensions.h b/Zend/zend_extensions.h index caeb3a263b..ee9912c73f 100644 --- a/Zend/zend_extensions.h +++ b/Zend/zend_extensions.h @@ -145,6 +145,7 @@ void zend_shutdown_extensions(void); BEGIN_EXTERN_C() ZEND_API int zend_load_extension(const char *path); +ZEND_API int zend_load_extension_handle(DL_HANDLE handle, const char *path); ZEND_API int zend_register_extension(zend_extension *new_extension, DL_HANDLE handle); ZEND_API zend_extension *zend_get_extension(const char *extension_name); ZEND_API size_t zend_extensions_op_array_persist_calc(zend_op_array *op_array); diff --git a/ext/standard/dl.c b/ext/standard/dl.c index 5adae805ce..e9a107cc96 100644 --- a/ext/standard/dl.c +++ b/ext/standard/dl.c @@ -76,6 +76,31 @@ PHPAPI PHP_FUNCTION(dl) #if defined(HAVE_LIBDL) +/* {{{ php_load_shlib + */ +PHPAPI void *php_load_shlib(char *path, char **errp) +{ + void *handle; + char *err; + + handle = DL_LOAD(path); + if (!handle) { + err = GET_DL_ERROR(); +#ifdef PHP_WIN32 + if (err && (*err)) { + (*errp)=estrdup(err); + LocalFree(err); + } else { + (*errp) = estrdup("<No message>"); + } +#else + (*errp) = estrdup(err); + GET_DL_ERROR(); /* free the buffer storing the error */ +#endif + } + return handle; +} + /* {{{ php_load_extension */ PHPAPI int php_load_extension(char *filename, int type, int start_now) @@ -109,6 +134,7 @@ PHPAPI int php_load_extension(char *filename, int type, int start_now) libpath = estrdup(filename); } else if (extension_dir && extension_dir[0]) { int extension_dir_len = (int)strlen(extension_dir); + char *err1, *err2; slash_suffix = IS_SLASH(extension_dir[extension_dir_len-1]); /* Try as filename first */ if (slash_suffix) { @@ -117,8 +143,9 @@ PHPAPI int php_load_extension(char *filename, int type, int start_now) spprintf(&libpath, 0, "%s%c%s", extension_dir, DEFAULT_SLASH, filename); /* SAFE */ } - if (VCWD_ACCESS(libpath, F_OK)) { - /* If file does not exist, consider as extension name and build file name */ + handle = php_load_shlib(libpath, &err1); + if (!handle) { + /* Now, consider 'filename' as extension name and build file name */ char *orig_libpath = libpath; if (slash_suffix) { @@ -127,37 +154,23 @@ PHPAPI int php_load_extension(char *filename, int type, int start_now) spprintf(&libpath, 0, "%s%c" PHP_SHLIB_EXT_PREFIX "%s." PHP_SHLIB_SUFFIX, extension_dir, DEFAULT_SLASH, filename); /* SAFE */ } - if (VCWD_ACCESS(libpath, F_OK)) { - php_error(error_type, "Cannot access dynamic library '%s' (tried : %s, %s)", - filename, orig_libpath, libpath); + handle = php_load_shlib(libpath, &err2); + if (!handle) { + php_error_docref(NULL, error_type, "Unable to load dynamic library '%s' (tried: %s (%s), %s (%s))", + filename, orig_libpath, err1, libpath, err2); efree(orig_libpath); + efree(err1); efree(libpath); + efree(err2); return FAILURE; } efree(orig_libpath); + efree(err1); } } else { return FAILURE; /* Not full path given or extension_dir is not set */ } - /* load dynamic symbol */ - handle = DL_LOAD(libpath); - if (!handle) { -#ifdef PHP_WIN32 - char *err = GET_DL_ERROR(); - if (err && (*err != '\0')) { - php_error_docref(NULL, error_type, "Unable to load dynamic library '%s' - %s", libpath, err); - LocalFree(err); - } else { - php_error_docref(NULL, error_type, "Unable to load dynamic library '%s' - %s", libpath, "Unknown reason"); - } -#else - php_error_docref(NULL, error_type, "Unable to load dynamic library '%s' - %s", libpath, GET_DL_ERROR()); - GET_DL_ERROR(); /* free the buffer storing the error */ -#endif - efree(libpath); - return FAILURE; - } efree(libpath); get_module = (zend_module_entry *(*)(void)) DL_FETCH_SYMBOL(handle, "get_module"); diff --git a/ext/standard/dl.h b/ext/standard/dl.h index 642fb81fc4..d2e32e4e45 100644 --- a/ext/standard/dl.h +++ b/ext/standard/dl.h @@ -25,6 +25,7 @@ PHPAPI int php_load_extension(char *filename, int type, int start_now); PHPAPI void php_dl(char *file, int type, zval *return_value, int start_now); +PHPAPI void *php_load_shlib(char *path, char **errp); /* dynamic loading functions */ PHPAPI PHP_FUNCTION(dl); diff --git a/main/php_ini.c b/main/php_ini.c index 98896a5f86..4e013c8aca 100644 --- a/main/php_ini.c +++ b/main/php_ini.c @@ -362,10 +362,12 @@ static void php_load_zend_extension_cb(void *arg) if (IS_ABSOLUTE_PATH(filename, length)) { zend_load_extension(filename); } else { + DL_HANDLE handle; char *libpath; char *extension_dir = INI_STR("extension_dir"); int extension_dir_len = (int)strlen(extension_dir); int slash_suffix = IS_SLASH(extension_dir[extension_dir_len-1]); + char *err1, *err2; /* Try as filename first */ if (slash_suffix) { spprintf(&libpath, 0, "%s%s", extension_dir, filename); /* SAFE */ @@ -373,7 +375,8 @@ static void php_load_zend_extension_cb(void *arg) spprintf(&libpath, 0, "%s%c%s", extension_dir, DEFAULT_SLASH, filename); /* SAFE */ } - if (VCWD_ACCESS(libpath, F_OK)) { + handle = (DL_HANDLE)php_load_shlib(libpath, &err1); + if (!handle) { /* If file does not exist, consider as extension name and build file name */ char *orig_libpath = libpath; @@ -383,18 +386,22 @@ static void php_load_zend_extension_cb(void *arg) spprintf(&libpath, 0, "%s%c" PHP_SHLIB_EXT_PREFIX "%s." PHP_SHLIB_SUFFIX, extension_dir, DEFAULT_SLASH, filename); /* SAFE */ } - if (VCWD_ACCESS(libpath, F_OK)) { - php_error(E_CORE_WARNING, "Cannot access Zend extension %s (Tried: %s, %s)\n", - filename, orig_libpath, libpath); + handle = (DL_HANDLE)php_load_shlib(libpath, &err2); + if (!handle) { + php_error(E_CORE_WARNING, "Failed loading Zend extension '%s' (tried: %s (%s), %s (%s))", + filename, orig_libpath, err1, libpath, err2); efree(orig_libpath); + efree(err1); efree(libpath); + efree(err2); return; } efree(orig_libpath); + efree(err1); } - zend_load_extension(libpath); + zend_load_extension_handle(handle, libpath); efree(libpath); } } |