Skip to contentSkip to conversation

Patch "serdev: fix tty-port client deregistration" has been added to the 4.11-stable tree

PATCH [email protected] 1 participant 1 message Jun 5, 2017

Subsystems (3)
lore
Share & tools
lore

[email protected]

author maintainer Applied
#0 lore raw

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

serdev: fix tty-port client deregistration

to the 4.11-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:
serdev-fix-tty-port-client-deregistration.patch
and it can be found in the queue-4.11 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.

Quoted 1 line

From aee5da7838787f8ed47f825dbe09e2812acdf97b Mon Sep 17 00:00:00 2001

From: Johan Hovold <[email protected]>
Date: Tue, 11 Apr 2017 19:07:29 +0200
Subject: serdev: fix tty-port client deregistration

From: Johan Hovold <[email protected]>

commit aee5da7838787f8ed47f825dbe09e2812acdf97b upstream.

The port client data must be set when registering the serdev controller or client deregistration will fail (and the serdev devices are left registered and allocated) if the port was never opened in between.

Make sure to clear the port client data on any probe errors to avoid a use-after-free when the client is later deregistered unconditionally (e.g. in a tty-port deregistration helper).

Also move port client operation initialisation to registration. Note that the client ops must be restored on failed probe.

Fixes bed35c6dfa6a ("serdev: add a tty port controller driver")
---
 drivers/tty/serdev/serdev-ttyport.c |   15 ++++++++++-----
 1 file changed, 10 insertions(+), 5 deletions(-)
drivers/tty/serdev/serdev-ttyport.c +10 -5
@@ -101,9 +101,6 @@ static int ttyport_open(struct serdev_co
 		return PTR_ERR(tty);
 	serport->tty = tty;
 
-	serport->port->client_ops = &client_ops;
-	serport->port->client_data = ctrl;
-
 	if (tty->ops->open)
 		tty->ops->open(serport->tty, NULL);
 	else
@@ -181,6 +178,7 @@ struct device *serdev_tty_port_register(
 					struct device *parent,
 					struct tty_driver *drv, int idx)
 {
+	const struct tty_port_client_operations *old_ops;
 	struct serdev_controller *ctrl;
 	struct serport *serport;
 	int ret;
@@ -199,15 +197,22 @@ struct device *serdev_tty_port_register(
 
 	ctrl->ops = &ctrl_ops;
 
+	old_ops = port->client_ops;
+	port->client_ops = &client_ops;
+	port->client_data = ctrl;
+
 	ret = serdev_controller_add(ctrl);
 	if (ret)
-		goto err_controller_put;
+		goto err_reset_data;
 
 	dev_info(&ctrl->dev, "tty port %s%d registered\n", drv->name, idx);
 	return &ctrl->dev;
 
-err_controller_put:
+err_reset_data:
+	port->client_data = NULL;
+	port->client_ops = old_ops;
 	serdev_controller_put(ctrl);
+
 	return ERR_PTR(ret);
 }
 

Patches currently in stable-queue which might be from [email protected] are

queue-4.11/revert-tty_port-register-tty-ports-with-serdev-bus.patch queue-4.11/serdev-fix-tty-port-client-deregistration.patch