summaryrefslogtreecommitdiff
path: root/main/php_ini.c
diff options
context:
space:
mode:
Diffstat (limited to 'main/php_ini.c')
-rw-r--r--main/php_ini.c52
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