From f4b8e44a5e47ef7178ecf2ca828490216516aaae Mon Sep 17 00:00:00 2001 From: Ankur Pawar Date: Wed, 19 Jul 2023 22:03:37 -0700 Subject: [PATCH] media: i2c: camera cert-c and coverity fixes Cert-C fixes in camera ar1335, imx219 and imx477 driver. Cert-C CID:566165 CID:566166 CID:566168 CID:566169 CID:566170 CID:566171 CID:683423 CID:566021 Coverity CID:10179834 Bug 3959323 Change-Id: Id68deab8051206b6eae3da917d83c32365186fc5 Signed-off-by: Ankur Pawar Reviewed-on: https://git-master.nvidia.com/r/c/linux-nv-oot/+/2939548 Reviewed-by: Praveen AC Reviewed-by: Laxman Dewangan GVS: Gerrit_Virtual_Submit --- drivers/media/i2c/ar1335_common.c | 44 ++++++++++++++++++++++++++----- drivers/media/i2c/nv_imx219.c | 15 ++++++++--- drivers/media/i2c/nv_imx477.c | 12 ++++++++- 3 files changed, 61 insertions(+), 10 deletions(-) diff --git a/drivers/media/i2c/ar1335_common.c b/drivers/media/i2c/ar1335_common.c index a355c4d9..7601c11c 100644 --- a/drivers/media/i2c/ar1335_common.c +++ b/drivers/media/i2c/ar1335_common.c @@ -341,9 +341,13 @@ static int cam_g_input_status(struct v4l2_subdev *sd, u32 * status) { struct i2c_client *client = v4l2_get_subdevdata(sd); struct camera_common_data *s_data = to_camera_common_data(&client->dev); - struct cam *priv = (struct cam *)s_data->priv; + struct cam *priv; struct camera_common_power_rail *pw; + if (!s_data) + return -EINVAL; + priv = (struct cam *)s_data->priv; + if (!priv || !priv->pdata) return -EINVAL; @@ -373,12 +377,17 @@ static int cam_set_fmt(struct v4l2_subdev *sd, struct v4l2_subdev_state *cfg, int ret; struct i2c_client *client = v4l2_get_subdevdata(sd); struct camera_common_data *s_data = to_camera_common_data(&client->dev); - struct cam *priv = (struct cam *)s_data->priv; + struct cam *priv; int flag = 0, err = 0, mode = 0, retry = 10; mode = s_data->mode; + if (!s_data) + return -EINVAL; + priv = (struct cam *)s_data->priv; + if (!priv || !priv->pdata) return -EINVAL; + switch (format->format.code) { case MEDIA_BUS_FMT_UYVY8_1X16: priv->format_fourcc = V4L2_PIX_FMT_UYVY; @@ -787,7 +796,7 @@ static int mcu_stream_config(struct i2c_client *client, uint32_t format, int mode, int frate_index) { struct camera_common_data *s_data = to_camera_common_data(&client->dev); - struct cam *priv = (struct cam *)s_data->priv; + struct cam *priv; uint32_t payload_len = 0; @@ -795,6 +804,10 @@ static int mcu_stream_config(struct i2c_client *client, uint32_t format, uint8_t retcode = 0, cmd_id = 0; int loop = 0, ret = 0, err = 0, retry=1000; + if (!s_data) + return -EINVAL; + priv = (struct cam *)s_data->priv; + /* lock semaphore */ mutex_lock(&mcu_i2c_mutex); @@ -938,7 +951,7 @@ static int mcu_get_ctrl(struct i2c_client *client, uint32_t arg_ctrl_id, uint8_t * ctrl_type, int32_t * curr_val) { struct camera_common_data *s_data = to_camera_common_data(&client->dev); - struct cam *priv = (struct cam *)s_data->priv; + struct cam *priv; uint32_t payload_len = 0; uint16_t index = 0xFFFF; @@ -946,6 +959,10 @@ static int mcu_get_ctrl(struct i2c_client *client, uint32_t arg_ctrl_id, uint32_t ctrl_id = 0; + if (!s_data) + return -EINVAL; + priv = (struct cam *)s_data->priv; + /* lock semaphore */ mutex_lock(&mcu_i2c_mutex); @@ -1009,7 +1026,7 @@ static int mcu_set_ctrl(struct i2c_client *client, uint32_t arg_ctrl_id, uint8_t ctrl_type, int32_t curr_val) { struct camera_common_data *s_data = to_camera_common_data(&client->dev); - struct cam *priv = (struct cam *)s_data->priv; + struct cam *priv; uint32_t payload_len = 0; uint16_t cmd_status = 0, index = 0xFFFF; @@ -1017,6 +1034,10 @@ static int mcu_set_ctrl(struct i2c_client *client, uint32_t arg_ctrl_id, int loop = 0, ret = 0, err = 0; uint32_t ctrl_id = 0; + if (!s_data) + return -EINVAL; + priv = (struct cam *)s_data->priv; + /* lock semaphore */ mutex_lock(&mcu_i2c_mutex); @@ -2764,10 +2785,21 @@ static void cam_remove(struct i2c_client *client) #endif { struct camera_common_data *s_data = to_camera_common_data(&client->dev); - struct cam *priv = (struct cam *)s_data->priv; + struct cam *priv; struct device_node *node = client->dev.of_node; int loop = 0; int reset_gpio = 0, pwdn_gpio = 0; + + if (!s_data) { + dev_err(&client->dev, "camera common data is NULL\n"); +#if (KERNEL_VERSION(6, 1, 0) > LINUX_VERSION_CODE) + return -EINVAL; +#else + return; +#endif + } + priv = (struct cam *)s_data->priv; + /* Release the Gpios */ reset_gpio = of_get_named_gpio(node, "reset-gpios", 0); if (reset_gpio < 0) { diff --git a/drivers/media/i2c/nv_imx219.c b/drivers/media/i2c/nv_imx219.c index 533c6866..199064ca 100644 --- a/drivers/media/i2c/nv_imx219.c +++ b/drivers/media/i2c/nv_imx219.c @@ -257,10 +257,9 @@ static int imx219_set_exposure(struct tegracam_device *tc_dev, s64 val) if (mode->signal_properties.pixel_clock.val == 0 || mode->control_properties.exposure_factor == 0 || - mode->image_properties.line_length) + mode->image_properties.line_length == 0) return -EINVAL; - fine_integ_time_factor = priv->fine_integ_time * mode->control_properties.exposure_factor / mode->signal_properties.pixel_clock.val; @@ -762,7 +761,17 @@ static int imx219_remove(struct i2c_client *client) #endif { struct camera_common_data *s_data = to_camera_common_data(&client->dev); - struct imx219 *priv = (struct imx219 *)s_data->priv; + struct imx219 *priv; + + if (!s_data) { + dev_err(&client->dev, "camera common data is NULL\n"); +#if KERNEL_VERSION(6, 1, 0) > LINUX_VERSION_CODE + return -EINVAL; +#else + return; +#endif + } + priv = (struct imx219 *)s_data->priv; tegracam_v4l2subdev_unregister(priv->tc_dev); tegracam_device_unregister(priv->tc_dev); diff --git a/drivers/media/i2c/nv_imx477.c b/drivers/media/i2c/nv_imx477.c index 97cf0259..49f23ef3 100644 --- a/drivers/media/i2c/nv_imx477.c +++ b/drivers/media/i2c/nv_imx477.c @@ -787,7 +787,17 @@ static int imx477_remove(struct i2c_client *client) #endif { struct camera_common_data *s_data = to_camera_common_data(&client->dev); - struct imx477 *priv = (struct imx477 *)s_data->priv; + struct imx477 *priv; + + if (!s_data) { + dev_err(&client->dev, "camera common data is NULL\n"); +#if KERNEL_VERSION(6, 1, 0) > LINUX_VERSION_CODE + return -EINVAL; +#else + return; +#endif + } + priv = (struct imx477 *)s_data->priv; tegracam_v4l2subdev_unregister(priv->tc_dev); tegracam_device_unregister(priv->tc_dev);