Fix handling of errors in libpq pipelines
authorAlvaro Herrera <alvherre@alvh.no-ip.org>
Tue, 5 Dec 2023 11:43:24 +0000 (12:43 +0100)
committerAlvaro Herrera <alvherre@alvh.no-ip.org>
Tue, 5 Dec 2023 11:43:24 +0000 (12:43 +0100)
commitb8ba7344e9eb9bb505a92900b2a59257ef718135
treee4bb14dbecc0d7d422572e5e7dc17c30071c37ad
parent63c5df126abb7364b70dafe75fef576dd8eb0bbc
Fix handling of errors in libpq pipelines

The logic to keep the libpq command queue in sync with queries that have
been processed had a bug when errors were returned for reasons other
than problems in queries -- for example, when a connection is lost.  We
incorrectly consumed an element from the command queue every time, but
this is wrong and can lead to the queue becoming empty ahead of time,
leading to later malfunction: PQgetResult would return nothing,
potentially causing the calling application to enter a busy loop.

Fix by making the SYNC queue element a barrier that can only be consumed
when a SYNC message is received.

Backpatch to 14.

Reported by: Иван Трофимов (Ivan Trofimov) <i.trofimow@yandex.ru>
Discussion: https://postgr.es/m/17948-fcace7557e449957@postgresql.org
src/interfaces/libpq/fe-exec.c
src/interfaces/libpq/fe-protocol3.c
src/interfaces/libpq/libpq-int.h