On 17/07/2025 12:58, Peter Maydell wrote:

On Thu, 17 Jul 2025 at 12:51, Philippe Mathieu-Daudé <phi...@linaro.org> wrote:

Hi Mark,

On 15/7/25 08:19, Philippe Mathieu-Daudé wrote:
From: Mark Cave-Ayland <mark.cave-ayl...@ilande.co.uk>

In the cases where mixed DMA/non-DMA transfers are used or no data is
available, it is possible for the calculated transfer length to be zero.
Only call the dma_memory_read function where the transfer length is
non-zero to avoid invoking the DMA engine for a zero length transfer
which can have side-effects (along with generating additional tracing
noise).

Signed-off-by: Mark Cave-Ayland <mark.cave-ayl...@ilande.co.uk>
Reviewed-by: Philippe Mathieu-Daudé <phi...@linaro.org>
Tested-by: Philippe Mathieu-Daudé <phi...@linaro.org>
Message-ID: <20250711204636.542964-5-mark.cave-ayl...@ilande.co.uk>
Signed-off-by: Philippe Mathieu-Daudé <phi...@linaro.org>
---
   hw/scsi/esp.c | 20 +++++++++++++-------
   1 file changed, 13 insertions(+), 7 deletions(-)

diff --git a/hw/scsi/esp.c b/hw/scsi/esp.c
index 62ba4061492..ec9fcbeddf4 100644
--- a/hw/scsi/esp.c
+++ b/hw/scsi/esp.c
@@ -487,8 +487,10 @@ static void esp_do_dma(ESPState *s)
       case STAT_MO:
           if (s->dma_memory_read) {
               len = MIN(len, fifo8_num_free(&s->cmdfifo));
-            s->dma_memory_read(s->dma_opaque, buf, len);
-            esp_set_tc(s, esp_get_tc(s) - len);
+            if (len) {
+                s->dma_memory_read(s->dma_opaque, buf, len);
+                esp_set_tc(s, esp_get_tc(s) - len);
+            }
           } else {
               len = esp_fifo_pop_buf(s, buf, fifo8_num_used(&s->fifo));
               len = MIN(fifo8_num_free(&s->cmdfifo), len);
              }
              fifo8_push_all(&s->cmdfifo, buf, len);

Coverity reported access to uninitialized buf[]:

  >>>     CID 1612373:         Uninitialized variables  (UNINIT)
  >>>     Using uninitialized value "*buf" when calling "fifo8_push_all".

Do you mind having a look?

I think this is a false positive (and marked it that way in
the Coverity Scan UI). Coverity is complaining that
we might access buf[] uninitialized, but in the code path
it is complaining about we know that len is zero. The
fifo8_push_all() does a "memcpy(&fifo->data[start], data, num)"
and if num is 0 that is valid and won't access anything in buf[].

We could I suppose make fifo8_push_all() return early for the
num == 0 case, just to make it clearer that it's supposed to work.

Thanks both!

I can certainly look to update fifo8_push_all() if you think it would be a better solution?


ATB,

Mark.


Reply via email to