mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-01-09 17:38:00 +00:00
Fix trust status when Interactor returns a seat.
While testing the unrelated pile of commits just past, I accidentally started a Cygwin saved session I hadn't run in ages which used the old Telnet-based cygtermd as a local proxy command, and found that it presented the Cygwin prompt with a trust sigil. Oops! It turns out that this is because interactor_return_seat does two things that can change the real seat's trust status, and it does them in the wrong order: it defaults the status back to trusted (as if the seat was brand new, because that's how they start out), and it calls tempseat_flush which may have buffered a trust-status reset while the seat was borrowed. The former should not override the latter!
This commit is contained in:
parent
f23a84cf7c
commit
5d58931b51
@ -47,8 +47,18 @@ void interactor_return_seat(Interactor *itr)
|
|||||||
if (!is_tempseat(tempseat))
|
if (!is_tempseat(tempseat))
|
||||||
return; /* no-op */
|
return; /* no-op */
|
||||||
|
|
||||||
tempseat_flush(tempseat);
|
/*
|
||||||
|
* We're about to hand this seat back to the parent Interactor to
|
||||||
|
* do its own thing with. It will typically expect to start in the
|
||||||
|
* same state as if the seat had never been borrowed, i.e. in the
|
||||||
|
* starting trust state.
|
||||||
|
*
|
||||||
|
* However, this may be overridden by the tempseat_flush call.
|
||||||
|
*/
|
||||||
Seat *realseat = tempseat_get_real(tempseat);
|
Seat *realseat = tempseat_get_real(tempseat);
|
||||||
|
seat_set_trust_status(realseat, true);
|
||||||
|
|
||||||
|
tempseat_flush(tempseat);
|
||||||
interactor_set_seat(itr, realseat);
|
interactor_set_seat(itr, realseat);
|
||||||
tempseat_free(tempseat);
|
tempseat_free(tempseat);
|
||||||
|
|
||||||
@ -60,14 +70,6 @@ void interactor_return_seat(Interactor *itr)
|
|||||||
Interactor *itr_top = interactor_toplevel(itr, NULL);
|
Interactor *itr_top = interactor_toplevel(itr, NULL);
|
||||||
if (itr_top->last_to_talk)
|
if (itr_top->last_to_talk)
|
||||||
interactor_announce(itr);
|
interactor_announce(itr);
|
||||||
|
|
||||||
/*
|
|
||||||
* We're about to hand this seat back to the parent Interactor to
|
|
||||||
* do its own thing with. It will typically expect to start in the
|
|
||||||
* same state as if the seat had never been borrowed, i.e. in the
|
|
||||||
* starting trust state.
|
|
||||||
*/
|
|
||||||
seat_set_trust_status(realseat, true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
InteractionReadySeat interactor_announce(Interactor *itr)
|
InteractionReadySeat interactor_announce(Interactor *itr)
|
||||||
|
Loading…
Reference in New Issue
Block a user