Fix off-by-one in XLogRecordMaxSize check.
authorNoah Misch <noah@leadboat.com>
Sat, 12 Aug 2023 21:37:05 +0000 (14:37 -0700)
committerNoah Misch <noah@leadboat.com>
Sat, 12 Aug 2023 21:37:05 +0000 (14:37 -0700)
pg_logical_emit_message(false, '_', repeat('x', 1069547465)) failed with
self-contradictory message "WAL record would be 1069547520 bytes (of
maximum 1069547520 bytes)".  There's no particular benefit from allowing
or denying one byte in either direction; XLogRecordMaxSize could rise a
few megabytes without trouble.  Hence, this is just for cleanliness.
Back-patch to v16, where this check first appeared.

src/backend/access/transam/xloginsert.c

index 54247e1d81bfc1ea4b9e07b5e5f9403093847a08..258cbd703555ab6883e8d2bccb181efad632187f 100644 (file)
@@ -900,7 +900,7 @@ XLogRecordAssemble(RmgrId rmid, uint8 info,
         * not emit records larger than the sizes advertised to be supported. This
         * cap is based on DecodeXLogRecordRequiredSpace().
         */
-       if (total_len >= XLogRecordMaxSize)
+       if (total_len > XLogRecordMaxSize)
                ereport(ERROR,
                                (errmsg_internal("oversized WAL record"),
                                 errdetail_internal("WAL record would be %llu bytes (of maximum %u bytes); rmid %u flags %u.",