Merge "diag: Add NULL pointer checks for mask info"
This commit is contained in:
commit
725d7669a0
1 changed files with 120 additions and 8 deletions
|
@ -555,6 +555,11 @@ static int diag_cmd_get_ssid_range(unsigned char *src_buf, int src_len,
|
||||||
mask_info);
|
mask_info);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
if (!mask_info->ptr) {
|
||||||
|
pr_err("diag: In %s, invalid input mask_info->ptr: %pK\n",
|
||||||
|
__func__, mask_info->ptr);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
if (!diag_apps_responds())
|
if (!diag_apps_responds())
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -656,7 +661,11 @@ static int diag_cmd_get_msg_mask(unsigned char *src_buf, int src_len,
|
||||||
mask_info);
|
mask_info);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
if (!mask_info->ptr) {
|
||||||
|
pr_err("diag: In %s, invalid input mask_info->ptr: %pK\n",
|
||||||
|
__func__, mask_info->ptr);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
if (!diag_apps_responds())
|
if (!diag_apps_responds())
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
@ -669,6 +678,12 @@ static int diag_cmd_get_msg_mask(unsigned char *src_buf, int src_len,
|
||||||
rsp.status = MSG_STATUS_FAIL;
|
rsp.status = MSG_STATUS_FAIL;
|
||||||
rsp.padding = 0;
|
rsp.padding = 0;
|
||||||
mask = (struct diag_msg_mask_t *)mask_info->ptr;
|
mask = (struct diag_msg_mask_t *)mask_info->ptr;
|
||||||
|
if (!mask->ptr) {
|
||||||
|
pr_err("diag: Invalid input in %s, mask->ptr: %pK\n",
|
||||||
|
__func__, mask->ptr);
|
||||||
|
mutex_unlock(&driver->msg_mask_lock);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
for (i = 0; i < driver->msg_mask_tbl_count; i++, mask++) {
|
for (i = 0; i < driver->msg_mask_tbl_count; i++, mask++) {
|
||||||
if ((req->ssid_first < mask->ssid_first) ||
|
if ((req->ssid_first < mask->ssid_first) ||
|
||||||
(req->ssid_first > mask->ssid_last_tools)) {
|
(req->ssid_first > mask->ssid_last_tools)) {
|
||||||
|
@ -714,11 +729,23 @@ static int diag_cmd_set_msg_mask(unsigned char *src_buf, int src_len,
|
||||||
mask_info);
|
mask_info);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
if (!mask_info->ptr) {
|
||||||
|
pr_err("diag: In %s, invalid input mask_info->ptr: %pK\n",
|
||||||
|
__func__, mask_info->ptr);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
req = (struct diag_msg_build_mask_t *)src_buf;
|
req = (struct diag_msg_build_mask_t *)src_buf;
|
||||||
mutex_lock(&mask_info->lock);
|
mutex_lock(&mask_info->lock);
|
||||||
mutex_lock(&driver->msg_mask_lock);
|
mutex_lock(&driver->msg_mask_lock);
|
||||||
mask = (struct diag_msg_mask_t *)mask_info->ptr;
|
mask = (struct diag_msg_mask_t *)mask_info->ptr;
|
||||||
|
if (!mask->ptr) {
|
||||||
|
pr_err("diag: Invalid input in %s, mask->ptr: %pK\n",
|
||||||
|
__func__, mask->ptr);
|
||||||
|
mutex_unlock(&driver->msg_mask_lock);
|
||||||
|
mutex_unlock(&mask_info->lock);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
for (i = 0; i < driver->msg_mask_tbl_count; i++, mask++) {
|
for (i = 0; i < driver->msg_mask_tbl_count; i++, mask++) {
|
||||||
if (i < (driver->msg_mask_tbl_count - 1)) {
|
if (i < (driver->msg_mask_tbl_count - 1)) {
|
||||||
mask_next = mask;
|
mask_next = mask;
|
||||||
|
@ -831,6 +858,11 @@ static int diag_cmd_set_all_msg_mask(unsigned char *src_buf, int src_len,
|
||||||
mask_info);
|
mask_info);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
if (!mask_info->ptr) {
|
||||||
|
pr_err("diag: In %s, invalid input mask_info->ptr: %pK\n",
|
||||||
|
__func__, mask_info->ptr);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
req = (struct diag_msg_config_rsp_t *)src_buf;
|
req = (struct diag_msg_config_rsp_t *)src_buf;
|
||||||
|
|
||||||
|
@ -838,6 +870,13 @@ static int diag_cmd_set_all_msg_mask(unsigned char *src_buf, int src_len,
|
||||||
mutex_lock(&driver->msg_mask_lock);
|
mutex_lock(&driver->msg_mask_lock);
|
||||||
|
|
||||||
mask = (struct diag_msg_mask_t *)mask_info->ptr;
|
mask = (struct diag_msg_mask_t *)mask_info->ptr;
|
||||||
|
if (!mask->ptr) {
|
||||||
|
pr_err("diag: Invalid input in %s, mask->ptr: %pK\n",
|
||||||
|
__func__, mask->ptr);
|
||||||
|
mutex_unlock(&driver->msg_mask_lock);
|
||||||
|
mutex_unlock(&mask_info->lock);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
mask_info->status = (req->rt_mask) ? DIAG_CTRL_MASK_ALL_ENABLED :
|
mask_info->status = (req->rt_mask) ? DIAG_CTRL_MASK_ALL_ENABLED :
|
||||||
DIAG_CTRL_MASK_ALL_DISABLED;
|
DIAG_CTRL_MASK_ALL_DISABLED;
|
||||||
for (i = 0; i < driver->msg_mask_tbl_count; i++, mask++) {
|
for (i = 0; i < driver->msg_mask_tbl_count; i++, mask++) {
|
||||||
|
@ -931,7 +970,11 @@ static int diag_cmd_update_event_mask(unsigned char *src_buf, int src_len,
|
||||||
mask_info);
|
mask_info);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
if (!mask_info->ptr) {
|
||||||
|
pr_err("diag: In %s, invalid input mask_info->ptr: %pK\n",
|
||||||
|
__func__, mask_info->ptr);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
req = (struct diag_event_mask_config_t *)src_buf;
|
req = (struct diag_event_mask_config_t *)src_buf;
|
||||||
mask_len = EVENT_COUNT_TO_BYTES(req->num_bits);
|
mask_len = EVENT_COUNT_TO_BYTES(req->num_bits);
|
||||||
if (mask_len <= 0 || mask_len > event_mask.mask_len) {
|
if (mask_len <= 0 || mask_len > event_mask.mask_len) {
|
||||||
|
@ -989,6 +1032,11 @@ static int diag_cmd_toggle_events(unsigned char *src_buf, int src_len,
|
||||||
mask_info);
|
mask_info);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
if (!mask_info->ptr) {
|
||||||
|
pr_err("diag: In %s, invalid input mask_info->ptr: %pK\n",
|
||||||
|
__func__, mask_info->ptr);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
toggle = *(src_buf + 1);
|
toggle = *(src_buf + 1);
|
||||||
mutex_lock(&mask_info->lock);
|
mutex_lock(&mask_info->lock);
|
||||||
|
@ -1046,6 +1094,11 @@ static int diag_cmd_get_log_mask(unsigned char *src_buf, int src_len,
|
||||||
mask_info);
|
mask_info);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
if (!mask_info->ptr) {
|
||||||
|
pr_err("diag: In %s, invalid input mask_info->ptr: %pK\n",
|
||||||
|
__func__, mask_info->ptr);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
if (!diag_apps_responds())
|
if (!diag_apps_responds())
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1065,6 +1118,11 @@ static int diag_cmd_get_log_mask(unsigned char *src_buf, int src_len,
|
||||||
write_len += rsp_header_len;
|
write_len += rsp_header_len;
|
||||||
|
|
||||||
log_item = (struct diag_log_mask_t *)mask_info->ptr;
|
log_item = (struct diag_log_mask_t *)mask_info->ptr;
|
||||||
|
if (!log_item->ptr) {
|
||||||
|
pr_err("diag: Invalid input in %s, mask: %pK\n",
|
||||||
|
__func__, log_item);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
for (i = 0; i < MAX_EQUIP_ID; i++, log_item++) {
|
for (i = 0; i < MAX_EQUIP_ID; i++, log_item++) {
|
||||||
if (log_item->equip_id != req->equip_id)
|
if (log_item->equip_id != req->equip_id)
|
||||||
continue;
|
continue;
|
||||||
|
@ -1172,11 +1230,20 @@ static int diag_cmd_set_log_mask(unsigned char *src_buf, int src_len,
|
||||||
mask_info);
|
mask_info);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
if (!mask_info->ptr) {
|
||||||
|
pr_err("diag: In %s, invalid input mask_info->ptr: %pK\n",
|
||||||
|
__func__, mask_info->ptr);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
req = (struct diag_log_config_req_t *)src_buf;
|
req = (struct diag_log_config_req_t *)src_buf;
|
||||||
read_len += req_header_len;
|
read_len += req_header_len;
|
||||||
mask = (struct diag_log_mask_t *)mask_info->ptr;
|
mask = (struct diag_log_mask_t *)mask_info->ptr;
|
||||||
|
if (!mask->ptr) {
|
||||||
|
pr_err("diag: Invalid input in %s, mask->ptr: %pK\n",
|
||||||
|
__func__, mask->ptr);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
if (req->equip_id >= MAX_EQUIP_ID) {
|
if (req->equip_id >= MAX_EQUIP_ID) {
|
||||||
pr_err("diag: In %s, Invalid logging mask request, equip_id: %d\n",
|
pr_err("diag: In %s, Invalid logging mask request, equip_id: %d\n",
|
||||||
__func__, req->equip_id);
|
__func__, req->equip_id);
|
||||||
|
@ -1294,9 +1361,17 @@ static int diag_cmd_disable_log_mask(unsigned char *src_buf, int src_len,
|
||||||
mask_info);
|
mask_info);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
if (!mask_info->ptr) {
|
||||||
|
pr_err("diag: In %s, invalid input mask_info->ptr: %pK\n",
|
||||||
|
__func__, mask_info->ptr);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
mask = (struct diag_log_mask_t *)mask_info->ptr;
|
mask = (struct diag_log_mask_t *)mask_info->ptr;
|
||||||
|
if (!mask->ptr) {
|
||||||
|
pr_err("diag: Invalid input in %s, mask->ptr: %pK\n",
|
||||||
|
__func__, mask->ptr);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
for (i = 0; i < MAX_EQUIP_ID; i++, mask++) {
|
for (i = 0; i < MAX_EQUIP_ID; i++, mask++) {
|
||||||
mutex_lock(&mask->lock);
|
mutex_lock(&mask->lock);
|
||||||
memset(mask->ptr, 0, mask->range);
|
memset(mask->ptr, 0, mask->range);
|
||||||
|
@ -1562,7 +1637,7 @@ static int __diag_mask_init(struct diag_mask_info *mask_info, int mask_len,
|
||||||
|
|
||||||
static void __diag_mask_exit(struct diag_mask_info *mask_info)
|
static void __diag_mask_exit(struct diag_mask_info *mask_info)
|
||||||
{
|
{
|
||||||
if (!mask_info)
|
if (!mask_info || !mask_info->ptr)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
mutex_lock(&mask_info->lock);
|
mutex_lock(&mask_info->lock);
|
||||||
|
@ -1619,11 +1694,17 @@ void diag_log_mask_free(struct diag_mask_info *mask_info)
|
||||||
int i;
|
int i;
|
||||||
struct diag_log_mask_t *mask = NULL;
|
struct diag_log_mask_t *mask = NULL;
|
||||||
|
|
||||||
if (!mask_info)
|
if (!mask_info || !mask_info->ptr)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
mutex_lock(&mask_info->lock);
|
mutex_lock(&mask_info->lock);
|
||||||
mask = (struct diag_log_mask_t *)mask_info->ptr;
|
mask = (struct diag_log_mask_t *)mask_info->ptr;
|
||||||
|
if (!mask->ptr) {
|
||||||
|
pr_err("diag: Invalid input in %s, mask->ptr: %pK\n",
|
||||||
|
__func__, mask->ptr);
|
||||||
|
mutex_unlock(&mask_info->lock);
|
||||||
|
return;
|
||||||
|
}
|
||||||
for (i = 0; i < MAX_EQUIP_ID; i++, mask++) {
|
for (i = 0; i < MAX_EQUIP_ID; i++, mask++) {
|
||||||
kfree(mask->ptr);
|
kfree(mask->ptr);
|
||||||
mask->ptr = NULL;
|
mask->ptr = NULL;
|
||||||
|
@ -1698,11 +1779,18 @@ void diag_msg_mask_free(struct diag_mask_info *mask_info)
|
||||||
int i;
|
int i;
|
||||||
struct diag_msg_mask_t *mask = NULL;
|
struct diag_msg_mask_t *mask = NULL;
|
||||||
|
|
||||||
if (!mask_info)
|
if (!mask_info || !mask_info->ptr)
|
||||||
return;
|
return;
|
||||||
mutex_lock(&mask_info->lock);
|
mutex_lock(&mask_info->lock);
|
||||||
mutex_lock(&driver->msg_mask_lock);
|
mutex_lock(&driver->msg_mask_lock);
|
||||||
mask = (struct diag_msg_mask_t *)mask_info->ptr;
|
mask = (struct diag_msg_mask_t *)mask_info->ptr;
|
||||||
|
if (!mask->ptr) {
|
||||||
|
pr_err("diag: Invalid input in %s, mask->ptr: %pK\n",
|
||||||
|
__func__, mask->ptr);
|
||||||
|
mutex_unlock(&driver->msg_mask_lock);
|
||||||
|
mutex_unlock(&mask_info->lock);
|
||||||
|
return;
|
||||||
|
}
|
||||||
for (i = 0; i < driver->msg_mask_tbl_count; i++, mask++) {
|
for (i = 0; i < driver->msg_mask_tbl_count; i++, mask++) {
|
||||||
kfree(mask->ptr);
|
kfree(mask->ptr);
|
||||||
mask->ptr = NULL;
|
mask->ptr = NULL;
|
||||||
|
@ -1869,6 +1957,11 @@ int diag_copy_to_user_msg_mask(char __user *buf, size_t count,
|
||||||
if (!mask_info)
|
if (!mask_info)
|
||||||
return -EIO;
|
return -EIO;
|
||||||
|
|
||||||
|
if (!mask_info->ptr || !mask_info->update_buf) {
|
||||||
|
pr_err("diag: In %s, invalid input mask_info->ptr: %pK, mask_info->update_buf: %pK\n",
|
||||||
|
__func__, mask_info->ptr, mask_info->update_buf);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
mutex_lock(&driver->diag_maskclear_mutex);
|
mutex_lock(&driver->diag_maskclear_mutex);
|
||||||
if (driver->mask_clear) {
|
if (driver->mask_clear) {
|
||||||
DIAG_LOG(DIAG_DEBUG_PERIPHERALS,
|
DIAG_LOG(DIAG_DEBUG_PERIPHERALS,
|
||||||
|
@ -1881,6 +1974,13 @@ int diag_copy_to_user_msg_mask(char __user *buf, size_t count,
|
||||||
mutex_lock(&driver->msg_mask_lock);
|
mutex_lock(&driver->msg_mask_lock);
|
||||||
|
|
||||||
mask = (struct diag_msg_mask_t *)(mask_info->ptr);
|
mask = (struct diag_msg_mask_t *)(mask_info->ptr);
|
||||||
|
if (!mask->ptr) {
|
||||||
|
pr_err("diag: Invalid input in %s, mask->ptr: %pK\n",
|
||||||
|
__func__, mask->ptr);
|
||||||
|
mutex_unlock(&driver->msg_mask_lock);
|
||||||
|
mutex_unlock(&mask_info->lock);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
for (i = 0; i < driver->msg_mask_tbl_count; i++, mask++) {
|
for (i = 0; i < driver->msg_mask_tbl_count; i++, mask++) {
|
||||||
ptr = mask_info->update_buf;
|
ptr = mask_info->update_buf;
|
||||||
len = 0;
|
len = 0;
|
||||||
|
@ -1941,8 +2041,20 @@ int diag_copy_to_user_log_mask(char __user *buf, size_t count,
|
||||||
if (!mask_info)
|
if (!mask_info)
|
||||||
return -EIO;
|
return -EIO;
|
||||||
|
|
||||||
|
if (!mask_info->ptr || !mask_info->update_buf) {
|
||||||
|
pr_err("diag: In %s, invalid input mask_info->ptr: %pK, mask_info->update_buf: %pK\n",
|
||||||
|
__func__, mask_info->ptr, mask_info->update_buf);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
mutex_lock(&mask_info->lock);
|
mutex_lock(&mask_info->lock);
|
||||||
mask = (struct diag_log_mask_t *)(mask_info->ptr);
|
mask = (struct diag_log_mask_t *)(mask_info->ptr);
|
||||||
|
if (!mask->ptr) {
|
||||||
|
pr_err("diag: Invalid input in %s, mask->ptr: %pK\n",
|
||||||
|
__func__, mask->ptr);
|
||||||
|
mutex_unlock(&mask_info->lock);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
for (i = 0; i < MAX_EQUIP_ID; i++, mask++) {
|
for (i = 0; i < MAX_EQUIP_ID; i++, mask++) {
|
||||||
ptr = mask_info->update_buf;
|
ptr = mask_info->update_buf;
|
||||||
len = 0;
|
len = 0;
|
||||||
|
|
Loading…
Add table
Reference in a new issue