tty: Fix lookahead_buf crash with serdev
authorVincent Whitchurch <vincent.whitchurch@axis.com>
Thu, 18 Aug 2022 11:50:26 +0000 (13:50 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 30 Aug 2022 12:31:53 +0000 (14:31 +0200)
Do not follow a NULL pointer if the tty_port_client_operations does not
implement the ->lookahead_buf() callback, which is the case with
serdev's ttyport.

Reported-by: Hans de Goede <hdegoede@redhat.com>
Fixes: 6bb6fa6908ebd3 ("tty: Implement lookahead to process XON/XOFF timely")
Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Signed-off-by: Vincent Whitchurch <vincent.whitchurch@axis.com>
Link: https://lore.kernel.org/r/20220818115026.2237893-1-vincent.whitchurch@axis.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/tty_buffer.c

index 9fdecc7..5e287de 100644 (file)
@@ -470,7 +470,6 @@ static void lookahead_bufs(struct tty_port *port, struct tty_buffer *head)
 
        while (head) {
                struct tty_buffer *next;
-               unsigned char *p, *f = NULL;
                unsigned int count;
 
                /*
@@ -489,11 +488,16 @@ static void lookahead_bufs(struct tty_port *port, struct tty_buffer *head)
                        continue;
                }
 
-               p = char_buf_ptr(head, head->lookahead);
-               if (~head->flags & TTYB_NORMAL)
-                       f = flag_buf_ptr(head, head->lookahead);
+               if (port->client_ops->lookahead_buf) {
+                       unsigned char *p, *f = NULL;
+
+                       p = char_buf_ptr(head, head->lookahead);
+                       if (~head->flags & TTYB_NORMAL)
+                               f = flag_buf_ptr(head, head->lookahead);
+
+                       port->client_ops->lookahead_buf(port, p, f, count);
+               }
 
-               port->client_ops->lookahead_buf(port, p, f, count);
                head->lookahead += count;
        }
 }