v0-0001-Don-t-strip-libdir-from-nested-module_pathnames.patch

application/x-patch

Filename: v0-0001-Don-t-strip-libdir-from-nested-module_pathnames.patch
Type: application/x-patch
Part: 0
Message: Re: Potential problem in commit f777d773878 and 4f7f7b03758

Patch

Format: format-patch
Series: patch v0-0001
Subject: Don't strip $libdir from nested module_pathnames
File+
src/backend/utils/fmgr/dfmgr.c 12 4
From c635b700b229a94101461e034bf739451c9f3b67 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 v0] Don't strip $libdir from nested module_pathnames

---
 src/backend/utils/fmgr/dfmgr.c | 16 ++++++++++++----
 1 file changed, 12 insertions(+), 4 deletions(-)

diff --git a/src/backend/utils/fmgr/dfmgr.c b/src/backend/utils/fmgr/dfmgr.c
index 4bb84ff7087..2ba86f3aeba 100644
--- a/src/backend/utils/fmgr/dfmgr.c
+++ b/src/backend/utils/fmgr/dfmgr.c
@@ -100,12 +100,20 @@ 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.
+	 * Check if the filename starts with "$libdir/". If it does, and the
+	 * remaining part of the string contains no directory separators, advance
+	 * the pointer to strip the prefix. This ensures that only simple
+	 * filenames (e.g., "$libdir/foo") are stripped, while full paths (e.g.,
+	 * "$libdir/foo/bar") are left untouched.
+	 *
+	 * This is because many extensions have hardcoded '$libdir/foo' as their
+	 * library name, which prevents using the search path.
 	 */
 	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.39.5 (Apple Git-154)