lkml.org 
[lkml]   [2004]   [Jun]   [21]   [last100]   RSS Feed
Views: [more markup]  [less markup]  [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
DateMon, 21 Jun 2004 11:24:30 +0300
FromDan Aloni <>
SubjectRe: [PATCH] missing NULL check in drivers/char/n_tty.c
On Mon, Jun 21, 2004 at 12:39:44AM -0700, Andrew Morton wrote:
> Dan Aloni <da-x@gmx.net> wrote:
> >
> > On Sun, Jun 20, 2004 at 11:58:24PM -0700, Andrew Morton wrote:
> > > Dan Aloni <da-x@gmx.net> wrote:
> > > >
> > > > The rest of the kernel treats tty->driver->chars_in_buffer as a possible
> > > >  NULL. This patch changes normal_poll() to be consistent with the rest of
> > > >  the code.
> > > 
> > > It would be better to change the rest of the kernel - remove the tests.
> > > 
> > > If any driver fails to implement ->chars_in_buffer() then we get a nice
> > > oops which tells us that driver needs a stub handler.
> > 
> > Are you sure that it won't affect the logic in tty_wait_until_sent() 
> > drastically? It acts quite differently when ->chars_in_buffer == NULL.
> 
> I did a quick grep and it appears that all drivers have set ->chars_in_buffer().
> 
> I suspect there are no drivers which fail to set chars_in_buffer. 
> Otherwise normal_poll() would have been oopsing in 2.4, 2.5 and 2.6?

Right. Perhaps this should be applied:

Signed-off-by: Dan Aloni <da-x@colinux.org>

--- linux-2.6.7/drivers/char/n_hdlc.c
+++ linux-2.6.7/drivers/char/n_hdlc.c
@@ -760,8 +760,7 @@
 
 	case TIOCOUTQ:
 		/* get the pending tx byte count in the driver */
-		count = tty->driver->chars_in_buffer ?
-				tty->driver->chars_in_buffer(tty) : 0;
+		count = tty->driver->chars_in_buffer(tty);
 		/* add size of next output frame in queue */
 		spin_lock_irqsave(&n_hdlc->tx_buf_list.spinlock,flags);
 		if (n_hdlc->tx_buf_list.head)
--- linux-2.6.7/drivers/char/tty_ioctl.c
+++ linux-2.6.7/drivers/char/tty_ioctl.c
@@ -45,8 +45,6 @@
 	
 	printk(KERN_DEBUG "%s wait until sent...\n", tty_name(tty, buf));
 #endif
-	if (!tty->driver->chars_in_buffer)
-		return;
 	add_wait_queue(&tty->write_wait, &wait);
 	if (!timeout)
 		timeout = MAX_SCHEDULE_TIMEOUT;
@@ -461,8 +459,7 @@
 			}
 			return 0;
 		case TIOCOUTQ:
-			return put_user(tty->driver->chars_in_buffer ?
-					tty->driver->chars_in_buffer(tty) : 0,
+			return put_user(tty->driver->chars_in_buffer(tty),
 					(int __user *) arg);
 		case TIOCINQ:
 			retval = tty->read_cnt;
-- 
Dan Aloni
da-x@colinux.org
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

\
 
 \ /
  Last update: 2005-03-22 14:04    [from the cache]
©2003-2008