qcdm: better checking of NV read/write command results
This commit is contained in:
@@ -107,17 +107,31 @@ check_command (const char *buf, gsize len, guint8 cmd, gsize min_len, GError **e
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* NV read/write have a status byte at the end too */
|
return TRUE;
|
||||||
if (cmd == DIAG_CMD_NV_READ || cmd == DIAG_CMD_NV_WRITE) {
|
}
|
||||||
DMCmdNVReadWrite *nvcmd = (DMCmdNVReadWrite *) buf;
|
|
||||||
|
|
||||||
g_warn_if_fail (len >= sizeof (DMCmdNVReadWrite));
|
static gboolean
|
||||||
if (nvcmd->status != 0) {
|
check_nv_cmd (DMCmdNVReadWrite *cmd, guint16 nv_item, GError **error)
|
||||||
|
{
|
||||||
|
guint16 cmd_item;
|
||||||
|
|
||||||
|
g_return_val_if_fail (cmd != NULL, FALSE);
|
||||||
|
g_return_val_if_fail ((cmd->code == DIAG_CMD_NV_READ) || (cmd->code == DIAG_CMD_NV_WRITE), FALSE);
|
||||||
|
|
||||||
|
/* NV read/write have a status byte at the end */
|
||||||
|
if (cmd->status != 0) {
|
||||||
g_set_error (error, QCDM_COMMAND_ERROR, QCDM_COMMAND_NVCMD_FAILED,
|
g_set_error (error, QCDM_COMMAND_ERROR, QCDM_COMMAND_NVCMD_FAILED,
|
||||||
"The NV operation failed (status 0x%X).",
|
"The NV operation failed (status 0x%X).",
|
||||||
GUINT16_FROM_LE (nvcmd->status));
|
GUINT16_FROM_LE (cmd->status));
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cmd_item = GUINT16_FROM_LE (cmd->nv_item);
|
||||||
|
if (cmd_item != nv_item) {
|
||||||
|
g_set_error (error, QCDM_COMMAND_ERROR, QCDM_COMMAND_UNEXPECTED,
|
||||||
|
"Unexpected DM NV command response (expected item %d, got "
|
||||||
|
"item %d)", nv_item, cmd_item);
|
||||||
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
@@ -381,6 +395,9 @@ qcdm_cmd_nv_get_mdn_result (const char *buf, gsize len, GError **error)
|
|||||||
if (!check_command (buf, len, DIAG_CMD_NV_READ, sizeof (DMCmdNVReadWrite), error))
|
if (!check_command (buf, len, DIAG_CMD_NV_READ, sizeof (DMCmdNVReadWrite), error))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
if (!check_nv_cmd (rsp, DIAG_NV_DIR_NUMBER, error))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
mdn = (DMNVItemMdn *) &rsp->data[0];
|
mdn = (DMNVItemMdn *) &rsp->data[0];
|
||||||
|
|
||||||
result = qcdm_result_new ();
|
result = qcdm_result_new ();
|
||||||
@@ -439,6 +456,9 @@ qcdm_cmd_nv_get_roam_pref_result (const char *buf, gsize len, GError **error)
|
|||||||
if (!check_command (buf, len, DIAG_CMD_NV_READ, sizeof (DMCmdNVReadWrite), error))
|
if (!check_command (buf, len, DIAG_CMD_NV_READ, sizeof (DMCmdNVReadWrite), error))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
if (!check_nv_cmd (rsp, DIAG_NV_ROAM_PREF, error))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
roam = (DMNVItemRoamPref *) &rsp->data[0];
|
roam = (DMNVItemRoamPref *) &rsp->data[0];
|
||||||
|
|
||||||
if (!roam_pref_validate (roam->roam_pref)) {
|
if (!roam_pref_validate (roam->roam_pref)) {
|
||||||
@@ -494,6 +514,9 @@ qcdm_cmd_nv_set_roam_pref_result (const char *buf, gsize len, GError **error)
|
|||||||
if (!check_command (buf, len, DIAG_CMD_NV_WRITE, sizeof (DMCmdNVReadWrite), error))
|
if (!check_command (buf, len, DIAG_CMD_NV_WRITE, sizeof (DMCmdNVReadWrite), error))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
if (!check_nv_cmd ((DMCmdNVReadWrite *) buf, DIAG_NV_ROAM_PREF, error))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
return qcdm_result_new ();
|
return qcdm_result_new ();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -541,6 +564,9 @@ qcdm_cmd_nv_get_mode_pref_result (const char *buf, gsize len, GError **error)
|
|||||||
if (!check_command (buf, len, DIAG_CMD_NV_READ, sizeof (DMCmdNVReadWrite), error))
|
if (!check_command (buf, len, DIAG_CMD_NV_READ, sizeof (DMCmdNVReadWrite), error))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
if (!check_nv_cmd (rsp, DIAG_NV_MODE_PREF, error))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
mode = (DMNVItemModePref *) &rsp->data[0];
|
mode = (DMNVItemModePref *) &rsp->data[0];
|
||||||
|
|
||||||
if (!mode_pref_validate (mode->mode_pref)) {
|
if (!mode_pref_validate (mode->mode_pref)) {
|
||||||
@@ -596,6 +622,9 @@ qcdm_cmd_nv_set_mode_pref_result (const char *buf, gsize len, GError **error)
|
|||||||
if (!check_command (buf, len, DIAG_CMD_NV_WRITE, sizeof (DMCmdNVReadWrite), error))
|
if (!check_command (buf, len, DIAG_CMD_NV_WRITE, sizeof (DMCmdNVReadWrite), error))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
if (!check_nv_cmd ((DMCmdNVReadWrite *) buf, DIAG_NV_MODE_PREF, error))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
return qcdm_result_new ();
|
return qcdm_result_new ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user