2024-04-17 09:37:12

by Viken Dadhaniya

[permalink] [raw]
Subject: [PATCH v2] slimbus: stream: Add null pointer check for client APIs

Due to incorrect sequrnce of slimbus APIs called by client
driver, facing system crash in slimbus framework APIs.

To prevent system crash, add NULL pointer check in
enable/disable/prepare/unprepare/free APIs.

Signed-off-by: Viken Dadhaniya <[email protected]>
---
v1 -> v2:
- Update commit log.
- Update debug logs.

v1 Link: https://lore.kernel.org/linux-arm-msm/[email protected]/T/
---
---
drivers/slimbus/stream.c | 37 +++++++++++++++++++++++++++++++++----
1 file changed, 33 insertions(+), 4 deletions(-)

diff --git a/drivers/slimbus/stream.c b/drivers/slimbus/stream.c
index 1d6b38657917..76d0579cbf53 100644
--- a/drivers/slimbus/stream.c
+++ b/drivers/slimbus/stream.c
@@ -202,10 +202,16 @@ static int slim_get_prate_code(int rate)
int slim_stream_prepare(struct slim_stream_runtime *rt,
struct slim_stream_config *cfg)
{
- struct slim_controller *ctrl = rt->dev->ctrl;
+ struct slim_controller *ctrl;
struct slim_port *port;
int num_ports, i, port_id, prrate;

+ if (!rt || !cfg) {
+ pr_err("Invalid stream rt or cfg\n");
+ return -EINVAL;
+ }
+
+ ctrl = rt->dev->ctrl;
if (rt->ports) {
dev_err(&rt->dev->dev, "Stream already Prepared\n");
return -EINVAL;
@@ -358,9 +364,15 @@ int slim_stream_enable(struct slim_stream_runtime *stream)
{
DEFINE_SLIM_BCAST_TXN(txn, SLIM_MSG_MC_BEGIN_RECONFIGURATION,
3, SLIM_LA_MANAGER, NULL);
- struct slim_controller *ctrl = stream->dev->ctrl;
+ struct slim_controller *ctrl;
int ret, i;

+ if (!stream) {
+ pr_err("Invalid stream\n");
+ return -EINVAL;
+ }
+
+ ctrl = stream->dev->ctrl;
if (ctrl->enable_stream) {
ret = ctrl->enable_stream(stream);
if (ret)
@@ -411,12 +423,18 @@ int slim_stream_disable(struct slim_stream_runtime *stream)
{
DEFINE_SLIM_BCAST_TXN(txn, SLIM_MSG_MC_BEGIN_RECONFIGURATION,
3, SLIM_LA_MANAGER, NULL);
- struct slim_controller *ctrl = stream->dev->ctrl;
+ struct slim_controller *ctrl;
int ret, i;

+ if (!stream) {
+ pr_err("Invalid stream");
+ return -EINVAL;
+ }
+
if (!stream->ports || !stream->num_ports)
return -EINVAL;

+ ctrl = stream->dev->ctrl;
if (ctrl->disable_stream)
ctrl->disable_stream(stream);

@@ -448,6 +466,11 @@ int slim_stream_unprepare(struct slim_stream_runtime *stream)
{
int i;

+ if (!stream) {
+ pr_err("Invalid stream\n");
+ return -EINVAL;
+ }
+
if (!stream->ports || !stream->num_ports)
return -EINVAL;

@@ -476,8 +499,14 @@ EXPORT_SYMBOL_GPL(slim_stream_unprepare);
*/
int slim_stream_free(struct slim_stream_runtime *stream)
{
- struct slim_device *sdev = stream->dev;
+ struct slim_device *sdev;
+
+ if (!stream) {
+ pr_err("Invalid stream\n");
+ return -EINVAL;
+ }

+ sdev = stream->dev;
spin_lock(&sdev->stream_list_lock);
list_del(&stream->node);
spin_unlock(&sdev->stream_list_lock);
--
2.17.1