Skip to content

Commit 7430c77

Browse files
committed
Check for relation length overrun soon enough.
We don't allow relations to exceed 2^32-1 blocks, because block numbers are 32 bits and the last possible block number is reserved to mean InvalidBlockNumber. There is a check for this in mdextend, but that's really way too late, because the smgr API requires us to create a buffer for the block-to-be-added, and we do not want to have any buffer with blocknum InvalidBlockNumber. (Such a case can trigger assertions in bufmgr.c, plus I think it might confuse ReadBuffer's logic for data-past-EOF later on.) So put the check into ReadBuffer. Per report from Christoph Berg. It's been like this forever, so back-patch to all supported branches. Discussion: https://postgr.es/m/YTn1iTkUYBZfcODk@msg.credativ.de
1 parent b5ec22b commit 7430c77

File tree

2 files changed

+11
-1
lines changed

2 files changed

+11
-1
lines changed

src/backend/storage/buffer/bufmgr.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -830,7 +830,16 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum,
830830

831831
/* Substitute proper block number if caller asked for P_NEW */
832832
if (isExtend)
833+
{
833834
blockNum = smgrnblocks(smgr, forkNum);
835+
/* Fail if relation is already at maximum possible length */
836+
if (blockNum == P_NEW)
837+
ereport(ERROR,
838+
(errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
839+
errmsg("cannot extend relation %s beyond %u blocks",
840+
relpath(smgr->smgr_rnode, forkNum),
841+
P_NEW)));
842+
}
834843

835844
if (isLocalBuf)
836845
{

src/backend/storage/smgr/md.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -426,7 +426,8 @@ mdextend(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum,
426426
/*
427427
* If a relation manages to grow to 2^32-1 blocks, refuse to extend it any
428428
* more --- we mustn't create a block whose number actually is
429-
* InvalidBlockNumber.
429+
* InvalidBlockNumber. (Note that this failure should be unreachable
430+
* because of upstream checks in bufmgr.c.)
430431
*/
431432
if (blocknum == InvalidBlockNumber)
432433
ereport(ERROR,

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy