qcdm: LOG_CONFIG fixups
Fix some buffer overruns. Log codes are also 16-bit not 32.
This commit is contained in:
@@ -1390,24 +1390,29 @@ qcdm_cmd_log_config_new (char *buf,
|
|||||||
size_t len,
|
size_t len,
|
||||||
u_int32_t op,
|
u_int32_t op,
|
||||||
u_int32_t equip_id,
|
u_int32_t equip_id,
|
||||||
u_int32_t items[])
|
u_int16_t items[])
|
||||||
{
|
{
|
||||||
DMCmdLogConfig *cmd;
|
DMCmdLogConfig *cmd;
|
||||||
u_int16_t highest = 0;
|
u_int16_t highest = 0;
|
||||||
u_int32_t items_len = 0;
|
u_int32_t items_len = 0;
|
||||||
size_t cmdsize = 0, cmdbufsize;
|
size_t cmdsize = 0, cmdbufsize;
|
||||||
u_int32_t i;
|
u_int32_t i;
|
||||||
u_int32_t log_code;
|
u_int16_t log_code;
|
||||||
|
|
||||||
qcdm_return_val_if_fail (buf != NULL, 0);
|
qcdm_return_val_if_fail (buf != NULL, 0);
|
||||||
qcdm_return_val_if_fail ((equip_id & 0xFFF0) == 0, 0);
|
qcdm_return_val_if_fail ((equip_id & 0xFFF0) == 0, 0);
|
||||||
|
|
||||||
/* Find number of log items */
|
/* Find number of log items */
|
||||||
if (items) {
|
if (items) {
|
||||||
while (items_len < 4095 && items[items_len])
|
while (items_len < 4095 && items[items_len]) {
|
||||||
|
/* Find highest log item so we can size the items mask */
|
||||||
|
log_code = items[items_len] & 0x0FFF;
|
||||||
|
if (log_code > highest)
|
||||||
|
highest = log_code;
|
||||||
items_len++;
|
items_len++;
|
||||||
}
|
}
|
||||||
cmdsize = sizeof (DMCmdLogConfig) + ((items_len + 7) / 8);
|
}
|
||||||
|
cmdsize = sizeof (DMCmdLogConfig) + ((highest + 7) / 8);
|
||||||
cmdbufsize = cmdsize + DIAG_TRAILER_LEN;
|
cmdbufsize = cmdsize + DIAG_TRAILER_LEN;
|
||||||
|
|
||||||
qcdm_return_val_if_fail (len >= cmdsize, 0);
|
qcdm_return_val_if_fail (len >= cmdsize, 0);
|
||||||
@@ -1422,8 +1427,6 @@ qcdm_cmd_log_config_new (char *buf,
|
|||||||
for (i = 0; i < items_len; i++) {
|
for (i = 0; i < items_len; i++) {
|
||||||
log_code = items[i] & 0x0FFF; /* Strip off equip ID */
|
log_code = items[i] & 0x0FFF; /* Strip off equip ID */
|
||||||
cmd->mask[log_code / 8] |= 1 << log_code % 8;
|
cmd->mask[log_code / 8] |= 1 << log_code % 8;
|
||||||
if (log_code > highest)
|
|
||||||
highest = log_code;
|
|
||||||
}
|
}
|
||||||
cmd->num_items = htole32 (highest);
|
cmd->num_items = htole32 (highest);
|
||||||
}
|
}
|
||||||
@@ -1546,10 +1549,10 @@ log_config_get_set_result (const char *buf, size_t len, u_int32_t op, int *out_e
|
|||||||
num_result_items++;
|
num_result_items++;
|
||||||
}
|
}
|
||||||
|
|
||||||
items = malloc (num_result_items);
|
items = malloc (sizeof (*items) * num_result_items);
|
||||||
for (i = 0; i < num_items; i++) {
|
for (i = 0; i < num_items; i++) {
|
||||||
if (LOG_CODE_SET (rsp->u.get_set_items.mask, i))
|
if (LOG_CODE_SET (rsp->u.get_set_items.mask, i))
|
||||||
items[count++] = (equipid << 12) | i;
|
items[count++] = (equipid << 12) | (i & 0x0FFF);
|
||||||
}
|
}
|
||||||
|
|
||||||
qcdm_result_add_u16_array (result, QCDM_CMD_LOG_CONFIG_MASK_ITEM_ITEMS, items, count);
|
qcdm_result_add_u16_array (result, QCDM_CMD_LOG_CONFIG_MASK_ITEM_ITEMS, items, count);
|
||||||
@@ -1569,7 +1572,7 @@ size_t
|
|||||||
qcdm_cmd_log_config_set_mask_new (char *buf,
|
qcdm_cmd_log_config_set_mask_new (char *buf,
|
||||||
size_t len,
|
size_t len,
|
||||||
u_int32_t equip_id,
|
u_int32_t equip_id,
|
||||||
u_int32_t items[])
|
u_int16_t items[])
|
||||||
{
|
{
|
||||||
return qcdm_cmd_log_config_new (buf,
|
return qcdm_cmd_log_config_new (buf,
|
||||||
len,
|
len,
|
||||||
|
@@ -506,7 +506,7 @@ size_t qcdm_cmd_log_config_get_mask_new (char *buf,
|
|||||||
size_t qcdm_cmd_log_config_set_mask_new (char *buf,
|
size_t qcdm_cmd_log_config_set_mask_new (char *buf,
|
||||||
size_t len,
|
size_t len,
|
||||||
u_int32_t equip_id,
|
u_int32_t equip_id,
|
||||||
u_int32_t items[]);
|
u_int16_t items[]);
|
||||||
|
|
||||||
#define QCDM_CMD_LOG_CONFIG_MASK_ITEM_EQUIP_ID "equip-id"
|
#define QCDM_CMD_LOG_CONFIG_MASK_ITEM_EQUIP_ID "equip-id"
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user