[PATCH] Replace debug-only Asserts with runtime checks in logical replication apply worker

Varik Matevosyan <varikmatevosyan@gmail.com>

From: Varik Matevosyan <varikmatevosyan@gmail.com>
To: pgsql-bugs@lists.postgresql.org
Cc: Noah Misch <noah@leadboat.com>
Date: 2026-05-16T22:30:00Z
Lists: pgsql-bugs

Attachments

The attached patch replaces three debug-only Asserts with runtime
ereport(ERROR, ERRCODE_PROTOCOL_VIOLATION) checks in the logical
replication apply worker (worker.c). These guard against a mismatch
between the column count in the RELATION message and the count in a
subsequent INSERT/UPDATE/DELETE tuple message.

A publisher can send a RELATION claiming N columns and
an INSERT claiming M < N columns, causing the subscriber
to index past the end of the tuple's colvalues[]/colstatus[] arrays.

I believe this is more of a correctness fix than a security issue as
the attacker needs replication privileges, and in my testing I was not
able to trigger a SIGSEGV, the OOB read landed on heap bytes that
happened to not cause a crash.

P.S: After a security review from Noah, I'm reporting this as a bug.

Thanks,
Varik

Commits

Same data as JSON: GET /api/v1/messages/:b64id/commits the thread's linked commits as JSON, with link sources. API reference →
  1. Use ereport(ERROR), not Assert(), for publisher tuples missing columns.