pam_unix źle działa na Linuksie 2.6

Jakub Bogusz qboosh w pld.org.pl
Śro, 30 Lip 2003, 22:02:26 CEST


vlock mnie nie chciał wpuścić, okazało się, że pam_unix ma taką
właściwość, jeśli hasło jest sprawdzane z uid>0.

A konkretnie przed wywołaniem /sbin/unix_chkpwd jest taki kawałek:

#v+
    if (off(UNIX_NOREAP, ctrl)) {
        /*
         * This code arranges that the demise of the child does not cause
         * the application to receive a signal it is not expecting - which
         * may kill the application or worse.
         *
         * The "noreap" module argument is provided so that the admin can
         * override this behavior.
         */
        sighandler = signal(SIGCHLD, SIG_IGN);
    }
#v-

A potem jest pobierany kod powrotu przez waitpid(child, &retval, 0).

No i to działało na 2.2 i 2.4, nie działa na 2.6. Nie wiem, czy to
zamierzone, czy nie (SIGCHLD się ustawia na SIG_IGN żeby nie trzeba było
robić wait() - co jest zresztą nieprzenośne - ale z takim użyciem się
nie spotkałem w innych programach).
Na 2.6 vlock nie z roota działa dopiero po dodaniu "noreap" do
/etc/pam.d/vlock.

Prosty testcase:

#v+
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>

int main()
{ int child, retval, x;

  signal(SIGCHLD, SIG_IGN);
  if((child = fork()) == 0) {
    execl("/bin/ls", NULL);
  } else {
    x = waitpid(child, &retval, 0);
  }
  printf("retval=%d, pid=%d\n", retval, x);
  return 0;
}
#v-

Na 2.4 to zwraca na przykład:
retval=0, pid=3220

Na 2.6 pid=-1, a retval pozostaje jakimś śmieciem ze stosu.


Czy rozwiązanie użyte w pam_unix jest poprawne?
Tzn. co powinno być poprawione - pam czy jądro?


-- 
Jakub Bogusz    http://cyber.cs.net.pl/~qboosh/



Więcej informacji o liście dyskusyjnej pld-devel-pl