v1-0001-Fix-Don-t-strip-libdir-from-nested-module_pathnam.patch
application/octet-stream
Filename: v1-0001-Fix-Don-t-strip-libdir-from-nested-module_pathnam.patch
Type: application/octet-stream
Part: 0
Patch
Format: format-patch
Series: patch v1-0001
Subject: Fix: Don't strip $libdir from nested module_pathnames
| File | + | − |
|---|---|---|
| src/backend/utils/fmgr/dfmgr.c | 11 | 4 |
From b08f54adddc0beaa79a330dd3c9e2f3ff25b3d08 Mon Sep 17 00:00:00 2001
From: Matheus Alcantara <mths.dev@pm.me>
Date: Fri, 22 Aug 2025 10:23:31 -0300
Subject: [PATCH v1] Fix: Don't strip $libdir from nested module_pathnames
This patch fixes a bug in how 'load_external_function' handles
'$libdir/ prefixes in module paths.
Previously, 'load_external_function' would unconditionally strip
'$libdir/' from the beginning of the 'filename' string. This
caused an issue when the path was nested, such as "$libdir/nested/my_lib".
Stripping the prefix resulted in a path of "nested/my_lib", which would
fail to be found by the expand_dynamic_library_name function because
the original '$libdir' macro was removed.
To fix this, the code now checks for the presence of an additional
directory separator ('/' or '\') after the '$libdir/' prefix. The prefix
is only stripped if the remaining string does not contain a separator.
This ensures that simple filenames like '"$libdir/my_lib"' are correctly
handled, while nested paths are left intact for 'expand_dynamic_library_name'
to process correctly.
Reported By: Dilip Kumar
Author: Matheus Alcantara
Author: Dilip Kumar
Reviewer: Srinath Reddy Sadipiralla
---
src/backend/utils/fmgr/dfmgr.c | 15 +++++++++++----
1 file changed, 11 insertions(+), 4 deletions(-)
diff --git a/src/backend/utils/fmgr/dfmgr.c b/src/backend/utils/fmgr/dfmgr.c
index 4bb84ff7087..d39966829fd 100644
--- a/src/backend/utils/fmgr/dfmgr.c
+++ b/src/backend/utils/fmgr/dfmgr.c
@@ -100,12 +100,19 @@ load_external_function(const char *filename, const char *funcname,
void *retval;
/*
- * If the value starts with "$libdir/", strip that. This is because many
- * extensions have hardcoded '$libdir/foo' as their library name, which
- * prevents using the path.
+ * For extensions with hardcoded '$libdir/' library names, we strip the
+ * prefix to allow the library search path to be used. This is done only
+ * for simple names (e.g., "$libdir/foo"), not for nested paths
+ * (e.g., "$libdir/foo/bar").
+ *
+ * For nested paths, 'expand_dynamic_library_name' directly expands the
+ * '$libdir' macro, so we leave them untouched.
*/
if (strncmp(filename, "$libdir/", 8) == 0)
- filename += 8;
+ {
+ if (first_dir_separator(filename + 8) == NULL)
+ filename += 8;
+ }
/* Expand the possibly-abbreviated filename to an exact path name */
fullname = expand_dynamic_library_name(filename);
--
2.51.0.261.g7ce5a0a67e-goog