_lpuart_serial_setbrg(), _lpuart32_serial_setbrg_7ulp(), and
_lpuart32_serial_setbrg() all divide by baudrate without validating
it first. If baudrate is zero due to misconfiguration or an
uninitialized value, this can cause a division-by-zero.

As a safety measure, add an early return when baudrate is zero in
all three functions.

Signed-off-by: Naveen Kumar Chaudhary <[email protected]>
---
 drivers/serial/serial_lpuart.c | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/drivers/serial/serial_lpuart.c b/drivers/serial/serial_lpuart.c
index 9fdb6503085..76646e856fc 100644
--- a/drivers/serial/serial_lpuart.c
+++ b/drivers/serial/serial_lpuart.c
@@ -155,6 +155,9 @@ static void _lpuart_serial_setbrg(struct udevice *dev,
        u16 sbr;
        int ret;
 
+       if (!baudrate)
+               return;
+
        if (CONFIG_IS_ENABLED(CLK)) {
                ret = get_lpuart_clk_rate(dev, &clk);
                if (ret)
@@ -245,6 +248,9 @@ static void _lpuart32_serial_setbrg_7ulp(struct udevice 
*dev,
        u32 clk;
        int ret;
 
+       if (!baudrate)
+               return;
+
        if (CONFIG_IS_ENABLED(CLK)) {
                ret = get_lpuart_clk_rate(dev, &clk);
                if (ret)
@@ -314,6 +320,9 @@ static void _lpuart32_serial_setbrg(struct udevice *dev,
        u32 sbr;
        int ret;
 
+       if (!baudrate)
+               return;
+
        if (CONFIG_IS_ENABLED(CLK)) {
                ret = get_lpuart_clk_rate(dev, &clk);
                if (ret)
-- 
2.43.0

Reply via email to