Сборка пакета 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
Готовые пакеты
Собранные пакеты можно взять по ссылкам:
- pgbouncer 1.18.0-1+deb12u1.debian.tar.xz
- pgbouncer 1.18.0-1+deb12u1.dsc
- pgbouncer 1.18.0-1+deb12u1stupin amd64.buildinfo
- pgbouncer 1.18.0-1+deb12u1stupin amd64.changes
- pgbouncer 1.18.0-1+deb12u1stupin amd64.deb
- pgbouncer 1.18.0-1+deb12u1stupin.debian.tar.xz
- pgbouncer 1.18.0-1+deb12u1stupin.dsc
- pgbouncer 1.18.0.orig.tar.gz
- pgbouncer-dbgsym 1.18.0-1+deb12u1stupin amd64.deb