aboutsummaryrefslogtreecommitdiff
path: root/src/backend
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend')
-rw-r--r--src/backend/utils/fmgr/fmgr.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/src/backend/utils/fmgr/fmgr.c b/src/backend/utils/fmgr/fmgr.c
index 308d7a0a239..00711a6f86c 100644
--- a/src/backend/utils/fmgr/fmgr.c
+++ b/src/backend/utils/fmgr/fmgr.c
@@ -153,7 +153,7 @@ fmgr_lookupByName(const char *name)
void
fmgr_info(Oid functionId, FmgrInfo *finfo)
{
- fmgr_info_cxt(functionId, finfo, CurrentMemoryContext);
+ fmgr_info_cxt_security(functionId, finfo, CurrentMemoryContext, false);
}
/*
@@ -168,7 +168,7 @@ fmgr_info_cxt(Oid functionId, FmgrInfo *finfo, MemoryContext mcxt)
/*
* This one does the actual work. ignore_security is ordinarily false
- * but is set to true by fmgr_security_definer to avoid recursion.
+ * but is set to true when we need to avoid recursion.
*/
static void
fmgr_info_cxt_security(Oid functionId, FmgrInfo *finfo, MemoryContext mcxt,
@@ -220,7 +220,7 @@ fmgr_info_cxt_security(Oid functionId, FmgrInfo *finfo, MemoryContext mcxt,
/*
* If it has prosecdef set, or non-null proconfig, use
* fmgr_security_definer call handler --- unless we are being called again
- * by fmgr_security_definer.
+ * by fmgr_security_definer or fmgr_info_other_lang.
*
* When using fmgr_security_definer, function stats tracking is always
* disabled at the outer level, and instead we set the flag properly in
@@ -403,7 +403,13 @@ fmgr_info_other_lang(Oid functionId, FmgrInfo *finfo, HeapTuple procedureTuple)
elog(ERROR, "cache lookup failed for language %u", language);
languageStruct = (Form_pg_language) GETSTRUCT(languageTuple);
- fmgr_info(languageStruct->lanplcallfoid, &plfinfo);
+ /*
+ * Look up the language's call handler function, ignoring any attributes
+ * that would normally cause insertion of fmgr_security_definer. We
+ * need to get back a bare pointer to the actual C-language function.
+ */
+ fmgr_info_cxt_security(languageStruct->lanplcallfoid, &plfinfo,
+ CurrentMemoryContext, true);
finfo->fn_addr = plfinfo.fn_addr;
/*