libpq: pipeline mode might desynchronize client and server

Started by Ivan Trofimovover 2 years ago3 messagesbugs
Jump to latest
#1Ivan Trofimov
i.trofimow@yandex.ru

Hi!

This is a follow up on
/messages/by-id/17948-fcace7557e449957@postgresql.org.

Libpq in pipeline mode considers '< 2TDCEZ' a sufficient response to
'> BDESS', when according to specification one more 'Z' is expected.
This leads to client <-> server desynchronization, when libpq parses the
very next message server sends (which is Z, as expected).

A bit more context and a MRE:
https://github.com/itrofimow/libpq_protocol_desync

I'm pretty sure that this branch
https://github.com/postgres/postgres/blob/3af101ce8be8eeb0e8adc61e293b5d12989f68be/src/interfaces/libpq/fe-exec.c#L2124
should be adjusted to handle the case and do not match error response
against sync query.

#2Michael Paquier
michael@paquier.xyz
In reply to: Ivan Trofimov (#1)
Re: libpq: pipeline mode might desynchronize client and server

On Wed, Nov 22, 2023 at 03:13:46AM +0300, Ivan Trofimov wrote:

This is a follow up on
/messages/by-id/17948-fcace7557e449957@postgresql.org.

Is this the same bug as discussed on this other thread? Why is there
a need for a second thread?

Libpq in pipeline mode considers '< 2TDCEZ' a sufficient response to
'> BDESS', when according to specification one more 'Z' is expected.
This leads to client <-> server desynchronization, when libpq parses the
very next message server sends (which is Z, as expected).

A bit more context and a MRE:
https://github.com/itrofimow/libpq_protocol_desync

I'm pretty sure that this branch https://github.com/postgres/postgres/blob/3af101ce8be8eeb0e8adc61e293b5d12989f68be/src/interfaces/libpq/fe-exec.c#L2124
should be adjusted to handle the case and do not match error response
against sync query.

Could you attach the test case to the original thread please (assuming
that this is the same problem)? If this data is deleted by github,
then any data making a problem reproducible would be lost.
--
Michael

#3Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Michael Paquier (#2)
Re: libpq: pipeline mode might desynchronize client and server

On 2023-Nov-24, Michael Paquier wrote:

On Wed, Nov 22, 2023 at 03:13:46AM +0300, Ivan Trofimov wrote:

Libpq in pipeline mode considers '< 2TDCEZ' a sufficient response to
'> BDESS', when according to specification one more 'Z' is expected.
This leads to client <-> server desynchronization, when libpq parses the
very next message server sends (which is Z, as expected).

A bit more context and a MRE:
https://github.com/itrofimow/libpq_protocol_desync

I'm pretty sure that this branch https://github.com/postgres/postgres/blob/3af101ce8be8eeb0e8adc61e293b5d12989f68be/src/interfaces/libpq/fe-exec.c#L2124
should be adjusted to handle the case and do not match error response
against sync query.

Could you attach the test case to the original thread please (assuming
that this is the same problem)? If this data is deleted by github,
then any data making a problem reproducible would be lost.

FWIW I started looking at this problem a couple of days ago. I had not
noticed the previous thread.

--
Álvaro Herrera Breisgau, Deutschland — https://www.EnterpriseDB.com/
"El hombre nunca sabe de lo que es capaz hasta que lo intenta" (C. Dickens)