We broke the defense against accessing other sessions' temp tables - Mailing list pgsql-hackers

From Tom Lane
Subject We broke the defense against accessing other sessions' temp tables
Date
Msg-id 2736425.1758475979@sss.pgh.pa.us
Whole thread Raw
Responses Re: We broke the defense against accessing other sessions' temp tables
List pgsql-hackers
In session 1:

regression=# create temp table tt(f1 int);
CREATE TABLE
regression=# insert into tt values(44);
INSERT 0 1
regression=# \d tt
               Table "pg_temp_77.tt"
 Column |  Type   | Collation | Nullable | Default 
--------+---------+-----------+----------+---------
 f1     | integer |           |          | 

In session 2:

regression=# select * from pg_temp_77.tt; -- use the schema shown in session 1
 f1 
----
(0 rows)

Branches before 17 show the expected failure

ERROR:  cannot access temporary tables of other sessions

but that's gone missing :-(.  Apparently, we refactored things enough
that ReadBufferExtended is not used for a simple seqscan, and since
that's where the check for an other-session temp table is, we get
no error and instead bogus results.  I did not bother to bisect to
find a culprit commit, but given that the failure manifests in 17,
I'm betting the stream I/O stuff is at fault.

I experimented with moving the check into PinBufferForBlock, and
that seems to work correctly, but I wonder if someone who's messed
with this code more recently than I would prefer a different
solution.

            regards, tom lane

diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c
index fe470de63f2..e27d74a24c2 100644
--- a/src/backend/storage/buffer/bufmgr.c
+++ b/src/backend/storage/buffer/bufmgr.c
@@ -655,7 +655,7 @@ PrefetchBuffer(Relation reln, ForkNumber forkNum, BlockNumber blockNum)

     if (RelationUsesLocalBuffers(reln))
     {
-        /* see comments in ReadBufferExtended */
+        /* see comments in PinBufferForBlock */
         if (RELATION_IS_OTHER_TEMP(reln))
             ereport(ERROR,
                     (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
@@ -807,16 +807,6 @@ ReadBufferExtended(Relation reln, ForkNumber forkNum, BlockNumber blockNum,
 {
     Buffer        buf;

-    /*
-     * 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 (RELATION_IS_OTHER_TEMP(reln))
-        ereport(ERROR,
-                (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
-                 errmsg("cannot access temporary tables of other sessions")));
-
     /*
      * Read the buffer, and update pgstat counters to reflect a cache hit or
      * miss.
@@ -1128,6 +1118,18 @@ PinBufferForBlock(Relation rel,

     if (persistence == RELPERSISTENCE_TEMP)
     {
+        /*
+         * 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.  We don't expect to get here
+         * without a relcache entry (see ReadBufferWithoutRelcache).
+         */
+        Assert(rel);
+        if (RELATION_IS_OTHER_TEMP(rel))
+            ereport(ERROR,
+                    (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+                     errmsg("cannot access temporary tables of other sessions")));
+
         io_context = IOCONTEXT_NORMAL;
         io_object = IOOBJECT_TEMP_RELATION;
     }

pgsql-hackers by date:

Previous
From: Pavel Stehule
Date:
Subject: Re: Add notification on BEGIN ATOMIC SQL functions using temp relations
Next
From: Tom Lane
Date:
Subject: Re: Add notification on BEGIN ATOMIC SQL functions using temp relations