mirror of
https://github.com/postgres/postgres.git
synced 2025-11-24 00:23:06 +03:00
Avoid passing function pointers across process boundaries.
We'd already recognized that we can't pass function pointers across process boundaries for functions in loadable modules, since a shared library could get loaded at different addresses in different processes. But actually the practice doesn't work for functions in the core backend either, if we're using EXEC_BACKEND. This is the cause of recent failures on buildfarm member culicidae. Switch to passing a string function name in all cases. Something like this needs to be back-patched into 9.6, but let's see if the buildfarm likes it first. Petr Jelinek, with a bunch of basically-cosmetic adjustments by me Discussion: https://postgr.es/m/548f9c1d-eafa-e3fa-9da8-f0cc2f654e60@2ndquadrant.com
This commit is contained in:
@@ -91,7 +91,7 @@ static const Pg_magic_struct magic_data = PG_MODULE_MAGIC_DATA;
|
||||
* at less cost than repeating load_external_function.
|
||||
*/
|
||||
PGFunction
|
||||
load_external_function(char *filename, char *funcname,
|
||||
load_external_function(const char *filename, const char *funcname,
|
||||
bool signalNotFound, void **filehandle)
|
||||
{
|
||||
char *fullname;
|
||||
@@ -108,8 +108,12 @@ load_external_function(char *filename, char *funcname,
|
||||
if (filehandle)
|
||||
*filehandle = lib_handle;
|
||||
|
||||
/* Look up the function within the library */
|
||||
retval = (PGFunction) pg_dlsym(lib_handle, funcname);
|
||||
/*
|
||||
* Look up the function within the library. According to POSIX dlsym()
|
||||
* should declare its second argument as "const char *", but older
|
||||
* platforms might not, so for the time being we just cast away const.
|
||||
*/
|
||||
retval = (PGFunction) pg_dlsym(lib_handle, (char *) funcname);
|
||||
|
||||
if (retval == NULL && signalNotFound)
|
||||
ereport(ERROR,
|
||||
@@ -155,9 +159,10 @@ load_file(const char *filename, bool restricted)
|
||||
* Return (PGFunction) NULL if not found.
|
||||
*/
|
||||
PGFunction
|
||||
lookup_external_function(void *filehandle, char *funcname)
|
||||
lookup_external_function(void *filehandle, const char *funcname)
|
||||
{
|
||||
return (PGFunction) pg_dlsym(filehandle, funcname);
|
||||
/* as above, cast away const for the time being */
|
||||
return (PGFunction) pg_dlsym(filehandle, (char *) funcname);
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user