Сборка пакета pgbouncer с исправлением проблемы

Содержание

Описание проблемы и решения

Столкнулся с проблемой - pgbouncer внезапно просто упал. После перезапуска посмотрел в его журнал и увидел одно сообщение об ошибке перез завершением работы:

2026-08-17 11:02:15.536 +05 [1229056] FATAL @src/objects.c:1052 in function disconnect_client(): bad client state: 0

С помощью поиска в интернете нашёл отчёт об этой проблеме: FATAL @src/objects.c:1052 in function disconnect_client(): bad client state: 0 #801

Проблема была исправлена в рамках исправления отчёте о проблеме: Fix: FATAL in function disconnect_client(): bad client state: 0 #846

Само исправление можно найти по ссылке: Fix: FATAL in function disconnect_client(): bad client state: 0 #846

В системе был установлен пакет pgbouncer версии 1.18.0:

root@postgresql:~# dpkg -l | grep pgbouncer
ii  pgbouncer                          1.18.0-1                       amd64        lightweight connection pooler for PostgreSQL

В официальных репозиториях Debian имелся более свежий пакет той же версии 1.18.0, но с одним новым исправлением:

root@postgresql:~# apt-cache policy pgbouncer
pgbouncer:
  Installed: 1.18.0-1
  Candidate: 1.18.0-1+deb12u1
  Version table:
     1.18.0-1+deb12u1 500
        500 http://mirror.ufanet.ru/debian bookworm/main amd64 Packages
 *** 1.18.0-1 100
        100 /var/lib/dpkg/status

Чтобы посмотреть состав исправлений, нашёл информацию о пакете на сайте Debian

На странице пакета перешёл по ссылке Отслеживание заплат Debian

В исправлении ошибки фигурировали только файлы src/object.c и tests/test_timeouts.py, а в заплатах фигурировал только файл src/objects.c и я перешёл по соответствующей ссылке, чтобы сравнить изменения и узнать, попали ли исправления в пакет из репозитория: https://sources.debian.org/data/main/p/pgbouncer/1.18.0-1%2Bdeb12u1/debian/patches/CVE-2025-12819.patch

Оказалось, что необходимые изменения в репозитории Debian отсутствуют и я решил собрать пакет с исправлением самостоятельно.

Подготовка сборочной системы

Для этого я установил в виртуальную машину Debian 12 Bookworm (можно попробовать сделать подобное в контейнере Docker), настроил внутри неё репозитории в файле /etc/apt/sources.list:

deb http://mirror.ufanet.ru/debian/ bookworm main non-free-firmware
deb http://mirror.ufanet.ru/debian/ bookworm-updates main non-free-firmware
deb http://mirror.ufanet.ru/debian/ bookworm-proposed-updates main non-free-firmware
deb http://mirror.ufanet.ru/debian-security/ bookworm-security main non-free-firmware

deb-src http://mirror.ufanet.ru/debian/ bookworm main non-free-firmware
deb-src http://mirror.ufanet.ru/debian/ bookworm-updates main non-free-firmware
deb-src http://mirror.ufanet.ru/debian/ bookworm-proposed-updates main non-free-firmware
deb-src http://mirror.ufanet.ru/debian-security/ bookworm-security main non-free-firmware

После настройки репозиториев полезно обновить список пакетов, доступных из них, и установить в систему обновлённые пакеты из репозиториев:

# apt-get update
# apt-get upgrade
# apt-get dist-upgrade

Установил пакеты с инструментами, которые понадобятся для пересборки пакета:

# apt-get install dpkg-dev devscripts fakeroot quilt

И установил зависимости пакета pgbouncer для его последующей сборки:

# apt-get build-dep bgbouncer

Сборка пакета

Затем скачал и распаковал исходные тексты пакета pgbouncer:

$ apt-get source pgbouncer

Скачал исправление по ссылке https://github.com/pgbouncer/pgbouncer/commit/74c50bf882df1854ccda345edd5e6e7b951aeb54.diff:

$ wget https://github.com/pgbouncer/pgbouncer/commit/74c50bf882df1854ccda345edd5e6e7b951aeb54.diff

Поскольку в исходниках пакета нет файла tests/test_timeouts.py, я удалил из исправления изменения этого файла с помощью текстового редактора:

$ vim 74c50bf882df1854ccda345edd5e6e7b951aeb54.diff

Перешёл в каталог с исходными текстами пакета:

$ cd pgbouncer-1.18.0/

Создал новую заплатку для пакета, назовём её fix-fatal:

$ quilt new fix-fatal

Добавил в заплатку отслеживание изменений в файле src/objects.c:

$ quilt add src/objects.c

Наложил исправления на файл objects.c:

$ patch objects.c < ../74c50bf882df1854ccda345edd5e6e7b951aeb54.diff

Сформировал заплатку, сравнив исходные и изменённые версии отслеживаемых в ней файлов:

$ quilt refresh

Опишем изменения пакета, сделанные в заплатке. Для этого выполним команду:

$ dch -i
dch warning: neither DEBEMAIL nor EMAIL environment variable is set
dch warning: building email address from username and FQDN
dch: Did you see those 2 warnings?  Press RETURN to continue...

В текстовом редакторе откроется журнал изменений пакета. Приведём последнее сообщение об изменениях в самом начале текста к следующему виду:

pgbouncer (1.18.0-1+deb12u1stupin) UNRELEASED; urgency=medium

  * Non-maintainer upload.
  * Fix: FATAL in function disconnect_client(): bad client state: 0

 -- Vladimir Stupin <vladimir@stupin.su>  Mon, 17 Aug 2026 12:36:10 +0500

Далее выходим из каталога с исходными текстами и запускаем сборку пакетов:

$ cd ..
$ dpkg-buildpackage -us -uc -rfakeroot

После выполнения команды в каталоге выше должны собраться пакеты:

$ cd ..
$ ls -l
итого 51628
-rw-r--r--  1 stupin stupin     1024 авг 17 12:34 74c50bf882df1854ccda345edd5e6e7b951aeb54.diff
drwxr-xr-x 12 stupin stupin     4096 авг 17 12:39 pgbouncer-1.18.0
-rw-r--r--  1 stupin stupin    14268 янв  1  2026 pgbouncer_1.18.0-1+deb12u1.debian.tar.xz
-rw-r--r--  1 stupin stupin     2261 янв  1  2026 pgbouncer_1.18.0-1+deb12u1.dsc
-rw-r--r--  1 stupin stupin     7866 авг 17 12:42 pgbouncer_1.18.0-1+deb12u1stupin_amd64.buildinfo
-rw-r--r--  1 stupin stupin     2181 авг 17 12:42 pgbouncer_1.18.0-1+deb12u1stupin_amd64.changes
-rw-r--r--  1 stupin stupin   208156 авг 17 12:42 pgbouncer_1.18.0-1+deb12u1stupin_amd64.deb
-rw-r--r--  1 stupin stupin    14756 авг 17 12:38 pgbouncer_1.18.0-1+deb12u1stupin.debian.tar.xz
-rw-r--r--  1 stupin stupin     1402 авг 17 12:38 pgbouncer_1.18.0-1+deb12u1stupin.dsc
-rw-r--r--  1 stupin stupin   600825 фев  3  2023 pgbouncer_1.18.0.orig.tar.gz
-rw-r--r--  1 stupin stupin   492632 авг 17 12:42 pgbouncer-dbgsym_1.18.0-1+deb12u1stupin_amd64.deb

Готовые пакеты

Собранные пакеты можно взять по ссылкам: