Patch "serial: max3100: Update uart_driver_registered on driver removal" has been added to the 6.9-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    serial: max3100: Update uart_driver_registered on driver removal

to the 6.9-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     serial-max3100-update-uart_driver_registered-on-driv.patch
and it can be found in the queue-6.9 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 60b83ac756edc8c0818237b86fda606da1501e09
Author: Andy Shevchenko <andriy.shevchenko@xxxxxxxxxxxxxxx>
Date:   Tue Apr 2 22:50:29 2024 +0300

    serial: max3100: Update uart_driver_registered on driver removal
    
    [ Upstream commit 712a1fcb38dc7cac6da63ee79a88708fbf9c45ec ]
    
    The removal of the last MAX3100 device triggers the removal of
    the driver. However, code doesn't update the respective global
    variable and after insmod — rmmod — insmod cycle the kernel
    oopses:
    
      max3100 spi-PRP0001:01: max3100_probe: adding port 0
      BUG: kernel NULL pointer dereference, address: 0000000000000408
      ...
      RIP: 0010:serial_core_register_port+0xa0/0x840
      ...
       max3100_probe+0x1b6/0x280 [max3100]
       spi_probe+0x8d/0xb0
    
    Update the actual state so next time UART driver will be registered
    again.
    
    Hugo also noticed, that the error path in the probe also affected
    by having the variable set, and not cleared. Instead of clearing it
    move the assignment after the successfull uart_register_driver() call.
    
    Fixes: 7831d56b0a35 ("tty: MAX3100")
    Signed-off-by: Andy Shevchenko <andriy.shevchenko@xxxxxxxxxxxxxxx>
    Reviewed-by: Hugo Villeneuve <hvilleneuve@xxxxxxxxxxxx>
    Link: https://lore.kernel.org/r/20240402195306.269276-3-andriy.shevchenko@xxxxxxxxxxxxxxx
    Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/tty/serial/max3100.c b/drivers/tty/serial/max3100.c
index 45022f2909f0a..b3e63b6a402e1 100644
--- a/drivers/tty/serial/max3100.c
+++ b/drivers/tty/serial/max3100.c
@@ -749,13 +749,14 @@ static int max3100_probe(struct spi_device *spi)
 	mutex_lock(&max3100s_lock);
 
 	if (!uart_driver_registered) {
-		uart_driver_registered = 1;
 		retval = uart_register_driver(&max3100_uart_driver);
 		if (retval) {
 			printk(KERN_ERR "Couldn't register max3100 uart driver\n");
 			mutex_unlock(&max3100s_lock);
 			return retval;
 		}
+
+		uart_driver_registered = 1;
 	}
 
 	for (i = 0; i < MAX_MAX3100; i++)
@@ -841,6 +842,7 @@ static void max3100_remove(struct spi_device *spi)
 		}
 	pr_debug("removing max3100 driver\n");
 	uart_unregister_driver(&max3100_uart_driver);
+	uart_driver_registered = 0;
 
 	mutex_unlock(&max3100s_lock);
 }




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux