summaryrefslogtreecommitdiff
path: root/mesh/mesh-config-json.c
diff options
context:
space:
mode:
authorInga Stotland <inga.stotland@intel.com>2019-10-20 14:29:49 -0700
committerBrian Gix <brian.gix@intel.com>2019-10-28 09:35:42 -0700
commitbf6f4a28bb8f829620dd77051737f7a4719cc972 (patch)
treed66b885163edeed6d0b3a449dcd49d0cb4abcecf /mesh/mesh-config-json.c
parent2d249af381a664fd5a139ee4de6bfdf2f7c2e8cf (diff)
downloadbluez-bf6f4a28bb8f829620dd77051737f7a4719cc972.tar.gz
mesh: Fix reading/writing key indices
This fixes inconsistency when reading/writing NetKey and AppKey indices to/from JSON config storage: - when writing, convert an integer to hex string - when reading, convert hex string to uint16 integer
Diffstat (limited to 'mesh/mesh-config-json.c')
-rw-r--r--mesh/mesh-config-json.c67
1 files changed, 40 insertions, 27 deletions
diff --git a/mesh/mesh-config-json.c b/mesh/mesh-config-json.c
index a8c94fcdd..b2cff6824 100644
--- a/mesh/mesh-config-json.c
+++ b/mesh/mesh-config-json.c
@@ -46,7 +46,7 @@
#define MIN_SEQ_CACHE_VALUE (2 * 32)
#define MIN_SEQ_CACHE_TIME (5 * 60)
-#define CHECK_KEY_IDX_RANGE(x) (((x) >= 0) && ((x) <= 4095))
+#define CHECK_KEY_IDX_RANGE(x) ((x) <= 4095)
struct mesh_config {
json_object *jnode;
@@ -264,13 +264,16 @@ static json_object *get_key_object(json_object *jarray, uint16_t idx)
for (i = 0; i < sz; ++i) {
json_object *jentry, *jvalue;
- uint32_t jidx;
+ const char *str;
+ uint16_t jidx;
jentry = json_object_array_get_idx(jarray, i);
if (!json_object_object_get_ex(jentry, "index", &jvalue))
return NULL;
- jidx = json_object_get_int(jvalue);
+ str = json_object_get_string(jvalue);
+ if (sscanf(str, "%04hx", &jidx) != 1)
+ return NULL;
if (jidx == idx)
return jentry;
@@ -279,6 +282,28 @@ static json_object *get_key_object(json_object *jarray, uint16_t idx)
return NULL;
}
+static bool get_key_index(json_object *jobj, const char *keyword,
+ uint16_t *index)
+{
+ uint16_t idx;
+ json_object *jvalue;
+ const char *str;
+
+ if (!json_object_object_get_ex(jobj, keyword, &jvalue))
+ return false;
+
+ str = json_object_get_string(jvalue);
+
+ if (sscanf(str, "%04hx", &idx) != 1)
+ return false;
+
+ if (!CHECK_KEY_IDX_RANGE(idx))
+ return false;
+
+ *index = (uint16_t) idx;
+ return true;
+}
+
static json_object *jarray_key_del(json_object *jarray, int16_t idx)
{
json_object *jarray_new;
@@ -289,16 +314,13 @@ static json_object *jarray_key_del(json_object *jarray, int16_t idx)
return NULL;
for (i = 0; i < sz; ++i) {
- json_object *jentry, *jvalue;
+ json_object *jentry;
+ uint16_t nidx;
jentry = json_object_array_get_idx(jarray, i);
- if (json_object_object_get_ex(jentry, "index", &jvalue)) {
- int tmp = json_object_get_int(jvalue);
-
- if (tmp == idx)
- continue;
- }
+ if (get_key_index(jentry, "index", &nidx) && nidx == idx)
+ continue;
json_object_get(jentry);
json_object_array_add(jarray_new, jentry);
@@ -420,21 +442,6 @@ static bool read_device_key(json_object *jobj, uint8_t key_buf[16])
return true;
}
-static bool get_key_index(json_object *jobj, const char *keyword,
- uint16_t *index)
-{
- int idx;
-
- if (!get_int(jobj, keyword, &idx))
- return false;
-
- if (!CHECK_KEY_IDX_RANGE(idx))
- return false;
-
- *index = (uint16_t) idx;
- return true;
-}
-
static bool read_app_keys(json_object *jobj, struct mesh_config_node *node)
{
json_object *jarray;
@@ -571,6 +578,7 @@ bool mesh_config_net_key_add(struct mesh_config *cfg, uint16_t idx,
jnode = cfg->jnode;
+ l_debug("netKey %4.4x", idx);
json_object_object_get_ex(jnode, "netKeys", &jarray);
if (jarray)
jentry = get_key_object(jarray, idx);
@@ -966,14 +974,19 @@ static bool parse_bindings(json_object *jarray, struct mesh_config_model *mod)
mod->bindings = l_new(uint16_t, cnt);
for (i = 0; i < cnt; ++i) {
- int idx;
+ uint16_t idx;
+ const char *str;
json_object *jvalue;
jvalue = json_object_array_get_idx(jarray, i);
if (!jvalue)
return false;
- idx = json_object_get_int(jvalue);
+ str = json_object_get_string(jvalue);
+
+ if (sscanf(str, "%04hx", &idx) != 1)
+ return false;
+
if (!CHECK_KEY_IDX_RANGE(idx))
return false;