diff --git a/src/backend/utils/fmgr/dfmgr.c b/src/backend/utils/fmgr/dfmgr.c index 4bb84ff7087..3eb791e541b 100644 --- a/src/backend/utils/fmgr/dfmgr.c +++ b/src/backend/utils/fmgr/dfmgr.c @@ -71,7 +71,7 @@ char *Dynamic_library_path; static void *internal_load_library(const char *libname); pg_noreturn static void incompatible_module_error(const char *libname, const Pg_abi_values *module_magic_data); -static char *expand_dynamic_library_name(const char *name); +static char *expand_dynamic_library_name(const char *name, const char *original_name); static void check_restricted_library_name(const char *name); /* ABI values that module needs to match to be accepted */ @@ -96,6 +96,7 @@ load_external_function(const char *filename, const char *funcname, bool signalNotFound, void **filehandle) { char *fullname; + const char *original_name = filename; void *lib_handle; void *retval; @@ -108,7 +109,7 @@ load_external_function(const char *filename, const char *funcname, filename += 8; /* Expand the possibly-abbreviated filename to an exact path name */ - fullname = expand_dynamic_library_name(filename); + fullname = expand_dynamic_library_name(filename, original_name); /* Load the shared library, unless we already did */ lib_handle = internal_load_library(fullname); @@ -148,7 +149,7 @@ load_file(const char *filename, bool restricted) check_restricted_library_name(filename); /* Expand the possibly-abbreviated filename to an exact path name */ - fullname = expand_dynamic_library_name(filename); + fullname = expand_dynamic_library_name(filename, filename); /* Load the shared library, unless we already did */ (void) internal_load_library(fullname); @@ -456,7 +457,7 @@ get_loaded_module_details(DynamicFileList *dfptr, * The result will always be freshly palloc'd. */ static char * -expand_dynamic_library_name(const char *name) +expand_dynamic_library_name(const char *name, const char *original_name) { bool have_slash; char *new; @@ -474,16 +475,16 @@ expand_dynamic_library_name(const char *name) } else { - full = substitute_path_macro(name, "$libdir", pkglib_path); + full = substitute_path_macro(original_name, "$libdir", pkglib_path); if (pg_file_exists(full)) return full; pfree(full); } - new = psprintf("%s%s", name, DLSUFFIX); - if (!have_slash) { + new = psprintf("%s%s", name, DLSUFFIX); + full = find_in_path(new, Dynamic_library_path, "dynamic_library_path", "$libdir", pkglib_path); pfree(new); if (full) @@ -491,6 +492,8 @@ expand_dynamic_library_name(const char *name) } else { + new = psprintf("%s%s", original_name, DLSUFFIX); + full = substitute_path_macro(new, "$libdir", pkglib_path); pfree(new); if (pg_file_exists(full))