Skip to contentSkip to conversation

serial167: fix read buffer overflow

PATCH New [email protected] 1 participant 1 message Aug 6, 2009

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

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]
Cc Alan Cox <[email protected]>
Cc Jiri Slaby <[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
diff -puN drivers/char/serial167.c~serial167-fix-read-buffer-overflow drivers/char/serial167.c
@@ -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);

_