Merge tag 'tty-5.0-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty
Pull tty/serial fixes from Greg KH: "Here are some small tty and serial fixes for 5.0-rc6. Nothing huge, just a few small fixes for reported issues. The speakup fix is in here as it is a tty operation issue. All of these have been in linux-next for a while with no reported problems" * tag 'tty-5.0-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty: serial: fix race between flush_to_ldisc and tty_open staging: speakup: fix tty-operation NULL derefs serial: sh-sci: Do not free irqs that have already been freed serial: 8250_pci: Make PCI class test non fatal tty: serial: 8250_mtk: Fix potential NULL pointer dereference
This commit is contained in:
@@ -265,6 +265,7 @@ static void spk_ttyio_send_xchar(char ch)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (speakup_tty->ops->send_xchar)
|
||||||
speakup_tty->ops->send_xchar(speakup_tty, ch);
|
speakup_tty->ops->send_xchar(speakup_tty, ch);
|
||||||
mutex_unlock(&speakup_tty_mutex);
|
mutex_unlock(&speakup_tty_mutex);
|
||||||
}
|
}
|
||||||
@@ -277,6 +278,7 @@ static void spk_ttyio_tiocmset(unsigned int set, unsigned int clear)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (speakup_tty->ops->tiocmset)
|
||||||
speakup_tty->ops->tiocmset(speakup_tty, set, clear);
|
speakup_tty->ops->tiocmset(speakup_tty, set, clear);
|
||||||
mutex_unlock(&speakup_tty_mutex);
|
mutex_unlock(&speakup_tty_mutex);
|
||||||
}
|
}
|
||||||
|
@@ -357,6 +357,9 @@ static int mtk8250_probe_of(struct platform_device *pdev, struct uart_port *p,
|
|||||||
if (dmacnt == 2) {
|
if (dmacnt == 2) {
|
||||||
data->dma = devm_kzalloc(&pdev->dev, sizeof(*data->dma),
|
data->dma = devm_kzalloc(&pdev->dev, sizeof(*data->dma),
|
||||||
GFP_KERNEL);
|
GFP_KERNEL);
|
||||||
|
if (!data->dma)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
data->dma->fn = mtk8250_dma_filter;
|
data->dma->fn = mtk8250_dma_filter;
|
||||||
data->dma->rx_size = MTK_UART_RX_SIZE;
|
data->dma->rx_size = MTK_UART_RX_SIZE;
|
||||||
data->dma->rxconf.src_maxburst = MTK_UART_RX_TRIGGER;
|
data->dma->rxconf.src_maxburst = MTK_UART_RX_TRIGGER;
|
||||||
|
@@ -3420,6 +3420,11 @@ static int
|
|||||||
serial_pci_guess_board(struct pci_dev *dev, struct pciserial_board *board)
|
serial_pci_guess_board(struct pci_dev *dev, struct pciserial_board *board)
|
||||||
{
|
{
|
||||||
int num_iomem, num_port, first_port = -1, i;
|
int num_iomem, num_port, first_port = -1, i;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
rc = serial_pci_is_class_communication(dev);
|
||||||
|
if (rc)
|
||||||
|
return rc;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Should we try to make guesses for multiport serial devices later?
|
* Should we try to make guesses for multiport serial devices later?
|
||||||
@@ -3647,10 +3652,6 @@ pciserial_init_one(struct pci_dev *dev, const struct pci_device_id *ent)
|
|||||||
|
|
||||||
board = &pci_boards[ent->driver_data];
|
board = &pci_boards[ent->driver_data];
|
||||||
|
|
||||||
rc = serial_pci_is_class_communication(dev);
|
|
||||||
if (rc)
|
|
||||||
return rc;
|
|
||||||
|
|
||||||
rc = serial_pci_is_blacklisted(dev);
|
rc = serial_pci_is_blacklisted(dev);
|
||||||
if (rc)
|
if (rc)
|
||||||
return rc;
|
return rc;
|
||||||
|
@@ -130,6 +130,9 @@ static void uart_start(struct tty_struct *tty)
|
|||||||
struct uart_port *port;
|
struct uart_port *port;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
|
if (!state)
|
||||||
|
return;
|
||||||
|
|
||||||
port = uart_port_lock(state, flags);
|
port = uart_port_lock(state, flags);
|
||||||
__uart_start(tty);
|
__uart_start(tty);
|
||||||
uart_port_unlock(port, flags);
|
uart_port_unlock(port, flags);
|
||||||
@@ -727,6 +730,9 @@ static void uart_unthrottle(struct tty_struct *tty)
|
|||||||
upstat_t mask = UPSTAT_SYNC_FIFO;
|
upstat_t mask = UPSTAT_SYNC_FIFO;
|
||||||
struct uart_port *port;
|
struct uart_port *port;
|
||||||
|
|
||||||
|
if (!state)
|
||||||
|
return;
|
||||||
|
|
||||||
port = uart_port_ref(state);
|
port = uart_port_ref(state);
|
||||||
if (!port)
|
if (!port)
|
||||||
return;
|
return;
|
||||||
|
@@ -1921,7 +1921,7 @@ out_nomem:
|
|||||||
|
|
||||||
static void sci_free_irq(struct sci_port *port)
|
static void sci_free_irq(struct sci_port *port)
|
||||||
{
|
{
|
||||||
int i;
|
int i, j;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Intentionally in reverse order so we iterate over the muxed
|
* Intentionally in reverse order so we iterate over the muxed
|
||||||
@@ -1937,6 +1937,13 @@ static void sci_free_irq(struct sci_port *port)
|
|||||||
if (unlikely(irq < 0))
|
if (unlikely(irq < 0))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
/* Check if already freed (irq was muxed) */
|
||||||
|
for (j = 0; j < i; j++)
|
||||||
|
if (port->irqs[j] == irq)
|
||||||
|
j = i + 1;
|
||||||
|
if (j > i)
|
||||||
|
continue;
|
||||||
|
|
||||||
free_irq(port->irqs[i], port);
|
free_irq(port->irqs[i], port);
|
||||||
kfree(port->irqstr[i]);
|
kfree(port->irqstr[i]);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user