firmware: fix TOCTTOU race in sync/async RPC code.

Before this commit, the main loop in session code was laid like:

  1. process_kern_queued_rpc
  2. process_host_message
  3. process_kern_message

If a host message (such as an RPC reply) caused the kernel to exit,
then any async RPCs would not complete, since RunFinished immediately
shuts down the kernel.

Fix this by reordering 1 and 2.
This commit is contained in:
whitequark 2018-11-12 15:28:27 +00:00 committed by Sebastien Bourdeauducq
parent ad07274a1b
commit ae88c1328b
1 changed files with 4 additions and 4 deletions

View File

@ -519,16 +519,16 @@ fn host_kernel_worker(io: &Io,
let mut session = Session::new(congress); let mut session = Session::new(congress);
loop { loop {
while !rpc_queue::empty() {
process_kern_queued_rpc(stream, &mut session)?
}
if stream.can_recv() { if stream.can_recv() {
process_host_message(io, stream, &mut session)? process_host_message(io, stream, &mut session)?
} else if !stream.may_recv() { } else if !stream.may_recv() {
return Ok(()) return Ok(())
} }
while !rpc_queue::empty() {
process_kern_queued_rpc(stream, &mut session)?
}
if mailbox::receive() != 0 { if mailbox::receive() != 0 {
process_kern_message(io, Some(stream), &mut session)?; process_kern_message(io, Some(stream), &mut session)?;
} }