LINUX.ORG.RU

pkexec crashes with SIGTERM

 


0

1

При попытке запустить что угодно через pkexec процесс ловит SIGTERM (код возврата 143).

$ pkexec /usr/libexec/gsd-backlight-helper --set-brightness 448
zsh: terminated  pkexec /usr/libexec/gsd-backlight-helper --set-brightness 448

При этом с некоторой вероятностью (очень маленькой, 1 из 20 примерно) команда выполняется успешно.

ConsoleKit выпилен, заменён на systemd, но это не должно быть важно.

Установлен polkit 0.105.

Как исправить?

Проблему обнаружил, когда gnome-settings-daemon криво регулировал яркость при нажатии соответствующих клавиш клавиатуры.

А какой-нибудь selinux случаем не гасит их?
Это первое что пришло в голову, могу ошибаться.

tazhate ★★★★★
()
Ответ на: комментарий от tazhate

А какой-нибудь selinux случаем не гасит их?

selinux, apparmor, grsecurity и т.п. не установлены, Гента не hardened, SSP нет. В логе такое:

May 29 16:56:11 idea pkexec[32629]: pam_unix(polkit-1:session): session opened for user root by (uid=1000)
May 29 16:56:11 idea pkexec[32629]: max: Executing command [USER=root] [TTY=unknown] [CWD=/home/max] [COMMAND=/usr/libexec/gsd-backlight-helper --set-brightness 496]

Архитектура x86_64. При этом рядом стоит комп x86_32 с polkit-0.104, на котором всё работает. Откатить polkit до 0.104 я не могу, поскольку надо будет устанавливать ConsoleKit; попробую ещё пообновлять работающий компьютер и посмотреть, не сломается ли там (но там много собирать надо, он не обновлялся уже около месяца).

gentoo_root ★★★★★
() автор топика

Попробовал позапускать через pkexec другие процессы — обнаружил некоторую закономерность. Похоже, что если недолгоживущий процесс успевает выполниться (без переключений на другие процессы?), то ему не успевает прийти SIGTERM, иначе его прибивают. Таким образом, env с большей вероятностью успешно выполняется, а sleep 10 будет прерван всегда. Хотелось бы знать, кто посылает SIGTERM и как это предотвратить. Выпиливание из исходников этих строк не помогло:

  if (prctl (PR_SET_PDEATHSIG, SIGTERM) != 0)
    {
      g_printerr ("prctl(PR_SET_PDEATHSIG, SIGTERM) failed: %s\n", g_strerror (errno));
      goto out;
    }

С /bin/ps вообще происходят необъяснимые вещи: он может зависнуть либо выпасть так:

Signal 1 (HUP) caught by ps (procps-ng version UNKNOWN).
/bin/ps:display.c:59: please report this bug

Успешно запустить ps пока не удалось ни разу.

gentoo_root ★★★★★
() автор топика
#include <signal.h>
#include <stdio.h>
#include <unistd.h>

void handler(int signum, siginfo_t *info, void *context);

int main()
{
        struct sigaction action;
        action.sa_sigaction = handler;
        sigemptyset(&action.sa_mask);
        action.sa_flags = SA_SIGINFO;

        sigaction(SIGTERM, &action, NULL);
        sigaction(SIGHUP, &action, NULL);
        for (;;) {
                pause();
        }

        return 0;
}

void handler(int signum, siginfo_t *info, void *context)
{
        printf("SIGNAL: %d; PID: %d\n", signum, info->si_pid);
        fflush(stdout);
}

С помощью простого кода получилось узнать, что сразу после запуска программы через pkexec ей приходит от systemd-logind по очереди 2 сигнала: SIGTERM и SIGHUP, после чего программа продолжает выполняться, если она героически отбила эти сигналы. Похоже, что происходит это из-за того, что не открывается сессия в systemd-logind, а я накосячил с настройкой PAM.

gentoo_root ★★★★★
() автор топика

Решил, убрав 'session optional pam_systemd.so' из /etc/pam.d/system-auth, добавив это в /etc/pam.d/system-login и заменив 'session include system-auth' на 'session include system-login' в /etc/pam.d/gdm*.

// Как-то фигово настроен PAM в Генте, в убунте, кажется, получше.

gentoo_root ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.