When baudbase is zero (e.g. not yet configured), the division baudbase /
divider produces zero. This results in NANOSECONDS_PER_SECOND / speed
yielding infinity, making char_transmit_time infinite and stalling
transmission.

Fall back to the same 3500 baud default used for a zero divisor.

Fixes: 96651db423a0 ("serial: add "baudbase" property")
Reported-by: Pavee Hui <[email protected]>
Signed-off-by: Marc-André Lureau <[email protected]>
---
 hw/char/serial.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/hw/char/serial.c b/hw/char/serial.c
index 4339562ab003..44bf9fa0b25b 100644
--- a/hw/char/serial.c
+++ b/hw/char/serial.c
@@ -178,6 +178,9 @@ static void serial_update_parameters(SerialState *s)
     frame_size += data_bits + stop_bits;
     /* Zero divisor should give about 3500 baud */
     speed = (s->divider == 0) ? 3500 : (float) s->baudbase / s->divider;
+    if (speed <= 0) {
+        speed = 3500;
+    }
     ssp.speed = speed;
     ssp.parity = parity;
     ssp.data_bits = data_bits;

-- 
2.56.0.rc0.29.g47ce80527c56


Reply via email to