X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flogin%2Flogind-seat.c;h=96cf08e3b2f1b34fc6d2dc7d0ef2b44a85a94802;hb=2141e47892cadfd48ad0896ae66831e704ec068e;hp=631be5f7409830d87592f6b278ce3057911e1b6a;hpb=9bb69af4f2823fdd30902f5ffd959e9b041feb53;p=elogind.git diff --git a/src/login/logind-seat.c b/src/login/logind-seat.c index 631be5f74..96cf08e3b 100644 --- a/src/login/logind-seat.c +++ b/src/login/logind-seat.c @@ -459,6 +459,7 @@ int seat_stop_sessions(Seat *s, bool force) { } void seat_evict_position(Seat *s, Session *session) { + Session *iter; unsigned int pos = session->pos; session->pos = 0; @@ -466,8 +467,19 @@ void seat_evict_position(Seat *s, Session *session) { if (!pos) return; - if (pos < s->position_count && s->positions[pos] == session) + if (pos < s->position_count && s->positions[pos] == session) { s->positions[pos] = NULL; + + /* There might be another session claiming the same + * position (eg., during gdm->session transition), so lets look + * for it and set it on the free slot. */ + LIST_FOREACH(sessions_by_seat, iter, s->sessions) { + if (iter->pos == pos) { + s->positions[pos] = iter; + break; + } + } + } } void seat_claim_position(Seat *s, Session *session, unsigned int pos) { @@ -475,7 +487,7 @@ void seat_claim_position(Seat *s, Session *session, unsigned int pos) { if (seat_has_vts(s)) pos = session->vtnr; - if (!GREEDY_REALLOC0(s->positions, s->position_count, pos + 1)) + if (!GREEDY_REALLOC0_T(s->positions, s->position_count, pos + 1)) return; seat_evict_position(s, session);