From e21b6105a99d6863fc6fe213c387db636a5e4abe Mon Sep 17 00:00:00 2001 From: Visweswara Tanuku Date: Wed, 30 Mar 2022 21:18:49 +0530 Subject: [PATCH] ANDROID: tty: serial: msm: geni: Do not access private data when console is disabled uport private data is not initialized when console is disabled. Prevent access of private data to avoid null pointer access in system suspend/resume. Bug: 228299196 Signed-off-by: Visweswara Tanuku Change-Id: I288a24e2c6bee091fa7c479de520958ea0bb3d17 --- drivers/tty/serial/qcom_geni_serial.c | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/drivers/tty/serial/qcom_geni_serial.c b/drivers/tty/serial/qcom_geni_serial.c index ee7630e6a41d..5379239bc6eb 100644 --- a/drivers/tty/serial/qcom_geni_serial.c +++ b/drivers/tty/serial/qcom_geni_serial.c @@ -1,5 +1,8 @@ // SPDX-License-Identifier: GPL-2.0 -// Copyright (c) 2017-2018, The Linux foundation. All rights reserved. +/* + * Copyright (c) 2017-2018, The Linux foundation. All rights reserved. + * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. + */ #include #include @@ -1496,9 +1499,9 @@ static int qcom_geni_serial_remove(struct platform_device *pdev) static int __maybe_unused qcom_geni_serial_sys_suspend(struct device *dev) { + struct uart_port *uport; + struct qcom_geni_private_data *private_data; struct qcom_geni_serial_port *port = dev_get_drvdata(dev); - struct uart_port *uport = &port->uport; - struct qcom_geni_private_data *private_data = uport->private_data; /* Platform driver is registered for console and when console * is disabled from cmdline simply return success. @@ -1506,6 +1509,9 @@ static int __maybe_unused qcom_geni_serial_sys_suspend(struct device *dev) if (port->is_console && !con_enabled) return 0; + uport = &port->uport; + private_data = uport->private_data; + /* * This is done so we can hit the lowest possible state in suspend * even with no_console_suspend @@ -1520,9 +1526,18 @@ static int __maybe_unused qcom_geni_serial_sys_suspend(struct device *dev) static int __maybe_unused qcom_geni_serial_sys_resume(struct device *dev) { int ret; + struct uart_port *uport; + struct qcom_geni_private_data *private_data; struct qcom_geni_serial_port *port = dev_get_drvdata(dev); - struct uart_port *uport = &port->uport; - struct qcom_geni_private_data *private_data = uport->private_data; + + /* Platform driver is registered for console and when console + * is disabled from cmdline simply return success. + */ + if (port->is_console && !con_enabled) + return 0; + + uport = &port->uport; + private_data = uport->private_data; ret = uart_resume_port(private_data->drv, uport); if (uart_console(uport)) {