aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libqcdm/src/commands.c51
1 files changed, 40 insertions, 11 deletions
diff --git a/libqcdm/src/commands.c b/libqcdm/src/commands.c
index 24ba3e51..58aa4906 100644
--- a/libqcdm/src/commands.c
+++ b/libqcdm/src/commands.c
@@ -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;
-
- g_warn_if_fail (len >= sizeof (DMCmdNVReadWrite));
- if (nvcmd->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));
- return FALSE;
- }
+ return TRUE;
+}
+
+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 (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 ();
}