Unexpected gdbus behaviour during PAM authentication

Bastien Nocera hadess at hadess.net
Fri Jan 13 15:47:21 UTC 2017


On Fri, 2017-01-13 at 14:37 +0000, David Llewellyn-Jones wrote:
> Hi all,
> 
> I've been experiencing strange behaviour connecting to the system bus
> from a pam module. This is on Ubuntu 16.04 using gdbus and gdbus-
> codegen
> for both the caller and listening service.
> 
> Using a simple test application for thee caller everything works
> fine.
> Here's the minimal code for the test app and service:
> https://github.com/llewelld/dbus-pam-test/blob/master/src/test.c
> https://github.com/llewelld/dbus-pam-test/blob/master/src/service.c
> 
> However, when I move the same code from the test program to a pam
> module
> I then get the unexpected behaviour. The pam module is executed by
> pressing Win-L to trigger the Unity lock screen.
> 
> The first time the pam module is run, it calls
> *_proxy_new_for_bus_sync
> to return a proxy and then calls the service and everything works
> fine.
> The second time it's run the same *_proxy_new_for_bus_sync function
> returns a NULL proxy, but apparently without returning any error. The
> third time it's run the *_proxy_new_for_bus_sync function hangs and
> never returns.
> 
> Here's the code for the pam module:
> https://github.com/llewelld/dbus-pam-test/blob/master/src/pam_test.c
> 
> This behaviour happens when I use the pam module with the unity lock
> screen, but if I use pamtester instead, everything works fine every
> time.
> 
> And in case it's helpful, the output to syslog from running the
> service
> and pam module can be seen here:
> https://github.com/llewelld/dbus-pam-test/blob/master/log-output.log
> 
> Does anyone have any suggestion for why this might be happening?

GDBus's threads and PAM really don't mix. You'll need to either use
something like dbus-glib, which is single-threaded and sync, move your
D-Bus code to a small helper you'd talk to over Unix sockets (yeah, I
know...), or wait until PAM dies.

FWIW, this problem is one of the reasons why fprintd (and pam_fprintd)
is written using dbus-glib rather than GDBus.

Cheers


More information about the dbus mailing list