diff options
Diffstat (limited to 'main/php_ini.c')
-rw-r--r-- | main/php_ini.c | 52 |
1 files changed, 45 insertions, 7 deletions
diff --git a/main/php_ini.c b/main/php_ini.c index 87287f9da6..fca263e5f0 100644 --- a/main/php_ini.c +++ b/main/php_ini.c @@ -350,10 +350,11 @@ static void php_load_php_extension_cb(void *arg) /* {{{ php_load_zend_extension_cb */ +#ifdef HAVE_LIBDL static void php_load_zend_extension_cb(void *arg) { char *filename = *((char **) arg); - const int length = (int)strlen(filename); + const size_t length = strlen(filename); #ifndef PHP_WIN32 (void) length; @@ -362,19 +363,56 @@ static void php_load_zend_extension_cb(void *arg) if (IS_ABSOLUTE_PATH(filename, length)) { zend_load_extension(filename); } else { - char *libpath; + DL_HANDLE handle; + char *libpath; char *extension_dir = INI_STR("extension_dir"); - int extension_dir_len = (int)strlen(extension_dir); + int slash_suffix = 0; + char *err1, *err2; + + if (extension_dir && extension_dir[0]) { + slash_suffix = IS_SLASH(extension_dir[strlen(extension_dir)-1]); + } - if (IS_SLASH(extension_dir[extension_dir_len-1])) { - spprintf(&libpath, 0, "%s%s", extension_dir, filename); + /* Try as filename first */ + if (slash_suffix) { + spprintf(&libpath, 0, "%s%s", extension_dir, filename); /* SAFE */ } else { - spprintf(&libpath, 0, "%s%c%s", extension_dir, DEFAULT_SLASH, filename); + spprintf(&libpath, 0, "%s%c%s", extension_dir, DEFAULT_SLASH, filename); /* SAFE */ + } + + 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; + + if (slash_suffix) { + spprintf(&libpath, 0, "%s" PHP_SHLIB_EXT_PREFIX "%s." PHP_SHLIB_SUFFIX, extension_dir, filename); /* SAFE */ + } else { + spprintf(&libpath, 0, "%s%c" PHP_SHLIB_EXT_PREFIX "%s." PHP_SHLIB_SUFFIX, extension_dir, DEFAULT_SLASH, filename); /* SAFE */ + } + + 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); } } +#else +static void php_load_zend_extension_cb(void *arg) { } +#endif /* }}} */ /* {{{ php_init_config |