]> granicus.if.org Git - postgresql/commitdiff
Fix contrib/pgstattuple and contrib/pageinspect to prevent attempts to read
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 31 Mar 2009 22:54:52 +0000 (22:54 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 31 Mar 2009 22:54:52 +0000 (22:54 +0000)
temporary tables of other sessions; that is unsafe because of the way our
buffer management works.  Per report from Stuart Bishop.
This is redundant with the bufmgr.c checks in HEAD, but not at all redundant
in the back branches.

contrib/pageinspect/btreefuncs.c
contrib/pageinspect/rawpage.c
contrib/pgstattuple/pgstatindex.c
contrib/pgstattuple/pgstattuple.c

index ce8b97e46baadd6888c975ba8808fa99e98dfd48..c50c5da0bdbc803f25114ddc25a7c9a604ea85a3 100644 (file)
@@ -186,6 +186,16 @@ bt_page_stats(PG_FUNCTION_ARGS)
                elog(ERROR, "relation \"%s\" is not a btree index",
                         RelationGetRelationName(rel));
 
+       /*
+        * Reject attempts to read non-local temporary relations; we would
+        * be likely to get wrong data since we have no visibility into the
+        * owning session's local buffers.
+        */
+       if (isOtherTempNamespace(RelationGetNamespace(rel)))
+               ereport(ERROR,
+                               (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+                                errmsg("cannot access temporary tables of other sessions")));
+
        if (blkno == 0)
                elog(ERROR, "block 0 is a meta page");
 
@@ -294,6 +304,16 @@ bt_page_items(PG_FUNCTION_ARGS)
                        elog(ERROR, "relation \"%s\" is not a btree index",
                                 RelationGetRelationName(rel));
 
+               /*
+                * Reject attempts to read non-local temporary relations; we would
+                * be likely to get wrong data since we have no visibility into the
+                * owning session's local buffers.
+                */
+               if (isOtherTempNamespace(RelationGetNamespace(rel)))
+                       ereport(ERROR,
+                                       (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+                                        errmsg("cannot access temporary tables of other sessions")));
+
                if (blkno == 0)
                        elog(ERROR, "block 0 is a meta page");
 
@@ -433,6 +453,16 @@ bt_metap(PG_FUNCTION_ARGS)
                elog(ERROR, "relation \"%s\" is not a btree index",
                         RelationGetRelationName(rel));
 
+       /*
+        * Reject attempts to read non-local temporary relations; we would
+        * be likely to get wrong data since we have no visibility into the
+        * owning session's local buffers.
+        */
+       if (isOtherTempNamespace(RelationGetNamespace(rel)))
+               ereport(ERROR,
+                               (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+                                errmsg("cannot access temporary tables of other sessions")));
+
        buffer = ReadBuffer(rel, 0);
        page = BufferGetPage(buffer);
        metad = BTPageGetMeta(page);
index 230d27133b8061699ef05ea6d17f0d966d36d8ba..75ab6fbfa32ebb80b46f6b5cc88b4df36cf12601 100644 (file)
@@ -8,7 +8,7 @@
  * Copyright (c) 2007-2008, PostgreSQL Global Development Group
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/contrib/pageinspect/rawpage.c,v 1.4 2008/01/01 20:31:21 tgl Exp $
+ *       $PostgreSQL: pgsql/contrib/pageinspect/rawpage.c,v 1.4.2.1 2009/03/31 22:54:52 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -68,6 +68,16 @@ get_raw_page(PG_FUNCTION_ARGS)
                                 errmsg("cannot get raw page from composite type \"%s\"",
                                                RelationGetRelationName(rel))));
 
+       /*
+        * Reject attempts to read non-local temporary relations; we would
+        * be likely to get wrong data since we have no visibility into the
+        * owning session's local buffers.
+        */
+       if (isOtherTempNamespace(RelationGetNamespace(rel)))
+               ereport(ERROR,
+                               (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+                                errmsg("cannot access temporary tables of other sessions")));
+
        if (blkno >= RelationGetNumberOfBlocks(rel))
                elog(ERROR, "block number %u is out of range for relation \"%s\"",
                         blkno, RelationGetRelationName(rel));
index 3cd31478956f2c6bd5e353f085c60b1d3f0faacb..f766739d744c1eb92447d09ef719e95a298e19da 100644 (file)
@@ -103,6 +103,16 @@ pgstatindex(PG_FUNCTION_ARGS)
                elog(ERROR, "relation \"%s\" is not a btree index",
                         RelationGetRelationName(rel));
 
+       /*
+        * Reject attempts to read non-local temporary relations; we would
+        * be likely to get wrong data since we have no visibility into the
+        * owning session's local buffers.
+        */
+       if (isOtherTempNamespace(RelationGetNamespace(rel)))
+               ereport(ERROR,
+                               (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+                                errmsg("cannot access temporary tables of other sessions")));
+
        /*
         * Read metapage
         */
@@ -261,6 +271,8 @@ pg_relpages(PG_FUNCTION_ARGS)
        relrv = makeRangeVarFromNameList(textToQualifiedNameList(relname));
        rel = relation_openrv(relrv, AccessShareLock);
 
+       /* note: this will work OK on non-local temp tables */
+
        relpages = RelationGetNumberOfBlocks(rel);
 
        relation_close(rel, AccessShareLock);
index d252e23847d6676e83e6945d855ddc1850cadbd6..989911fdd88b68f548ea8203ec5f380b67681722 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $PostgreSQL: pgsql/contrib/pgstattuple/pgstattuple.c,v 1.32 2008/01/14 02:53:31 tgl Exp $
+ * $PostgreSQL: pgsql/contrib/pgstattuple/pgstattuple.c,v 1.32.2.1 2009/03/31 22:54:52 tgl Exp $
  *
  * Copyright (c) 2001,2002     Tatsuo Ishii
  *
@@ -196,6 +196,16 @@ pgstat_relation(Relation rel, FunctionCallInfo fcinfo)
 {
        const char *err;
 
+       /*
+        * Reject attempts to read non-local temporary relations; we would
+        * be likely to get wrong data since we have no visibility into the
+        * owning session's local buffers.
+        */
+       if (isOtherTempNamespace(RelationGetNamespace(rel)))
+               ereport(ERROR,
+                               (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+                                errmsg("cannot access temporary tables of other sessions")));
+
        switch (rel->rd_rel->relkind)
        {
                case RELKIND_RELATION: