Package: libpam-mount
Version: 0.44-1+lenny3
Severity: important
Tags: patch


Per cron bug 484122 some (all?) users who are mounting their encrypted home 
directory with libpam-mount have been seeing a constant stream of segfaults 
in cron. Cron has been rendered useless in this environment.

strace and ltrace did not yield any interesting results so I have used gdb 
to localize the problem and propose a solution.

This patch seems to fix the problem for me:

----------------

diff --git a/src/pam_mount.c b/src/pam_mount.c
index 211a996..b86cd05 100644
--- a/src/pam_mount.c
+++ b/src/pam_mount.c
@@ -156,7 +156,7 @@ static int converse(pam_handle_t *pamh, int nargs,
        retval = pam_get_item(pamh, PAM_CONV, static_cast(const void **,
                 static_cast(void *, &conv)));
 
-       if (retval == PAM_SUCCESS) {
+       if (retval == PAM_SUCCESS && *resp != NULL) {
                retval = conv->conv(nargs, message, resp, 
conv->appdata_ptr);
                if (retval != PAM_SUCCESS)
                        l0g("conv->conv(...): %s\n", pam_strerror(pamh, 
retval));

----------------

There is another call to pam_get_item on line 270 of the same file which was 
suggestive of the necessary fix. Not understanding the software fully, I 
made the above minimal change, and it seems to be sufficient, though I 
continue to run with it and test.

This is my first patch submission to Debian, and I am treading in software 
that I do not really understand, so following is a verbose transcript of my 
gdb session:

(gdb) attach 3489
Attaching to process 3489
Reading symbols from /usr/sbin/cron...done.
Reading symbols from /lib/libpam.so.0...done.
Loaded symbols for /lib/libpam.so.0
Reading symbols from /lib/libselinux.so.1...done.
Loaded symbols for /lib/libselinux.so.1
Reading symbols from /lib/i686/cmov/libc.so.6...done.
Loaded symbols for /lib/i686/cmov/libc.so.6
Reading symbols from /lib/i686/cmov/libdl.so.2...done.
Loaded symbols for /lib/i686/cmov/libdl.so.2
Reading symbols from /lib/ld-linux.so.2...done.
Loaded symbols for /lib/ld-linux.so.2
Reading symbols from /lib/i686/cmov/libnss_compat.so.2...done.
Loaded symbols for /lib/i686/cmov/libnss_compat.so.2
Reading symbols from /lib/i686/cmov/libnsl.so.1...done.
Loaded symbols for /lib/i686/cmov/libnsl.so.1
Reading symbols from /lib/i686/cmov/libnss_nis.so.2...done.
Loaded symbols for /lib/i686/cmov/libnss_nis.so.2
Reading symbols from /lib/i686/cmov/libnss_files.so.2...done.
Loaded symbols for /lib/i686/cmov/libnss_files.so.2
0xb7f5e424 in __kernel_vsyscall ()
(gdb) set follow-fork-mode child
(gdb) cont
Continuing.

Program received signal SIGSEGV, Segmentation fault.
[Switching to process 19892]
0x00000000 in ?? ()
(gdb) 

(gdb) info frame 0
Stack frame at 0xbfba1aa0:
 eip = 0x0; saved eip 0xb7b4cda1
 called by frame at 0xbfba1af0
 Arglist at 0xbfba1a98, args: 
 Locals at 0xbfba1a98, Previous frame's sp is 0xbfba1aa0
 Saved registers:
  eip at 0xbfba1a9c

(gdb) up
#1  0xb7b4cda1 in read_password (pamh=0x8841b00, 
    prompt=0x8846278 "reenter password for pam_mount:", pass=0xbfba1b38)
    at pam_mount.c:160
160                     retval = conv->conv(nargs, message, resp, 
conv->appdata_ptr);

(gdb) up
#2  0xb7b4ddf3 in pam_sm_open_session (pamh=0x8841b00, flags=32768, argc=1, 
    argv=0x8843ce0) at pam_mount.c:511
511                     ret = read_password(pamh, Config.msg_sessionpw, 
&system_authtok);

(gdb) up
#3  0xb7f693c1 in _pam_dispatch (pamh=0x8841b00, flags=32768, choice=4)
    at pam_dispatch.c:108
108                 retval = h->func(pamh, flags, h->argc, h->argv);

(gdb) up
#4  0xb7f6cfeb in pam_open_session (pamh=0x8841be8, flags=32768)
    at pam_session.c:23
23          retval = _pam_dispatch(pamh, flags, PAM_OPEN_SESSION);

(gdb) up
#5  0x0804e848 in child_process (e=0x88418f8, u=0x88418d8) at 
.../do_command.c:228
228             retcode = pam_open_session(pamh, PAM_SILENT);

(gdb) up
#6  0x0804e36d in do_command (e=0x88418f8, u=0x88418d8) at 
.../do_command.c:102
102                     child_process(e, u);

(gdb) up
#7  0x0804e1e3 in job_runqueue () at ../job.c:68
68                      do_command(j->e, j->u);

(gdb) up
#8  0x0804a777 in main (argc=142875624, argv=0x0) at ../cron.c:270
270                     job_runqueue();

(gdb) up
Initial frame selected; you cannot go up.

(gdb) frame 0
#0  0x00000000 in ?? ()

(gdb) up
#1  0xb7b4cda1 in read_password (pamh=0x8841b00, 
    prompt=0x8846278 "reenter password for pam_mount:", pass=0xbfba1b38)
    at pam_mount.c:160
160                     retval = conv->conv(nargs, message, resp, 
conv->appdata_ptr);

(gdb) list
155             *resp = NULL;
156             retval = pam_get_item(pamh, PAM_CONV, static_cast(const void 
**,
157                      static_cast(void *, &conv)));
158
159             if (retval == PAM_SUCCESS) {
160                     retval = conv->conv(nargs, message, resp, 
conv->appdata_ptr);
161                     if (retval != PAM_SUCCESS)
162                             l0g("conv->conv(...): %s\n", 
pam_strerror(pamh, retval));
163             } else {
164                     l0g("pam_get_item: %s\n", pam_strerror(pamh, 
retval));
(gdb) 

(gdb) print *resp
Cannot access memory at address 0x0

(gdb) print resp
$3 = (struct pam_response *) 0x0
(gdb) 

-- System Information:
Debian Release: 5.0
  APT prefers testing
  APT policy: (500, 'testing')
Architecture: i386 (i686)

Kernel: Linux 2.6.26-1-686 (SMP w/1 CPU core)
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/bash

Versions of packages libpam-mount depends on:
ii  debconf                    1.5.24        Debian configuration management sy
ii  libc6                      2.7-16        GNU C Library: Shared libraries
ii  libhx13                    1.18-1        A library providing queue, tree, I
ii  libpam0g                   1.0.1-4       Pluggable Authentication Modules l
ii  libssl0.9.8                0.9.8g-14     SSL shared libraries
ii  libxml-writer-perl         0.604-1       Perl module for writing XML docume
ii  libxml2                    2.6.32.dfsg-5 GNOME XML library
ii  mount                      2.13.1.1-1    Tools for mounting and manipulatin

libpam-mount recommends no packages.

Versions of packages libpam-mount suggests:
ii  cryptsetup                 2:1.0.6-7     configures encrypted block devices
pn  davfs2                     <none>        (no description available)
ii  fuse-utils                 2.7.4-1.1     Filesystem in USErspace (utilities
ii  lsof                       4.78.dfsg.1-4 List open files
pn  ncpfs                      <none>        (no description available)
ii  openssl                    0.9.8g-14     Secure Socket Layer (SSL) binary a
ii  psmisc                     22.6-1        Utilities that use the proc filesy
pn  smbfs                      <none>        (no description available)
pn  truecrypt-utils            <none>        (no description available)

-- debconf information:
* libpam-mount/convert-xml-config: true
diff --git a/src/pam_mount.c b/src/pam_mount.c
index 211a996..b86cd05 100644
--- a/src/pam_mount.c
+++ b/src/pam_mount.c
@@ -156,7 +156,7 @@ static int converse(pam_handle_t *pamh, int nargs,
 	retval = pam_get_item(pamh, PAM_CONV, static_cast(const void **,
 	         static_cast(void *, &conv)));
 
-	if (retval == PAM_SUCCESS) {
+	if (retval == PAM_SUCCESS && *resp != NULL) {
 		retval = conv->conv(nargs, message, resp, conv->appdata_ptr);
 		if (retval != PAM_SUCCESS)
 			l0g("conv->conv(...): %s\n", pam_strerror(pamh, retval));

Reply via email to