We broke the defense against accessing other sessions' temp tables
От | Tom Lane |
---|---|
Тема | We broke the defense against accessing other sessions' temp tables |
Дата | |
Msg-id | 2736425.1758475979@sss.pgh.pa.us обсуждение исходный текст |
Ответы |
Re: We broke the defense against accessing other sessions' temp tables
|
Список | 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 по дате отправления: