qcdm: better checking of NV read/write command results

This commit is contained in:
Dan Williams
2010-03-20 02:28:01 -07:00
parent c4a1a78c43
commit 4006ca4dec

View File

@@ -107,17 +107,31 @@ check_command (const char *buf, gsize len, guint8 cmd, gsize min_len, GError **e
return FALSE;
}
/* NV read/write have a status byte at the end too */
if (cmd == DIAG_CMD_NV_READ || cmd == DIAG_CMD_NV_WRITE) {
DMCmdNVReadWrite *nvcmd = (DMCmdNVReadWrite *) buf;
return TRUE;
}
g_warn_if_fail (len >= sizeof (DMCmdNVReadWrite));
if (nvcmd->status != 0) {
static gboolean
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,
"The NV operation failed (status 0x%X).",
GUINT16_FROM_LE (nvcmd->status));
GUINT16_FROM_LE (cmd->status));
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;
@@ -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))
return NULL;
if (!check_nv_cmd (rsp, DIAG_NV_DIR_NUMBER, error))
return NULL;
mdn = (DMNVItemMdn *) &rsp->data[0];
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))
return NULL;
if (!check_nv_cmd (rsp, DIAG_NV_ROAM_PREF, error))
return NULL;
roam = (DMNVItemRoamPref *) &rsp->data[0];
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))
return NULL;
if (!check_nv_cmd ((DMCmdNVReadWrite *) buf, DIAG_NV_ROAM_PREF, error))
return NULL;
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))
return NULL;
if (!check_nv_cmd (rsp, DIAG_NV_MODE_PREF, error))
return NULL;
mode = (DMNVItemModePref *) &rsp->data[0];
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))
return NULL;
if (!check_nv_cmd ((DMCmdNVReadWrite *) buf, DIAG_NV_MODE_PREF, error))
return NULL;
return qcdm_result_new ();
}