serial167: fix read buffer overflow
Subsystems (2)
PATCH 4/5 serial167: fix read buffer overflow
From: Roel Kluin <[email protected]>
Check whether index is within bounds before grabbing the element.
Also, since NR_PORTS is defined ARRAY_SIZE(cy_port), cy_port[NR_PORTS] is out of bounds as well.
[[email protected]: cleanup, remove (long) casts]
Signed-off-by Roel Kluin <[email protected]>
Cc Alan Cox <[email protected]>
Cc Jiri Slaby <[email protected]>
Signed-off-by Andrew Morton <[email protected]>
---
drivers/char/serial167.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-)
drivers/char/serial167.c renamed from drivers/char/serial167.c~serial167-fix-read-buffer-overflow +2 -5
@@ -221,8 +221,7 @@ static inline int serial_paranoia_check(return 1 ; } -if ((long )info < (long )(&cy_port[0 ]) - || (long )(&cy_port[NR_PORTS ]) < (long )info) { +if (info < &cy_port[0 ] || info >= &cy_port[NR_PORTS ]) {printk ("Warning: cyclades_port out of range for (%s) in %s\n" , name, routine);return 1 ;
@@ -521,15 +520,13 @@ static irqreturn_t cd2401_tx_interrupt(i panic("TxInt on debug port!!!"); }#endif - - info = &cy_port[channel]; -/* validate the port number (as configured and open) */ if ((channel <0 ) || (NR_PORTS <= channel)) { base_addr[CyIER] &= ~(CyTxMpty | CyTxRdy); base_addr[CyTEOIR] = CyNOTRANS;return IRQ_HANDLED ; } + info = &cy_port[channel]; info->last_active = jiffies;if (info->tty ==0 ) { base_addr[CyIER] &= ~(CyTxMpty | CyTxRdy);
_