# HG changeset patch # User Paul Boddie # Date 1617660840 -7200 # Node ID 866eb2a8fc8bb82cd9ad9552c9a6c30417c67174 # Parent 13e188dd5a9362939f10a348716c64f902c0b400 Employ map request flags instead of the maximal flags when sending flexpages. Otherwise, mappings may be established with inappropriate permissions. diff -r 13e188dd5a93 -r 866eb2a8fc8b generic/pager.cc --- a/generic/pager.cc Sun Apr 04 01:19:22 2021 +0200 +++ b/generic/pager.cc Tue Apr 06 00:14:00 2021 +0200 @@ -4,6 +4,9 @@ +/* Initialise the pager with a page mapper and the given flags controlling + access to a file. */ + Pager::Pager(PageMapper *mapper, flags_t flags) : _start(0), _size(0), _mapper(mapper), _flags(flags) { @@ -66,7 +69,8 @@ /* Issue the flexpage via the IPC system. */ - long err = ipc_prepare_flexpage(flexpage, file_offset, max_offset, hot_spot, region); + long err = ipc_prepare_flexpage(flexpage, file_offset, max_offset, hot_spot, + flags, region); if (!err) err = complete_Dataspace_map(*region); diff -r 13e188dd5a93 -r 866eb2a8fc8b generic/simple_pager.cc --- a/generic/simple_pager.cc Sun Apr 04 01:19:22 2021 +0200 +++ b/generic/simple_pager.cc Tue Apr 06 00:14:00 2021 +0200 @@ -38,7 +38,8 @@ /* Send the flexpage explicitly. */ - long err = ipc_prepare_flexpage(&flexpage, offset, _region->size(), hot_spot, region); + long err = ipc_prepare_flexpage(&flexpage, offset, _region->size(), + hot_spot, flags, region); if (err) return err; diff -r 13e188dd5a93 -r 866eb2a8fc8b mapping/flexpage.cc --- a/mapping/flexpage.cc Sun Apr 04 01:19:22 2021 +0200 +++ b/mapping/flexpage.cc Tue Apr 06 00:14:00 2021 +0200 @@ -73,6 +73,10 @@ return (base_offset <= position) && (position < (base_offset + size)); } +/* Upgrade the flags involved with this flexpage. This is used to track the + maximal flags employed by the different pagers, with the result being used in + unmap operations. */ + void Flexpage::upgrade(flags_t flags) { if (flags && (flags != _flags)) @@ -82,7 +86,8 @@ /* Return a "send" flexpage for an access to 'offset' by positioning it relative to 'hot_spot' for the receive flexpage window. */ -SendFlexpage Flexpage::to_send(offset_t offset, offset_t hot_spot, offset_t max_offset) +SendFlexpage Flexpage::to_send(offset_t offset, offset_t hot_spot, + flags_t flags, offset_t max_offset) { /* The dataspace offset of the flexpage base is a multiple of the flexpage size. */ @@ -108,7 +113,7 @@ receive_size = size; if (!receive_size) - return SendFlexpage(base_addr, page_order(0), _flags); + return SendFlexpage(base_addr, page_order(0), flags); offset_t receive_page_offset = hot_spot % receive_size; @@ -124,7 +129,7 @@ offset_t adjustment = page_offset - receive_page_offset; - return SendFlexpage(base_addr + adjustment, page_order(receive_size), _flags); + return SendFlexpage(base_addr + adjustment, page_order(receive_size), flags); } /* Return a representation of the flexpage for unmapping. */ diff -r 13e188dd5a93 -r 866eb2a8fc8b mapping/flexpage.h --- a/mapping/flexpage.h Sun Apr 04 01:19:22 2021 +0200 +++ b/mapping/flexpage.h Tue Apr 06 00:14:00 2021 +0200 @@ -46,7 +46,8 @@ void upgrade(flags_t flags); - SendFlexpage to_send(offset_t offset, offset_t hot_spot, offset_t max_offset=0); + SendFlexpage to_send(offset_t offset, offset_t hot_spot, flags_t flags, + offset_t max_offset=0); SendFlexpage to_unmap(); }; diff -r 13e188dd5a93 -r 866eb2a8fc8b mapping/ipc.cc --- a/mapping/ipc.cc Sun Apr 04 01:19:22 2021 +0200 +++ b/mapping/ipc.cc Tue Apr 06 00:14:00 2021 +0200 @@ -19,9 +19,10 @@ long ipc_prepare_flexpage(Flexpage *flexpage, unsigned long offset, unsigned long max_offset, l4_addr_t hot_spot, - l4_snd_fpage_t *region) + flags_t flags, l4_snd_fpage_t *region) { - SendFlexpage send_flexpage = flexpage->to_send(offset, hot_spot, max_offset); + SendFlexpage send_flexpage = flexpage->to_send(offset, hot_spot, flags, + max_offset); /* NOTE: Consider l4_fpage_invalid() as the fpage here. */ diff -r 13e188dd5a93 -r 866eb2a8fc8b mapping/ipc.h --- a/mapping/ipc.h Sun Apr 04 01:19:22 2021 +0200 +++ b/mapping/ipc.h Tue Apr 06 00:14:00 2021 +0200 @@ -8,7 +8,7 @@ long ipc_prepare_flexpage(Flexpage *flexpage, unsigned long offset, unsigned long max_offset, l4_addr_t hot_spot, - l4_snd_fpage_t *region); + flags_t flags, l4_snd_fpage_t *region); void ipc_unmap_flexpage(Flexpage *flexpage);