libchip/serial/ns16550* and z8530*: Assert on baud number to avoid divide by 0

This was flagged by CodeSonar. It should be impossible to get an
incorrect baud number back but ensure this in debug mode. The _Assert()
keeps their scanner from evaluating for divide by 0 past this point.
This commit is contained in:
Josh Oguin
2014-11-19 14:28:08 -06:00
committed by Joel Sherrill
parent 0ad1e8001f
commit 02958c5e53
3 changed files with 14 additions and 1 deletions

View File

@@ -592,9 +592,13 @@ static bool ns16550_set_attributes(
/* /*
* Calculate the baud rate divisor * Calculate the baud rate divisor
*
* Assert ensures there is no division by 0.
*/ */
baud_requested = rtems_termios_baud_to_number(t->c_cflag); baud_requested = rtems_termios_baud_to_number(t->c_cflag);
_Assert( baud_requested != 0 );
ulBaudDivisor = NS16550_GetBaudDivisor(ctx, baud_requested); ulBaudDivisor = NS16550_GetBaudDivisor(ctx, baud_requested);
ucLineControl = 0; ucLineControl = 0;

View File

@@ -532,9 +532,12 @@ int ns16550_set_attributes(
/* /*
* Calculate the baud rate divisor * Calculate the baud rate divisor
*
* Assert ensures there is no division by 0.
*/ */
baud_requested = rtems_termios_baud_to_number(t->c_cflag); baud_requested = rtems_termios_baud_to_number(t->c_cflag);
_Assert( baud_requested != 0 );
ulBaudDivisor = NS16550_GetBaudDivisor(c, baud_requested); ulBaudDivisor = NS16550_GetBaudDivisor(c, baud_requested);
ucLineControl = 0; ucLineControl = 0;

View File

@@ -437,6 +437,7 @@ Z85C30_STATIC int z85c30_set_attributes(
uint32_t wr4; uint32_t wr4;
uint32_t wr5; uint32_t wr5;
int baud_requested; int baud_requested;
uint32_t baud_number;
setRegister_f setReg; setRegister_f setReg;
rtems_interrupt_level Irql; rtems_interrupt_level Irql;
@@ -445,15 +446,20 @@ Z85C30_STATIC int z85c30_set_attributes(
/* /*
* Calculate the baud rate divisor * Calculate the baud rate divisor
*
* Assert ensures there is no division by 0.
*/ */
baud_requested = t->c_cflag & CBAUD; baud_requested = t->c_cflag & CBAUD;
if (!baud_requested) if (!baud_requested)
baud_requested = B9600; /* default to 9600 baud */ baud_requested = B9600; /* default to 9600 baud */
baud_number = (uint32_t) rtems_termios_baud_to_number( baud_requested );
_Assert( baud_number != 0 );
ulBaudDivisor = Z85C30_Baud( ulBaudDivisor = Z85C30_Baud(
(uint32_t) Console_Port_Tbl[minor]->ulClock, (uint32_t) Console_Port_Tbl[minor]->ulClock,
(uint32_t) rtems_termios_baud_to_number( baud_requested ) baud_number
); );
wr3 = SCC_WR3_RX_EN; wr3 = SCC_WR3_RX_EN;