forked from gentoo/gentoo
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
app-emulation/qemu: add upstream fixes for #567868 #568246 #570110 #5…
…70988 #571566
- Loading branch information
Showing
6 changed files
with
942 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,50 @@ | ||
https://bugs.gentoo.org/568246 | ||
|
||
From 156a2e4dbffa85997636a7a39ef12da6f1b40254 Mon Sep 17 00:00:00 2001 | ||
From: Gerd Hoffmann <[email protected]> | ||
Date: Mon, 14 Dec 2015 09:21:23 +0100 | ||
Subject: [PATCH] ehci: make idt processing more robust | ||
|
||
Make ehci_process_itd return an error in case we didn't do any actual | ||
iso transfer because we've found no active transaction. That'll avoid | ||
ehci happily run in circles forever if the guest builds a loop out of | ||
idts. | ||
|
||
This is CVE-2015-8558. | ||
|
||
Cc: [email protected] | ||
Reported-by: Qinghao Tang <[email protected]> | ||
Tested-by: P J P <[email protected]> | ||
Signed-off-by: Gerd Hoffmann <[email protected]> | ||
--- | ||
hw/usb/hcd-ehci.c | 5 +++-- | ||
1 file changed, 3 insertions(+), 2 deletions(-) | ||
|
||
diff --git a/hw/usb/hcd-ehci.c b/hw/usb/hcd-ehci.c | ||
index 4e2161b..d07f228 100644 | ||
--- a/hw/usb/hcd-ehci.c | ||
+++ b/hw/usb/hcd-ehci.c | ||
@@ -1389,7 +1389,7 @@ static int ehci_process_itd(EHCIState *ehci, | ||
{ | ||
USBDevice *dev; | ||
USBEndpoint *ep; | ||
- uint32_t i, len, pid, dir, devaddr, endp; | ||
+ uint32_t i, len, pid, dir, devaddr, endp, xfers = 0; | ||
uint32_t pg, off, ptr1, ptr2, max, mult; | ||
|
||
ehci->periodic_sched_active = PERIODIC_ACTIVE; | ||
@@ -1479,9 +1479,10 @@ static int ehci_process_itd(EHCIState *ehci, | ||
ehci_raise_irq(ehci, USBSTS_INT); | ||
} | ||
itd->transact[i] &= ~ITD_XACT_ACTIVE; | ||
+ xfers++; | ||
} | ||
} | ||
- return 0; | ||
+ return xfers ? 0 : -1; | ||
} | ||
|
||
|
||
-- | ||
2.6.2 | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,95 @@ | ||
https://bugs.gentoo.org/567868 | ||
|
||
From aa4a3dce1c88ed51b616806b8214b7c8428b7470 Mon Sep 17 00:00:00 2001 | ||
From: P J P <[email protected]> | ||
Date: Tue, 15 Dec 2015 12:27:54 +0530 | ||
Subject: [PATCH] net: vmxnet3: avoid memory leakage in activate_device | ||
|
||
Vmxnet3 device emulator does not check if the device is active | ||
before activating it, also it did not free the transmit & receive | ||
buffers while deactivating the device, thus resulting in memory | ||
leakage on the host. This patch fixes both these issues to avoid | ||
host memory leakage. | ||
|
||
Reported-by: Qinghao Tang <[email protected]> | ||
Reviewed-by: Dmitry Fleytman <[email protected]> | ||
Signed-off-by: Prasad J Pandit <[email protected]> | ||
Cc: [email protected] | ||
Signed-off-by: Jason Wang <[email protected]> | ||
--- | ||
hw/net/vmxnet3.c | 24 ++++++++++++++++-------- | ||
1 file changed, 16 insertions(+), 8 deletions(-) | ||
|
||
diff --git a/hw/net/vmxnet3.c b/hw/net/vmxnet3.c | ||
index a5dd79a..9c1adfc 100644 | ||
--- a/hw/net/vmxnet3.c | ||
+++ b/hw/net/vmxnet3.c | ||
@@ -1194,8 +1194,13 @@ static void vmxnet3_reset_mac(VMXNET3State *s) | ||
|
||
static void vmxnet3_deactivate_device(VMXNET3State *s) | ||
{ | ||
- VMW_CBPRN("Deactivating vmxnet3..."); | ||
- s->device_active = false; | ||
+ if (s->device_active) { | ||
+ VMW_CBPRN("Deactivating vmxnet3..."); | ||
+ vmxnet_tx_pkt_reset(s->tx_pkt); | ||
+ vmxnet_tx_pkt_uninit(s->tx_pkt); | ||
+ vmxnet_rx_pkt_uninit(s->rx_pkt); | ||
+ s->device_active = false; | ||
+ } | ||
} | ||
|
||
static void vmxnet3_reset(VMXNET3State *s) | ||
@@ -1204,7 +1209,6 @@ static void vmxnet3_reset(VMXNET3State *s) | ||
|
||
vmxnet3_deactivate_device(s); | ||
vmxnet3_reset_interrupt_states(s); | ||
- vmxnet_tx_pkt_reset(s->tx_pkt); | ||
s->drv_shmem = 0; | ||
s->tx_sop = true; | ||
s->skip_current_tx_pkt = false; | ||
@@ -1431,6 +1435,12 @@ static void vmxnet3_activate_device(VMXNET3State *s) | ||
return; | ||
} | ||
|
||
+ /* Verify if device is active */ | ||
+ if (s->device_active) { | ||
+ VMW_CFPRN("Vmxnet3 device is active"); | ||
+ return; | ||
+ } | ||
+ | ||
vmxnet3_adjust_by_guest_type(s); | ||
vmxnet3_update_features(s); | ||
vmxnet3_update_pm_state(s); | ||
@@ -1627,7 +1637,7 @@ static void vmxnet3_handle_command(VMXNET3State *s, uint64_t cmd) | ||
break; | ||
|
||
case VMXNET3_CMD_QUIESCE_DEV: | ||
- VMW_CBPRN("Set: VMXNET3_CMD_QUIESCE_DEV - pause the device"); | ||
+ VMW_CBPRN("Set: VMXNET3_CMD_QUIESCE_DEV - deactivate the device"); | ||
vmxnet3_deactivate_device(s); | ||
break; | ||
|
||
@@ -1741,7 +1751,7 @@ vmxnet3_io_bar1_write(void *opaque, | ||
* shared address only after we get the high part | ||
*/ | ||
if (val == 0) { | ||
- s->device_active = false; | ||
+ vmxnet3_deactivate_device(s); | ||
} | ||
s->temp_shared_guest_driver_memory = val; | ||
s->drv_shmem = 0; | ||
@@ -2021,9 +2031,7 @@ static bool vmxnet3_peer_has_vnet_hdr(VMXNET3State *s) | ||
static void vmxnet3_net_uninit(VMXNET3State *s) | ||
{ | ||
g_free(s->mcast_list); | ||
- vmxnet_tx_pkt_reset(s->tx_pkt); | ||
- vmxnet_tx_pkt_uninit(s->tx_pkt); | ||
- vmxnet_rx_pkt_uninit(s->rx_pkt); | ||
+ vmxnet3_deactivate_device(s); | ||
qemu_del_nic(s->nic); | ||
} | ||
|
||
-- | ||
2.6.2 | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
https://bugs.gentoo.org/570110 | ||
|
||
From 007cd223de527b5f41278f2d886c1a4beb3e67aa Mon Sep 17 00:00:00 2001 | ||
From: Prasad J Pandit <[email protected]> | ||
Date: Mon, 28 Dec 2015 16:24:08 +0530 | ||
Subject: [PATCH] net: rocker: fix an incorrect array bounds check | ||
|
||
While processing transmit(tx) descriptors in 'tx_consume' routine | ||
the switch emulator suffers from an off-by-one error, if a | ||
descriptor was to have more than allowed(ROCKER_TX_FRAGS_MAX=16) | ||
fragments. Fix an incorrect bounds check to avoid it. | ||
|
||
Reported-by: Qinghao Tang <[email protected]> | ||
Cc: [email protected] | ||
Signed-off-by: Prasad J Pandit <[email protected]> | ||
Signed-off-by: Jason Wang <[email protected]> | ||
--- | ||
hw/net/rocker/rocker.c | 8 ++++---- | ||
1 file changed, 4 insertions(+), 4 deletions(-) | ||
|
||
diff --git a/hw/net/rocker/rocker.c b/hw/net/rocker/rocker.c | ||
index c57f1a6..2e77e50 100644 | ||
--- a/hw/net/rocker/rocker.c | ||
+++ b/hw/net/rocker/rocker.c | ||
@@ -232,6 +232,9 @@ static int tx_consume(Rocker *r, DescInfo *info) | ||
frag_addr = rocker_tlv_get_le64(tlvs[ROCKER_TLV_TX_FRAG_ATTR_ADDR]); | ||
frag_len = rocker_tlv_get_le16(tlvs[ROCKER_TLV_TX_FRAG_ATTR_LEN]); | ||
|
||
+ if (iovcnt >= ROCKER_TX_FRAGS_MAX) { | ||
+ goto err_too_many_frags; | ||
+ } | ||
iov[iovcnt].iov_len = frag_len; | ||
iov[iovcnt].iov_base = g_malloc(frag_len); | ||
if (!iov[iovcnt].iov_base) { | ||
@@ -244,10 +247,7 @@ static int tx_consume(Rocker *r, DescInfo *info) | ||
err = -ROCKER_ENXIO; | ||
goto err_bad_io; | ||
} | ||
- | ||
- if (++iovcnt > ROCKER_TX_FRAGS_MAX) { | ||
- goto err_too_many_frags; | ||
- } | ||
+ iovcnt++; | ||
} | ||
|
||
if (iovcnt) { | ||
-- | ||
2.6.2 | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,50 @@ | ||
https://bugs.gentoo.org/570988 | ||
|
||
From aa7f9966dfdff500bbbf1956d9e115b1fa8987a6 Mon Sep 17 00:00:00 2001 | ||
From: Prasad J Pandit <[email protected]> | ||
Date: Thu, 31 Dec 2015 17:05:27 +0530 | ||
Subject: [PATCH] net: ne2000: fix bounds check in ioport operations | ||
|
||
While doing ioport r/w operations, ne2000 device emulation suffers | ||
from OOB r/w errors. Update respective array bounds check to avoid | ||
OOB access. | ||
|
||
Reported-by: Ling Liu <[email protected]> | ||
Cc: [email protected] | ||
Signed-off-by: Prasad J Pandit <[email protected]> | ||
Signed-off-by: Jason Wang <[email protected]> | ||
--- | ||
hw/net/ne2000.c | 10 ++++++---- | ||
1 file changed, 6 insertions(+), 4 deletions(-) | ||
|
||
diff --git a/hw/net/ne2000.c b/hw/net/ne2000.c | ||
index 010f9ef..a3dffff 100644 | ||
--- a/hw/net/ne2000.c | ||
+++ b/hw/net/ne2000.c | ||
@@ -467,8 +467,9 @@ static inline void ne2000_mem_writel(NE2000State *s, uint32_t addr, | ||
uint32_t val) | ||
{ | ||
addr &= ~1; /* XXX: check exact behaviour if not even */ | ||
- if (addr < 32 || | ||
- (addr >= NE2000_PMEM_START && addr < NE2000_MEM_SIZE)) { | ||
+ if (addr < 32 | ||
+ || (addr >= NE2000_PMEM_START | ||
+ && addr + sizeof(uint32_t) <= NE2000_MEM_SIZE)) { | ||
stl_le_p(s->mem + addr, val); | ||
} | ||
} | ||
@@ -497,8 +498,9 @@ static inline uint32_t ne2000_mem_readw(NE2000State *s, uint32_t addr) | ||
static inline uint32_t ne2000_mem_readl(NE2000State *s, uint32_t addr) | ||
{ | ||
addr &= ~1; /* XXX: check exact behaviour if not even */ | ||
- if (addr < 32 || | ||
- (addr >= NE2000_PMEM_START && addr < NE2000_MEM_SIZE)) { | ||
+ if (addr < 32 | ||
+ || (addr >= NE2000_PMEM_START | ||
+ && addr + sizeof(uint32_t) <= NE2000_MEM_SIZE)) { | ||
return ldl_le_p(s->mem + addr); | ||
} else { | ||
return 0xffffffff; | ||
-- | ||
2.6.2 | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
https://bugs.gentoo.org/571566 | ||
|
||
From 4ab0359a8ae182a7ac5c99609667273167703fab Mon Sep 17 00:00:00 2001 | ||
From: Prasad J Pandit <[email protected]> | ||
Date: Mon, 11 Jan 2016 14:10:42 -0500 | ||
Subject: [PATCH] ide: ahci: reset ncq object to unused on error | ||
|
||
When processing NCQ commands, AHCI device emulation prepares a | ||
NCQ transfer object; To which an aio control block(aiocb) object | ||
is assigned in 'execute_ncq_command'. In case, when the NCQ | ||
command is invalid, the 'aiocb' object is not assigned, and NCQ | ||
transfer object is left as 'used'. This leads to a use after | ||
free kind of error in 'bdrv_aio_cancel_async' via 'ahci_reset_port'. | ||
Reset NCQ transfer object to 'unused' to avoid it. | ||
|
||
[Maintainer edit: s/ACHI/AHCI/ in the commit message. --js] | ||
|
||
Reported-by: Qinghao Tang <[email protected]> | ||
Signed-off-by: Prasad J Pandit <[email protected]> | ||
Reviewed-by: John Snow <[email protected]> | ||
Message-id: [email protected] | ||
Signed-off-by: John Snow <[email protected]> | ||
--- | ||
hw/ide/ahci.c | 1 + | ||
1 file changed, 1 insertion(+) | ||
|
||
diff --git a/hw/ide/ahci.c b/hw/ide/ahci.c | ||
index dd1912e..17f1cbd 100644 | ||
--- a/hw/ide/ahci.c | ||
+++ b/hw/ide/ahci.c | ||
@@ -910,6 +910,7 @@ static void ncq_err(NCQTransferState *ncq_tfs) | ||
ide_state->error = ABRT_ERR; | ||
ide_state->status = READY_STAT | ERR_STAT; | ||
ncq_tfs->drive->port_regs.scr_err |= (1 << ncq_tfs->tag); | ||
+ ncq_tfs->used = 0; | ||
} | ||
|
||
static void ncq_finish(NCQTransferState *ncq_tfs) | ||
-- | ||
2.6.2 | ||
|
Oops, something went wrong.