On Mon, Jun 03, 2024 at 03:24:07PM -0700, Andres Freund wrote: > I'm confused - isn't using common/int.h entirely sufficient for that? Nearly > all architectures have more efficient ways to check for 64bit overflows than > doing actual 128 bit math.
One simple way to change the assertion would be something like that, I assume. Andres, does it answer your concerns? -- Michael
diff --git a/src/backend/storage/smgr/md.c b/src/backend/storage/smgr/md.c
index 6796756358..3849397b25 100644
--- a/src/backend/storage/smgr/md.c
+++ b/src/backend/storage/smgr/md.c
@@ -28,6 +28,7 @@
#include "access/xlogutils.h"
#include "commands/tablespace.h"
#include "common/file_utils.h"
+#include "common/int.h"
#include "miscadmin.h"
#include "pg_trace.h"
#include "pgstat.h"
@@ -929,8 +930,13 @@ mdwritev(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum,
const void **buffers, BlockNumber nblocks, bool skipFsync)
{
/* This assert is too expensive to have on normally ... */
-#ifdef CHECK_WRITE_VS_EXTEND
- Assert((uint64) blocknum + (uint64) nblocks <= (uint64) mdnblocks(reln, forknum));
+#if defined(USE_ASSERT_CHECKING) && defined(CHECK_WRITE_VS_EXTEND)
+ uint32 tot_blocks;
+
+ if (pg_add_u32_overflow(blocknum, nblocks, &tot_blocks))
+ Assert(false);
+
+ Assert(tot_blocks <= mdnblocks(reln, forknum));
#endif
while (nblocks > 0)
signature.asc
Description: PGP signature
