forked from M-Labs/artiq
1
0
Fork 0

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

This commit is contained in:
whitequark 2018-11-12 15:39:55 +00:00 committed by Sebastien Bourdeauducq
parent ae88c1328b
commit dbd1cb9e04
3 changed files with 21 additions and 1 deletions

View File

@ -509,6 +509,19 @@ pub unsafe fn main() {
attribute_writeback(typeinfo as *const ()); attribute_writeback(typeinfo as *const ());
} }
// Make sure all async RPCs are processed before exiting.
// Otherwise, if the comms and kernel CPU run in the following sequence:
//
// comms kernel
// ----------------------- -----------------------
// check for async RPC
// post async RPC
// post RunFinished
// check for mailbox
//
// the async RPC would be missed.
send(&RpcFlush);
send(&RunFinished); send(&RunFinished);
loop {} loop {}

View File

@ -74,6 +74,7 @@ pub enum Message<'a> {
}, },
RpcRecvRequest(*mut ()), RpcRecvRequest(*mut ()),
RpcRecvReply(Result<usize, Exception<'a>>), RpcRecvReply(Result<usize, Exception<'a>>),
RpcFlush,
CacheGetRequest { key: &'a str }, CacheGetRequest { key: &'a str },
CacheGetReply { value: &'static [i32] }, CacheGetReply { value: &'static [i32] },

View File

@ -440,7 +440,13 @@ fn process_kern_message(io: &Io, mut stream: Option<&mut TcpStream>,
kern_acknowledge() kern_acknowledge()
} }
} }
} },
&kern::RpcFlush => {
// See ksupport/lib.rs for the reason this request exists.
// We do not need to do anything here because of how the main loop is
// structured.
kern_acknowledge()
},
&kern::CacheGetRequest { key } => { &kern::CacheGetRequest { key } => {
let value = session.congress.cache.get(key); let value = session.congress.cache.get(key);