diff options
| author | Vincent Whitchurch <vincent.whitchurch@axis.com> | 2022-08-18 13:50:26 +0200 | 
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2022-08-30 14:31:53 +0200 | 
| commit | 56c14fb4086b2de6921dd70251b19b364b909ea1 (patch) | |
| tree | 796ed82646c2af26914f7027782cb3e2b02b0cdc /drivers/tty | |
| parent | 846651eca073e2e02e37490a4a52752415d84781 (diff) | |
tty: Fix lookahead_buf crash with serdev
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>
Diffstat (limited to 'drivers/tty')
| -rw-r--r-- | drivers/tty/tty_buffer.c | 14 | 
1 files changed, 9 insertions, 5 deletions
| diff --git a/drivers/tty/tty_buffer.c b/drivers/tty/tty_buffer.c index 9fdecc795b6b..5e287dedce01 100644 --- a/drivers/tty/tty_buffer.c +++ b/drivers/tty/tty_buffer.c @@ -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;  	}  } | 
