core: make setup_pam() synchronous
authorDavid Herrmann <dh.herrmann@gmail.com>
Tue, 22 Sep 2015 22:51:20 +0000 (00:51 +0200)
committerDavid Herrmann <dh.herrmann@gmail.com>
Tue, 22 Sep 2015 22:51:20 +0000 (00:51 +0200)
commit2d7c6aa20cef0128e7a90c4da3d3519ed5c6b0f3
tree180deba3d9fa1352fb7b6a56ff8c677c7b23c88e
parent3c0fffb74ef7ea572182d9637847e950e9a3a922
core: make setup_pam() synchronous

If we spawn a unit with a non-empty 'PAMName=', we fork off a
child-process _inside_ the unit, known as '(sd-pam)', which watches the
session. It waits for the main-process to exit and then finishes it via
pam_close_session(3).

However, the '(sd-pam)' setup is highly asynchronous. There is no
guarantee that process gets spawned before we finish the unit setup.
Therefore, there might be a root-owned process inside of the cgroup of
the unit, thus causing cg_migrate() to error-out with EPERM.

This patch makes setup_pam() synchronous and waits for the '(sd-pam)'
setup to finish before continuing. This guarantees that setresuid(2) was
at least tried before we continue with the child setup of the real unit.
Note that if setresuid(2) fails, we already warn loudly about it. You
really must make sure that you own the passed user if using 'PAMName='.
It seems very plausible to rely on that assumption.
src/core/execute.c