Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Guard against null arguments in binary_upgrade_create_empty_extension().
authorTom Lane <tgl@sss.pgh.pa.us>
Sun, 3 Jan 2016 21:26:38 +0000 (16:26 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Sun, 3 Jan 2016 21:26:38 +0000 (16:26 -0500)
The CHECK_IS_BINARY_UPGRADE macro is not sufficient security protection
if we're going to dereference pass-by-reference arguments before it.

But in any case we really need to explicitly check PG_ARGISNULL for all
the arguments of a non-strict function, not only the ones we expect null
values for.

Oversight in commits 30982be4e5019684e1772dd9170aaa53f5a8e894 and
f92fc4c95ddcc25978354a8248d3df22269201bc.  Found by Andreas Seltenreich.
(The other usages in pg_upgrade_support.c seem safe.)

src/backend/utils/adt/pg_upgrade_support.c

index b5c732bfca29947ab4053ef54aa0e629f05d8915..912eadaf369a4a1ac8dd11b8341aa258d472347d 100644 (file)
@@ -129,16 +129,28 @@ binary_upgrade_set_next_pg_authid_oid(PG_FUNCTION_ARGS)
 Datum
 binary_upgrade_create_empty_extension(PG_FUNCTION_ARGS)
 {
-   text       *extName = PG_GETARG_TEXT_PP(0);
-   text       *schemaName = PG_GETARG_TEXT_PP(1);
-   bool        relocatable = PG_GETARG_BOOL(2);
-   text       *extVersion = PG_GETARG_TEXT_PP(3);
+   text       *extName;
+   text       *schemaName;
+   bool        relocatable;
+   text       *extVersion;
    Datum       extConfig;
    Datum       extCondition;
    List       *requiredExtensions;
 
    CHECK_IS_BINARY_UPGRADE;
 
+   /* We must check these things before dereferencing the arguments */
+   if (PG_ARGISNULL(0) ||
+       PG_ARGISNULL(1) ||
+       PG_ARGISNULL(2) ||
+       PG_ARGISNULL(3))
+       elog(ERROR, "null argument to binary_upgrade_create_empty_extension is not allowed");
+
+   extName = PG_GETARG_TEXT_PP(0);
+   schemaName = PG_GETARG_TEXT_PP(1);
+   relocatable = PG_GETARG_BOOL(2);
+   extVersion = PG_GETARG_TEXT_PP(3);
+
    if (PG_ARGISNULL(4))
        extConfig = PointerGetDatum(NULL);
    else