Wrong off type in smgrfd and mdfd
Started by 邱宇航6 months ago1 messages
While reading code, I notice off in mdfd is an uint32, which might be
problematic. Considering enlarge segsize to 8GB and even larger, the off
might be overflowed. So I change it to off_t.
Best regards,
Yuhang Qiu
Attachments:
0001-Change-off-in-mdfd-from-uint32-to-off_t.patchapplication/octet-stream; name=0001-Change-off-in-mdfd-from-uint32-to-off_t.patch; x-unix-mode=0644Download
From 79ee8fe319e21e73407532ff5e9e84e988a7a8eb Mon Sep 17 00:00:00 2001
From: Yuhang Qiu <iamqyh@gmail.com>
Date: Fri, 4 Jul 2025 17:13:44 +0800
Subject: [PATCH] Change off in mdfd from uint32 to off_t
---
src/backend/storage/smgr/md.c | 2 +-
src/backend/storage/smgr/smgr.c | 6 +++---
src/include/storage/md.h | 2 +-
3 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/src/backend/storage/smgr/md.c b/src/backend/storage/smgr/md.c
index 2ccb0faceb5..85e72e51cdc 100644
--- a/src/backend/storage/smgr/md.c
+++ b/src/backend/storage/smgr/md.c
@@ -1467,7 +1467,7 @@ mdimmedsync(SMgrRelation reln, ForkNumber forknum)
}
int
-mdfd(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, uint32 *off)
+mdfd(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, off_t *off)
{
MdfdVec *v = mdopenfork(reln, forknum, EXTENSION_FAIL);
diff --git a/src/backend/storage/smgr/smgr.c b/src/backend/storage/smgr/smgr.c
index bce37a36d51..15e605c7483 100644
--- a/src/backend/storage/smgr/smgr.c
+++ b/src/backend/storage/smgr/smgr.c
@@ -122,7 +122,7 @@ typedef struct f_smgr
BlockNumber old_blocks, BlockNumber nblocks);
void (*smgr_immedsync) (SMgrRelation reln, ForkNumber forknum);
void (*smgr_registersync) (SMgrRelation reln, ForkNumber forknum);
- int (*smgr_fd) (SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, uint32 *off);
+ int (*smgr_fd) (SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, off_t *off);
} f_smgr;
static const f_smgr smgrsw[] = {
@@ -977,7 +977,7 @@ smgrimmedsync(SMgrRelation reln, ForkNumber forknum)
* process than where it was issued (e.g. in an IO worker).
*/
static int
-smgrfd(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, uint32 *off)
+smgrfd(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, off_t *off)
{
int fd;
@@ -1058,7 +1058,7 @@ smgr_aio_reopen(PgAioHandle *ioh)
PgAioOpData *od = pgaio_io_get_op_data(ioh);
SMgrRelation reln;
ProcNumber procno;
- uint32 off;
+ off_t off;
/*
* The caller needs to prevent interrupts from being processed, otherwise
diff --git a/src/include/storage/md.h b/src/include/storage/md.h
index b563c27abf0..613a97721fa 100644
--- a/src/include/storage/md.h
+++ b/src/include/storage/md.h
@@ -52,7 +52,7 @@ extern void mdtruncate(SMgrRelation reln, ForkNumber forknum,
BlockNumber curnblk, BlockNumber nblocks);
extern void mdimmedsync(SMgrRelation reln, ForkNumber forknum);
extern void mdregistersync(SMgrRelation reln, ForkNumber forknum);
-extern int mdfd(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, uint32 *off);
+extern int mdfd(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, off_t *off);
extern void ForgetDatabaseSyncRequests(Oid dbid);
extern void DropRelationFiles(RelFileLocator *delrels, int ndelrels, bool isRedo);
--
2.39.3