summaryrefslogtreecommitdiff
path: root/hw/sd/sdhci.c
diff options
context:
space:
mode:
authorRahul Dadhich <r.dadhich@samsung.com>2018-06-13 15:08:07 +0530
committerRahul Dadhich <r.dadhich@samsung.com>2018-06-13 15:13:56 +0530
commitdc3848011053d7d8dd4eff5b1d4147dbd59b78ca (patch)
tree851d4c08b959f5583f3c7c04fc32fbe39f34b8fc /hw/sd/sdhci.c
parentf998471ef950dc559a40c902e8debfa131579d8e (diff)
downloadqemu-dc3848011053d7d8dd4eff5b1d4147dbd59b78ca.tar.gz
qemu-dc3848011053d7d8dd4eff5b1d4147dbd59b78ca.tar.bz2
qemu-dc3848011053d7d8dd4eff5b1d4147dbd59b78ca.zip
[SATDEVKIT-786]Open source security issues fix
Change-Id: If3c955c4ff33114725dde8f38c118e0a25387727 Signed-off-by: Rahul Dadhich <r.dadhich@samsung.com>
Diffstat (limited to 'hw/sd/sdhci.c')
-rw-r--r--hw/sd/sdhci.c14
1 files changed, 7 insertions, 7 deletions
diff --git a/hw/sd/sdhci.c b/hw/sd/sdhci.c
index 01fbf228be..09d6cb51d9 100644
--- a/hw/sd/sdhci.c
+++ b/hw/sd/sdhci.c
@@ -486,6 +486,11 @@ static void sdhci_sdma_transfer_multi_blocks(SDHCIState *s)
uint32_t boundary_chk = 1 << (((s->blksize & 0xf000) >> 12) + 12);
uint32_t boundary_count = boundary_chk - (s->sdmasysad % boundary_chk);
+ if (!(s->trnmod & SDHC_TRNS_BLK_CNT_EN) || !s->blkcnt) {
+ qemu_log_mask(LOG_UNIMP, "infinite transfer is not supported\n");
+ return;
+ }
+
/* XXX: Some sd/mmc drivers (for example, u-boot-slp) do not account for
* possible stop at page boundary if initial address is not page aligned,
* allow them to work properly */
@@ -536,7 +541,7 @@ static void sdhci_sdma_transfer_multi_blocks(SDHCIState *s)
boundary_count -= block_size - begin;
}
dma_memory_read(&address_space_memory, s->sdmasysad,
- &s->fifo_buffer[begin], s->data_count);
+ &s->fifo_buffer[begin], s->data_count - begin);
s->sdmasysad += s->data_count - begin;
if (s->data_count == block_size) {
for (n = 0; n < block_size; n++) {
@@ -797,12 +802,7 @@ static void sdhci_data_transfer(void *opaque)
if (s->trnmod & SDHC_TRNS_DMA) {
switch (SDHC_DMA_TYPE(s->hostctl)) {
case SDHC_CTRL_SDMA:
- if ((s->trnmod & SDHC_TRNS_MULTI) &&
- (!(s->trnmod & SDHC_TRNS_BLK_CNT_EN) || s->blkcnt == 0)) {
- break;
- }
-
- if ((s->blkcnt == 1) || !(s->trnmod & SDHC_TRNS_MULTI)) {
+ if ((s->blkcnt == 1) || !(s->trnmod & SDHC_TRNS_MULTI)) {
sdhci_sdma_transfer_single_block(s);
} else {
sdhci_sdma_transfer_multi_blocks(s);