Bug 40519

Summary: syskeeper RPM::Pre-Install-Pkgs hook fails on massive APT updates
Product: Sisyphus Reporter: Nikolay A. Fetisov <naf>
Component: syskeeperAssignee: Nikolay A. Fetisov <naf>
Status: CLOSED FIXED QA Contact: qa-sisyphus
Severity: major    
Priority: P5 CC: naf
Version: unstable   
Hardware: all   
OS: Linux   
Attachments:
Description Flags
Fix syskeeper hook to avoid SIGPIPE on STDIN buffer overflow none

Description Nikolay A. Fetisov 2021-07-17 12:21:33 MSK
Created attachment 9520 [details]
Fix syskeeper hook to avoid SIGPIPE on STDIN buffer overflow

Для syskeeper-0.11-alt1 для крупных обновлений системы (где-то от 700 пакетов), в ходе 
работы syskeeper в обработчике RPM::Pre-Install-Pkgs возникает ошибка, блокирующая работу APT:

# apt-get dist-upgrade
....
1179 будет обновлено, 1 новых установлено, 3 пакетов будет заменено, 2 пакетов будет удалено и 4 не будет обновлено.
Необходимо получить 0B/1058MB архивов.
После распаковки потребуется дополнительно 26,6MB дискового пространства.
Продолжить? [Y/n]   Y
E: Ошибка записи - write (32 Обрыв канала)
E: Ошибка выполнения скрипта if [ -x /usr/sbin/syskeeper ]; then /usr/sbin/syskeeper; fi
#


Согласно apt.conf(5), для RPM::Pre-Install-Pkgs APT передаёт в обработчик список файлов
устанавливаемых пакетов, в виде полных путей в /var/cache/apt/archives, построчно, через
запись в STDIN. Текущие версии APT в имена файлов добавляют DistTag - итог получается
достаточно длинный, порядка 80-100 байт на имя устанавливаемого пакета.

При вызове RPM::Pre-Install-Pkgs запускается /usr/sbin/syskeeper, далее APT начинает
передавать в STDIN список пакетов. syskeeper STDIN не читает, размер буфера канала,
насколько понимаю, 64k. Если список достаточно большой - буфер выбирается, и syskeeper
завершается по SIGPIPE.
Т.к. вызов RPM::Pre-Install-Pkgs при этом выдаёт ошибку - APT аварийно завершает
dist-upgrade до начала собственно обновления пакетов.

Лимит сейчас получается порядка 600-700 пакетов. Более крупные обновления невозможны.

Как вариант решения - можно пойти путём аналогичным etckeeper, запускать syskeeper
в subshell:
"xargs| (if [ -x /usr/sbin/syskeeper ]; then /usr/sbin/syskeeper; fi)";

Хотя в этом случае xargs также завершится с ошибкой, вида
xargs: echo: terminated by signal 13
, но syskeeper нормально отработает, RPM::Pre-Install-Pkgs завершится успешно,
и APT пойдёт дальше обновлять систему.


И, проблема сейчас затрагивает и M90P, и M80P. И обновления их до Sisyphus.
Comment 1 Repository Robot 2023-08-11 16:23:01 MSK
syskeeper-0.11-alt2 -> sisyphus:

 Fri Aug 11 2023 Nikolay A. Fetisov <naf@altlinux> 0.11-alt2
 - fix SIGPIPE in the RPM::Pre-Install-Pkgs hook (Closes: 40519)