Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
Please login to access the resource
SUSE:SLE-12-SP1:GA
xen.950
CVE-2015-5154-qemuu-check-array-bounds-before-w...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File CVE-2015-5154-qemuu-check-array-bounds-before-writing-to-io_buffer.patch of Package xen.950
From a9de14175548c04e0f8be7fae219246509ba46a9 Mon Sep 17 00:00:00 2001 From: Kevin Wolf <kwolf@redhat.com> Date: Wed, 3 Jun 2015 14:13:31 +0200 Subject: [PATCH 1/3] ide: Check array bounds before writing to io_buffer (CVE-2015-5154) If the end_transfer_func of a command is called because enough data has been read or written for the current PIO transfer, and it fails to correctly call the command completion functions, the DRQ bit in the status register and s->end_transfer_func may remain set. This allows the guest to access further bytes in s->io_buffer beyond s->data_end, and eventually overflowing the io_buffer. One case where this currently happens is emulation of the ATAPI command START STOP UNIT. This patch fixes the problem by adding explicit array bounds checks before accessing the buffer instead of relying on end_transfer_func to function correctly. Cc: qemu-stable@nongnu.org Signed-off-by: Kevin Wolf <kwolf@redhat.com> --- hw/ide/core.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) Index: xen-4.4.2-testing/tools/qemu-xen-dir-remote/hw/ide/core.c =================================================================== --- xen-4.4.2-testing.orig/tools/qemu-xen-dir-remote/hw/ide/core.c +++ xen-4.4.2-testing/tools/qemu-xen-dir-remote/hw/ide/core.c @@ -1900,6 +1900,10 @@ void ide_data_writew(void *opaque, uint3 } p = s->data_ptr; + if (p + 2 > s->data_end) { + return; + } + *(uint16_t *)p = le16_to_cpu(val); p += 2; s->data_ptr = p; @@ -1921,6 +1925,10 @@ uint32_t ide_data_readw(void *opaque, ui } p = s->data_ptr; + if (p + 2 > s->data_end) { + return 0; + } + ret = cpu_to_le16(*(uint16_t *)p); p += 2; s->data_ptr = p; @@ -1942,6 +1950,10 @@ void ide_data_writel(void *opaque, uint3 } p = s->data_ptr; + if (p + 4 > s->data_end) { + return; + } + *(uint32_t *)p = le32_to_cpu(val); p += 4; s->data_ptr = p; @@ -1963,6 +1975,10 @@ uint32_t ide_data_readl(void *opaque, ui } p = s->data_ptr; + if (p + 4 > s->data_end) { + return 0; + } + ret = cpu_to_le32(*(uint32_t *)p); p += 4; s->data_ptr = p;
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor