Merge tag 'LA.UM.9.15.2.r1-09500-KAMORTA.QSSI14.0' of https://git.codelinaro.org/clo/la/platform/vendor/opensource/camera-kernel into android13-4.19-kona

"LA.UM.9.15.2.r1-09500-KAMORTA.QSSI14.0"

* tag 'LA.UM.9.15.2.r1-09500-KAMORTA.QSSI14.0' of https://git.codelinaro.org/clo/la/platform/vendor/opensource/camera-kernel:
  msm: camera: sensor: Proper handling of race condition in util api

Change-Id: Ic4e59c08cd32cc5a1083a5f8073cc48509ca9edc
This commit is contained in:
Michael Bestas
2024-03-23 01:13:20 +02:00

View File

@@ -1,7 +1,7 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
* Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
* Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
* Copyright (c) 2023-2024 Qualcomm Innovation Center, Inc. All rights reserved.
*/
#include <linux/kernel.h>
@@ -1158,22 +1158,29 @@ int32_t cam_sensor_update_power_settings(void *cmd_buf,
int32_t i = 0, pwr_up = 0, pwr_down = 0;
struct cam_sensor_power_setting *pwr_settings;
void *ptr = cmd_buf, *scr;
struct cam_cmd_power *pwr_cmd = (struct cam_cmd_power *)cmd_buf;
struct common_header *cmm_hdr = (struct common_header *)cmd_buf;
struct cam_cmd_power *pwr_cmd =
kzalloc(sizeof(struct cam_cmd_power), GFP_KERNEL);
if (!pwr_cmd)
return -ENOMEM;
memcpy(pwr_cmd, cmd_buf, sizeof(struct cam_cmd_power));
if (!pwr_cmd || !cmd_length || cmd_buf_len < (size_t)cmd_length ||
cam_sensor_validate(cmd_buf, cmd_buf_len)) {
CAM_ERR(CAM_SENSOR, "Invalid Args: pwr_cmd %pK, cmd_length: %d",
pwr_cmd, cmd_length);
return -EINVAL;
rc = -EINVAL;
goto free_power_command;
}
power_info->power_setting_size = 0;
power_info->power_setting =
kzalloc(sizeof(struct cam_sensor_power_setting) *
MAX_POWER_CONFIG, GFP_KERNEL);
if (!power_info->power_setting)
return -ENOMEM;
if (!power_info->power_setting) {
rc = -ENOMEM;
goto free_power_command;
}
power_info->power_down_setting_size = 0;
power_info->power_down_setting =
@@ -1183,7 +1190,8 @@ int32_t cam_sensor_update_power_settings(void *cmd_buf,
kfree(power_info->power_setting);
power_info->power_setting = NULL;
power_info->power_setting_size = 0;
return -ENOMEM;
rc = -ENOMEM;
goto free_power_command;
}
while (tot_size < cmd_length) {
@@ -1367,7 +1375,7 @@ int32_t cam_sensor_update_power_settings(void *cmd_buf,
}
}
return rc;
goto free_power_command;
free_power_settings:
kfree(power_info->power_down_setting);
kfree(power_info->power_setting);
@@ -1375,6 +1383,9 @@ int32_t cam_sensor_update_power_settings(void *cmd_buf,
power_info->power_setting = NULL;
power_info->power_down_setting_size = 0;
power_info->power_setting_size = 0;
free_power_command:
kfree(pwr_cmd);
pwr_cmd = NULL;
return rc;
}