summaryrefslogtreecommitdiff
path: root/main/php_ini.c
diff options
context:
space:
mode:
authorFrancois Laupretre <francois@tekwire.net>2016-01-28 19:50:18 +0100
committerSara Golemon <pollita@php.net>2017-06-22 12:58:15 -0400
commitfe5c8f2b80e57c6470a56a8d775947fe0ded182e (patch)
tree171a791b6e1576002dff8d9624bbca3e40329d97 /main/php_ini.c
parent0f15a0302679fc100c06ad5f81af9117d6fa2a22 (diff)
downloadphp-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.c38
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);
}