diff options
author | Rahul Dadhich <r.dadhich@samsung.com> | 2018-06-13 15:08:07 +0530 |
---|---|---|
committer | Rahul Dadhich <r.dadhich@samsung.com> | 2018-06-13 15:13:56 +0530 |
commit | dc3848011053d7d8dd4eff5b1d4147dbd59b78ca (patch) | |
tree | 851d4c08b959f5583f3c7c04fc32fbe39f34b8fc /hw/sd/sdhci.c | |
parent | f998471ef950dc559a40c902e8debfa131579d8e (diff) | |
download | qemu-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.c | 14 |
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); |