evtchn/FIFO: add 2nd smp_rmb() to evtchn_fifo_word_from_port()

Besides with add_page_to_event_array() the function also needs to
synchronize with evtchn_fifo_init_control() setting both d->evtchn_fifo
and (subsequently) d->evtchn_port_ops.

This is XSA-359 / CVE-2020-29571.

Reported-by: Julien Grall <jgrall@amazon.com>
Signed-off-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Julien Grall <jgrall@amazon.com>
master commit: dc8b01affd
master date: 2020-12-15 13:42:51 +0100
This commit is contained in:
Jan Beulich committed 2020-12-15 14:47:28 +01:00
1 parent 136ac884e6
commit 6ea37c69c7
1 file changed
+11
+11
View File
@@ -34,6 +34,13 @@ static inline event_word_t *evtchn_fifo_word_from_port(const struct domain *d,
{ {
unsigned int p, w; unsigned int p, w;
/*
* Callers aren't required to hold d->event_lock, so we need to synchronize
* with evtchn_fifo_init_control() setting d->evtchn_port_ops /after/
* d->evtchn_fifo.
*/
smp_rmb();
if ( unlikely(port >= d->evtchn_fifo->num_evtchns) ) if ( unlikely(port >= d->evtchn_fifo->num_evtchns) )
return NULL; return NULL;
@@ -590,6 +597,10 @@ int evtchn_fifo_init_control(struct evtchn_init_control *init_control)
if ( rc < 0 ) if ( rc < 0 )
goto error; goto error;
/*
* This call, as a side effect, synchronizes with
* evtchn_fifo_word_from_port().
*/
rc = map_control_block(v, gfn, offset); rc = map_control_block(v, gfn, offset);
if ( rc < 0 ) if ( rc < 0 )
goto error; goto error;
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.