forked from M-Labs/artiq
firmware: fix another TOCTTOU race in sync/async RPC code.
This commit is contained in:
parent
ae88c1328b
commit
dbd1cb9e04
|
@ -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 {}
|
||||||
|
|
|
@ -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] },
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue