]> git.ipfire.org Git - thirdparty/qemu.git/commitdiff
esp.c: don't assert() if FIFO empty when executing non-DMA SELATNS
authorMark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Sun, 24 Mar 2024 19:16:59 +0000 (19:16 +0000)
committerMark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Thu, 4 Apr 2024 14:17:53 +0000 (15:17 +0100)
The current logic assumes that at least 1 byte is present in the FIFO when
executing a non-DMA SELATNS command, but this may not be the case if the
guest executes an invalid ESP command sequence.

Reported-by: Chuhong Yuan <hslester96@gmail.com>
Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Message-Id: <20240324191707.623175-11-mark.cave-ayland@ilande.co.uk>
Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
hw/scsi/esp.c

index 1aac8f55645a458d645192c4607fa49768f06745..f3aa5364cf405ec925fa03ba6c49a539997a9768 100644 (file)
@@ -762,7 +762,8 @@ static void esp_do_nodma(ESPState *s)
 
         case CMD_SELATNS:
             /* Copy one byte from FIFO into cmdfifo */
-            len = esp_fifo_pop_buf(s, buf, 1);
+            len = esp_fifo_pop_buf(s, buf,
+                                   MIN(fifo8_num_used(&s->fifo), 1));
             len = MIN(fifo8_num_free(&s->cmdfifo), len);
             fifo8_push_all(&s->cmdfifo, buf, len);