]> xenbits.xensource.com Git - xen.git/commit
x86/vlapic: Bugfixes and improvements to vlapic_{read,write}()
authorAndrew Cooper <andrew.cooper3@citrix.com>
Fri, 14 Sep 2018 11:27:17 +0000 (13:27 +0200)
committerJan Beulich <jbeulich@suse.com>
Fri, 14 Sep 2018 11:27:17 +0000 (13:27 +0200)
commit1f399b907f7a8f79a72abaa69e964a47b712f5c6
tree4dc6a545ba32276571dddead54cdc9f19ec2773d
parent5bb24b27924ba2b339cc79f57f224a4bf5c74313
x86/vlapic: Bugfixes and improvements to vlapic_{read,write}()

Firstly, there is no 'offset' boundary check on the non-32-bit write path
before the call to vlapic_read_aligned(), which allows an attacker to read
beyond the end of vlapic->regs->data[], which is only 1024 bytes long.

However, as the backing memory is a domheap page, and misaligned accesses get
chunked down to single bytes across page boundaries, I can't spot any
XSA-worthy problems which occur from the overrun.

On real hardware, bad accesses don't instantly crash the machine.  Their
behaviour is undefined, but the domain_crash() prohibits sensible testing.
Behave more like other x86 MMIO and terminate bad accesses with appropriate
defaults.

While making these changes, clean up and simplify the the smaller-access
handling.  In particular, avoid pointer based mechansims for 1/2-byte reads so
as to avoid forcing the value to be spilled to the stack.

  add/remove: 0/0 grow/shrink: 0/2 up/down: 0/-175 (-175)
  function                                     old     new   delta
  vlapic_read                                  211     142     -69
  vlapic_write                                 304     198    -106

Finally, there are a plethora of read/write functions in the vlapic namespace,
so rename these to vlapic_mmio_{read,write}() to make their purpose more
clear.

Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Roger Pau Monné <roger.pau@citrix.com>
master commit: b6f43c14cef3af8477a9eca4efab87dd150a2885
master date: 2018-08-10 13:27:24 +0100
xen/arch/x86/hvm/vlapic.c