diff options
author | Inga Stotland <inga.stotland@intel.com> | 2019-10-20 14:29:49 -0700 |
---|---|---|
committer | Brian Gix <brian.gix@intel.com> | 2019-10-28 09:35:42 -0700 |
commit | bf6f4a28bb8f829620dd77051737f7a4719cc972 (patch) | |
tree | d66b885163edeed6d0b3a449dcd49d0cb4abcecf /mesh/mesh-config-json.c | |
parent | 2d249af381a664fd5a139ee4de6bfdf2f7c2e8cf (diff) | |
download | bluez-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.c | 67 |
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; |