diff options
author | Francois Laupretre <francois@tekwire.net> | 2016-01-28 19:50:18 +0100 |
---|---|---|
committer | Sara Golemon <pollita@php.net> | 2017-06-22 12:58:15 -0400 |
commit | fe5c8f2b80e57c6470a56a8d775947fe0ded182e (patch) | |
tree | 171a791b6e1576002dff8d9624bbca3e40329d97 /main/php_ini.c | |
parent | 0f15a0302679fc100c06ad5f81af9117d6fa2a22 (diff) | |
download | php-git-fe5c8f2b80e57c6470a56a8d775947fe0ded182e.tar.gz |
Allow loading PHP and Zend extensions by name
Allow extension name as INI 'extension=' and dl() argument
No BC break, as file name is still accepted.
When using the '-z' command line option (CLI/CGI), an absolute file name must still be provided (nothing changed here)
Change comments in example INI files
Diffstat (limited to 'main/php_ini.c')
-rw-r--r-- | main/php_ini.c | 38 |
1 files changed, 33 insertions, 5 deletions
diff --git a/main/php_ini.c b/main/php_ini.c index 75b1695ec4..a378ce1926 100644 --- a/main/php_ini.c +++ b/main/php_ini.c @@ -362,15 +362,43 @@ static void php_load_zend_extension_cb(void *arg) if (IS_ABSOLUTE_PATH(filename, length)) { zend_load_extension(filename); } else { - char *libpath; + char *libpath, *orig_libpath; char *extension_dir = INI_STR("extension_dir"); int extension_dir_len = (int)strlen(extension_dir); - - if (IS_SLASH(extension_dir[extension_dir_len-1])) { - spprintf(&libpath, 0, "%s%s", extension_dir, filename); + int slash_suffix = IS_SLASH(extension_dir[extension_dir_len-1]); + /* 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 */ + } + if (VCWD_ACCESS(libpath, F_OK)) { + /* If file does not exist, consider as extension name and build file name */ + orig_libpath = libpath; +#if PHP_WIN32 + if (slash_suffix) { + spprintf(&libpath, 0, "%sphp_%s." PHP_SHLIB_SUFFIX, extension_dir, filename); /* SAFE */ + } else { + spprintf(&libpath, 0, "%s%cphp_%s." PHP_SHLIB_SUFFIX, extension_dir, DEFAULT_SLASH, filename); /* SAFE */ + } +#else + if (slash_suffix) { + spprintf(&libpath, 0, "%s%s." PHP_SHLIB_SUFFIX, extension_dir, filename); /* SAFE */ + } else { + spprintf(&libpath, 0, "%s%c%s." PHP_SHLIB_SUFFIX, extension_dir, DEFAULT_SLASH, filename); /* SAFE */ + } +#endif + if (VCWD_ACCESS(libpath, F_OK)) { + fprintf(stderr, "Cannot access Zend extension %s (Tried: %s, %s)\n", filename, orig_libpath, libpath); + /* See http://support.microsoft.com/kb/190351 */ + fflush(stderr); + efree(orig_libpath); + efree(libpath); + return; + } + efree(orig_libpath); } + zend_load_extension(libpath); efree(libpath); } |