|
@@ -1,7 +1,7 @@
|
|
// SPDX-License-Identifier: GPL-2.0-only
|
|
// SPDX-License-Identifier: GPL-2.0-only
|
|
/*
|
|
/*
|
|
* Copyright (c) 2017-2021, The Linux Foundation. All rights reserved.
|
|
* Copyright (c) 2017-2021, The Linux Foundation. All rights reserved.
|
|
- * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
|
|
|
|
|
|
+ * Copyright (c) 2022-2024 Qualcomm Innovation Center, Inc. All rights reserved.
|
|
*/
|
|
*/
|
|
|
|
|
|
#include <linux/kernel.h>
|
|
#include <linux/kernel.h>
|
|
@@ -1401,22 +1401,29 @@ int32_t cam_sensor_update_power_settings(void *cmd_buf,
|
|
int32_t i = 0, pwr_up = 0, pwr_down = 0;
|
|
int32_t i = 0, pwr_up = 0, pwr_down = 0;
|
|
struct cam_sensor_power_setting *pwr_settings;
|
|
struct cam_sensor_power_setting *pwr_settings;
|
|
void *ptr = cmd_buf, *scr;
|
|
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 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 ||
|
|
if (!pwr_cmd || !cmd_length || cmd_buf_len < (size_t)cmd_length ||
|
|
cam_sensor_validate(cmd_buf, cmd_buf_len)) {
|
|
cam_sensor_validate(cmd_buf, cmd_buf_len)) {
|
|
CAM_ERR(CAM_SENSOR_UTIL, "Invalid Args: pwr_cmd %pK, cmd_length: %d",
|
|
CAM_ERR(CAM_SENSOR_UTIL, "Invalid Args: pwr_cmd %pK, cmd_length: %d",
|
|
pwr_cmd, cmd_length);
|
|
pwr_cmd, cmd_length);
|
|
- return -EINVAL;
|
|
|
|
|
|
+ rc = -EINVAL;
|
|
|
|
+ goto free_power_command;
|
|
}
|
|
}
|
|
|
|
|
|
power_info->power_setting_size = 0;
|
|
power_info->power_setting_size = 0;
|
|
power_info->power_setting =
|
|
power_info->power_setting =
|
|
kzalloc(sizeof(struct cam_sensor_power_setting) *
|
|
kzalloc(sizeof(struct cam_sensor_power_setting) *
|
|
MAX_POWER_CONFIG, GFP_KERNEL);
|
|
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_size = 0;
|
|
power_info->power_down_setting =
|
|
power_info->power_down_setting =
|
|
@@ -1426,7 +1433,8 @@ int32_t cam_sensor_update_power_settings(void *cmd_buf,
|
|
kfree(power_info->power_setting);
|
|
kfree(power_info->power_setting);
|
|
power_info->power_setting = NULL;
|
|
power_info->power_setting = NULL;
|
|
power_info->power_setting_size = 0;
|
|
power_info->power_setting_size = 0;
|
|
- return -ENOMEM;
|
|
|
|
|
|
+ rc = -ENOMEM;
|
|
|
|
+ goto free_power_command;
|
|
}
|
|
}
|
|
|
|
|
|
while (tot_size < cmd_length) {
|
|
while (tot_size < cmd_length) {
|
|
@@ -1610,7 +1618,7 @@ int32_t cam_sensor_update_power_settings(void *cmd_buf,
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- return rc;
|
|
|
|
|
|
+ goto free_power_command;
|
|
free_power_settings:
|
|
free_power_settings:
|
|
kfree(power_info->power_down_setting);
|
|
kfree(power_info->power_down_setting);
|
|
kfree(power_info->power_setting);
|
|
kfree(power_info->power_setting);
|
|
@@ -1618,6 +1626,9 @@ free_power_settings:
|
|
power_info->power_setting = NULL;
|
|
power_info->power_setting = NULL;
|
|
power_info->power_down_setting_size = 0;
|
|
power_info->power_down_setting_size = 0;
|
|
power_info->power_setting_size = 0;
|
|
power_info->power_setting_size = 0;
|
|
|
|
+free_power_command:
|
|
|
|
+ kfree(pwr_cmd);
|
|
|
|
+ pwr_cmd = NULL;
|
|
return rc;
|
|
return rc;
|
|
}
|
|
}
|
|
|
|
|