[PATCH v2 1/7] serdev: add proper error cleanup to serdev_device_open()

Marco Felsch m.felsch at pengutronix.de
Thu Feb 12 14:02:03 PST 2026


The serdev_device_open() function is missing a proper error cleanup
which is fixed by this commit. Unfortunately we don't have scoped
accessors yet, therefore the 'old' goto must be used.

Signed-off-by: Marco Felsch <m.felsch at pengutronix.de>
---
 common/serdev.c | 28 +++++++++++++++++++++++-----
 1 file changed, 23 insertions(+), 5 deletions(-)

diff --git a/common/serdev.c b/common/serdev.c
index 5399a2062722dc12fe5241bdf4a466606af053bb..8f45c0a135237da42579bbb685c9c25a67428c8b 100644
--- a/common/serdev.c
+++ b/common/serdev.c
@@ -71,21 +71,39 @@ int serdev_device_open(struct serdev_device *serdev)
 
 	serdev->buf = xzalloc(PAGE_SIZE);
 	serdev->fifo = kfifo_alloc(PAGE_SIZE);
-	if (!serdev->fifo)
-		return -ENOMEM;
+	if (!serdev->fifo) {
+		ret = -ENOMEM;
+		goto err_free_buf;
+	}
 
 	ret = poller_async_register(&serdev->poller, "serdev");
 	if (ret)
-		return ret;
+		goto err_free_fifo;
 
 	ret = console_open(cdev);
 	if (ret)
-		return ret;
+		goto err_poller_unregister;
 
 	p = dev_add_param_uint64(serdev->dev, "polling_interval",
 				 serdev_device_set_polling_interval, NULL,
 				 &serdev->polling_interval, "%llu", serdev);
-	return PTR_ERR_OR_ZERO(p);
+	if (IS_ERR(p)) {
+		ret = PTR_ERR(p);
+		goto err_console_close;
+	}
+
+	return 0;
+
+err_console_close:
+	console_close(cdev);
+err_poller_unregister:
+	poller_async_unregister(&serdev->poller);
+err_free_fifo:
+	kfifo_free(serdev->fifo);
+err_free_buf:
+	free(serdev->buf);
+
+	return ret;
 }
 
 unsigned int serdev_device_set_baudrate(struct serdev_device *serdev,

-- 
2.47.3




More information about the barebox mailing list