Make LOAD of an already-loaded library into a no-op, instead of attempting
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 3 Sep 2009 22:11:30 +0000 (22:11 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 3 Sep 2009 22:11:30 +0000 (22:11 +0000)
to unload and re-load the library.

The difficulty with unloading a library is that we haven't defined safe
protocols for doing so.  In particular, there's no safe mechanism for
getting out of a "hook" function pointer unless libraries are unloaded
in reverse order of loading.  And there's no mechanism at all for undefining
a custom GUC variable, so GUC would be left with a pointer to an old value
that might or might not still be valid, and very possibly wouldn't be in
the same place anymore.

While the unload and reload behavior had some usefulness in easing
development of new loadable libraries, it's of no use whatever to normal
users, so just disabling it isn't giving up that much.  Someday we might
care to expend the effort to develop safe unload protocols; but even if
we did, there'd be little certainty that every third-party loadable module
was following them, so some security restrictions would still be needed.

Back-patch to 8.2; before that, LOAD was superuser-only anyway.

Security: unprivileged users could crash backend.  CVE not assigned yet

doc/src/sgml/ref/create_function.sgml
doc/src/sgml/ref/load.sgml
doc/src/sgml/xfunc.sgml
src/backend/utils/fmgr/dfmgr.c

index 20fc0bc8988cba2bb328dc85259749373d77f3d7..56719b44d184b80f79db646e14f3b7843ce7544c 100644 (file)
@@ -1,5 +1,5 @@
 <!--
-$PostgreSQL: pgsql/doc/src/sgml/ref/create_function.sgml,v 1.70.2.2 2007/04/23 16:52:56 neilc Exp $
+$PostgreSQL: pgsql/doc/src/sgml/ref/create_function.sgml,v 1.70.2.3 2009/09/03 22:11:30 tgl Exp $
 -->
 
 <refentry id="SQL-CREATEFUNCTION">
@@ -400,9 +400,9 @@ CREATE FUNCTION foo(int, out text) ...
 
    <para>
     When repeated <command>CREATE FUNCTION</command> calls refer to
-    the same object file, the file is only loaded once.  To unload and
-    reload the file (perhaps during development), use the <xref
-    linkend="sql-load" endterm="sql-load-title"> command.
+    the same object file, the file is only loaded once per session.
+    To unload and
+    reload the file (perhaps during development), start a new session.
    </para>
 
    <para>
index 5fc5817e5f2c7ba7dcf75fe04ebbcea45f174f58..92d06e8fb2220fd8d76a718a2fbfd8344108c2b9 100644 (file)
@@ -1,5 +1,5 @@
 <!--
-$PostgreSQL: pgsql/doc/src/sgml/ref/load.sgml,v 1.23 2006/09/16 00:30:19 momjian Exp $
+$PostgreSQL: pgsql/doc/src/sgml/ref/load.sgml,v 1.23.2.1 2009/09/03 22:11:30 tgl Exp $
 -->
 
 <refentry id="SQL-LOAD">
@@ -10,7 +10,7 @@ $PostgreSQL: pgsql/doc/src/sgml/ref/load.sgml,v 1.23 2006/09/16 00:30:19 momjian
 
  <refnamediv>
   <refname>LOAD</refname>
-  <refpurpose>load or reload a shared library file</refpurpose>
+  <refpurpose>load a shared library file</refpurpose>
  </refnamediv>
 
  <indexterm zone="sql-load">
@@ -28,13 +28,12 @@ LOAD '<replaceable class="PARAMETER">filename</replaceable>'
 
   <para>
    This command loads a shared library file into the <productname>PostgreSQL</>
-   server's address space.  If the file had been loaded previously,
-   it is first unloaded.  This command is primarily useful to unload
-   and reload a shared library file that has been changed since the
-   server first loaded it.  To make use of the shared library,
-   function(s) in it need to be declared using the <xref
-   linkend="sql-createfunction" endterm="sql-createfunction-title">
-   command.
+   server's address space.  If the file has been loaded already,
+   the command does nothing.  Shared library files that contain C functions
+   are automatically loaded whenever one of their functions is called.
+   Therefore, an explicit <command>LOAD</> is usually only needed to
+   load a library that modifies the server's behavior through <quote>hooks</>
+   rather than providing a set of functions.
   </para>
 
   <para>
index 6cac5ec3fb76c21d9b7d21d4da3ba80854b72770..9741cfddeecfdf73f055c09b7eb40242e1655f0e 100644 (file)
@@ -1,4 +1,4 @@
-<!-- $PostgreSQL: pgsql/doc/src/sgml/xfunc.sgml,v 1.120.2.1 2007/01/30 22:29:40 momjian Exp $ -->
+<!-- $PostgreSQL: pgsql/doc/src/sgml/xfunc.sgml,v 1.120.2.2 2009/09/03 22:11:30 tgl Exp $ -->
 
  <sect1 id="xfunc">
   <title>User-Defined Functions</title>
@@ -1213,9 +1213,7 @@ PG_MODULE_MAGIC;
     file is retained in memory.  Future calls in the same session to
     the function(s) in that file will only incur the small overhead of
     a symbol table lookup.  If you need to force a reload of an object
-    file, for example after recompiling it, use the <xref
-    linkend="sql-load" endterm="sql-load-title"> command or begin a
-    fresh session.
+    file, for example after recompiling it, begin a fresh session.
    </para>
 
    <indexterm zone="xfunc-c-dynload">
@@ -1241,8 +1239,8 @@ PG_MODULE_MAGIC;
     unloading the file.  Likewise, the function receives no parameters and
     should return void.  Note that <function>_PG_fini</> will only be called
     during an unload of the file, not during process termination.
-    (Presently, an unload only happens in the context of re-loading
-    the file due to an explicit <command>LOAD</> command.)
+    (Presently, unloads are disabled and will never occur, but this may
+    change in the future.)
    </para>
 
   </sect2>
index ceefe4449789a80bfa6e193e27c882320bfc65cc..a74d3e5351c14cfc1754fdc511b2b5ab55d8c473 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/utils/fmgr/dfmgr.c,v 1.92 2006/10/06 17:13:59 petere Exp $
+ *   $PostgreSQL: pgsql/src/backend/utils/fmgr/dfmgr.c,v 1.92.2.1 2009/09/03 22:11:30 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -310,10 +310,17 @@ internal_load_library(const char *libname)
  * Unload the specified dynamic-link library file, if it is loaded.
  *
  * Note: libname is expected to be an exact name for the library file.
+ *
+ * XXX for the moment, this is disabled, resulting in LOAD of an already-loaded
+ * library always being a no-op.  We might re-enable it someday if we can
+ * convince ourselves we have safe protocols for un-hooking from hook function
+ * pointers, releasing custom GUC variables, and perhaps other things that
+ * are definitely unsafe currently.
  */
 static void
 internal_unload_library(const char *libname)
 {
+#ifdef NOT_USED
    DynamicFileList *file_scanner,
               *prv,
               *nxt;
@@ -361,6 +368,7 @@ internal_unload_library(const char *libname)
        else
            prv = file_scanner;
    }
+#endif /* NOT_USED */
 }
 
 static bool