summaryrefslogtreecommitdiff
path: root/src/libsystemd/sd-bus/bus-kernel.c
diff options
context:
space:
mode:
authorPhilip Withnall <philip.withnall@collabora.co.uk>2015-05-29 10:49:21 +0100
committerDavid Herrmann <dh.herrmann@gmail.com>2015-06-05 12:48:16 +0200
commit7ffeb45cc63e1326690fd9461b7a4719a3d4f85c (patch)
tree32263060cb593f64459dd1d8c0934abe6d1c7d4a /src/libsystemd/sd-bus/bus-kernel.c
parent3a3701f03360f9a292dcab31fda1f6e0e0629c64 (diff)
logind: Fix user_elect_display() to be more stable
The previous implementation of user_elect_display() could easily end up overwriting the user’s valid graphical session with a new TTY session. For example, consider the situation where there is one session: c1, type = SESSION_X11, !stopping, class = SESSION_USER it is initially elected as the user’s display (i.e. u->display = c1). If another session is started, on a different VT, the sessions_by_user list becomes: c1, type = SESSION_X11, !stopping, class = SESSION_USER c2, type = SESSION_TTY, !stopping, class = SESSION_USER In the previous code, graphical = c1 and text = c2, as expected. However, neither graphical nor text fulfil the conditions for setting u->display = graphical (because neither is better than u->display), so the code falls through to check the text variable. The conditions for this match, as u->display->type != SESSION_TTY (it’s actually SESSION_X11). Hence u->display is set to c2, which is incorrect, because session c1 is still valid. Refactor user_elect_display() to use a more explicit filter and pre-order comparison over the sessions. This can be demonstrated to be stable and only ever ‘upgrade’ the session to a more graphical one. https://bugs.freedesktop.org/show_bug.cgi?id=90769
Diffstat (limited to 'src/libsystemd/sd-bus/bus-kernel.c')
0 files changed, 0 insertions, 0 deletions