Message ID | 20201106071053.122820-1-inga.stotland@intel.com |
---|---|
State | New |
Headers | show |
Series | [BlueZ] mesh: Fix errors found by static analysis | expand |
This is automated email and please do not reply to this email! Dear submitter, Thank you for submitting the patches to the linux bluetooth mailing list. This is a CI test results with your patch series: PW Link:https://patchwork.kernel.org/project/bluetooth/list/?series=378771 ---Test result--- ############################## Test: CheckPatch - PASS ############################## Test: CheckGitLint - PASS ############################## Test: CheckBuild - PASS ############################## Test: MakeCheck - PASS --- Regards, Linux Bluetooth
Applied On Thu, 2020-11-05 at 23:10 -0800, Inga Stotland wrote: > This fixes a NULL pointer dereference error (cfgmod-server.c) > and miscellaneous issues related to unchecked return status. > --- > mesh/agent.c | 43 ++++++++++++++++++++++++++++--------------- > mesh/appkey.c | 6 +++--- > mesh/cfgmod-server.c | 12 +++--------- > mesh/keyring.c | 38 ++++++++++++++++++++++++-------------- > 4 files changed, 58 insertions(+), 41 deletions(-) > > diff --git a/mesh/agent.c b/mesh/agent.c > index b0d523d16..5058d0d8d 100644 > --- a/mesh/agent.c > +++ b/mesh/agent.c > @@ -95,7 +95,7 @@ static bool simple_match(const void *a, const void *b) > return a == b; > } > > -static void parse_prov_caps(struct mesh_agent_prov_caps *caps, > +static bool parse_prov_caps(struct mesh_agent_prov_caps *caps, > struct l_dbus_message_iter *property) > { > struct l_dbus_message_iter iter_caps; > @@ -103,7 +103,7 @@ static void parse_prov_caps(struct mesh_agent_prov_caps *caps, > uint32_t i; > > if (!l_dbus_message_iter_get_variant(property, "as", &iter_caps)) > - return; > + return false; > > while (l_dbus_message_iter_next_entry(&iter_caps, &str)) { > for (i = 0; i < L_ARRAY_SIZE(cap_table); i++) { > @@ -129,9 +129,10 @@ static void parse_prov_caps(struct mesh_agent_prov_caps *caps, > caps->static_type = 1; > } > > + return true; > } > > -static void parse_oob_info(struct mesh_agent_prov_caps *caps, > +static bool parse_oob_info(struct mesh_agent_prov_caps *caps, > struct l_dbus_message_iter *property) > { > struct l_dbus_message_iter iter_oob; > @@ -139,7 +140,7 @@ static void parse_oob_info(struct mesh_agent_prov_caps *caps, > const char *str; > > if (!l_dbus_message_iter_get_variant(property, "as", &iter_oob)) > - return; > + return false; > > while (l_dbus_message_iter_next_entry(&iter_oob, &str)) { > for (i = 0; i < L_ARRAY_SIZE(oob_table); i++) { > @@ -148,9 +149,11 @@ static void parse_oob_info(struct mesh_agent_prov_caps *caps, > caps->oob_info |= oob_table[i].mask; > } > } > + > + return true; > } > > -static void parse_properties(struct mesh_agent *agent, > +static bool parse_properties(struct mesh_agent *agent, > struct l_dbus_message_iter *properties) > { > const char *key, *uri_string; > @@ -160,15 +163,20 @@ static void parse_properties(struct mesh_agent *agent, > > while (l_dbus_message_iter_next_entry(properties, &key, &variant)) { > if (!strcmp(key, "Capabilities")) { > - parse_prov_caps(&agent->caps, &variant); > + if (!parse_prov_caps(&agent->caps, &variant)) > + return false; > } else if (!strcmp(key, "URI")) { > - l_dbus_message_iter_get_variant(&variant, "s", > - &uri_string); > + if (!l_dbus_message_iter_get_variant(&variant, "s", > + &uri_string)) > + return false; > /* TODO: compute hash */ > } else if (!strcmp(key, "OutOfBandInfo")) { > - parse_oob_info(&agent->caps, &variant); > + if (!parse_oob_info(&agent->caps, &variant)) > + return false; > } > } > + > + return true; > } > > static void agent_free(void *agent_data) > @@ -253,7 +261,10 @@ struct mesh_agent *mesh_agent_create(const char *path, const char *owner, > agent->owner = l_strdup(owner); > agent->path = l_strdup(path); > > - parse_properties(agent, properties); > + if (!parse_properties(agent, properties)) { > + l_free(agent); > + return NULL; > + } > > l_queue_push_tail(agents, agent); > > @@ -312,15 +323,17 @@ static void properties_reply(struct l_dbus_message *reply, void *user_data) > err = get_reply_error(reply); > > if (err != MESH_ERROR_NONE) > - goto fail; > + goto done; > > if (!l_dbus_message_get_arguments(reply, "a{sv}", &properties)) { > err = MESH_ERROR_FAILED; > - goto fail; > + goto done; > } > > - parse_properties(agent, &properties); > -fail: > + if (!parse_properties(agent, &properties)) > + err = MESH_ERROR_FAILED; > + > +done: > if (req->cb) { > cb = req->cb; > cb(req->user_data, err); > @@ -425,7 +438,7 @@ static void key_reply(struct l_dbus_message *reply, void *user_data) > mesh_agent_key_cb_t cb; > struct l_dbus_message_iter iter_array; > uint32_t n = 0, expected_len = 0; > - uint8_t *buf; > + uint8_t *buf = NULL; > int err; > > if (!l_queue_find(agents, simple_match, agent) || !agent->req) > diff --git a/mesh/appkey.c b/mesh/appkey.c > index 7efb8f5c4..549f5a80d 100644 > --- a/mesh/appkey.c > +++ b/mesh/appkey.c > @@ -100,11 +100,11 @@ bool appkey_key_init(struct mesh_net *net, uint16_t net_idx, uint16_t app_idx, > if (!app_keys) > return NULL; > > - key = app_key_new(); > - if (!key) > + if (!mesh_net_have_key(net, net_idx)) > return false; > > - if (!mesh_net_have_key(net, net_idx)) > + key = app_key_new(); > + if (!key) > return false; > > key->net_idx = net_idx; > diff --git a/mesh/cfgmod-server.c b/mesh/cfgmod-server.c > index 0009a1bee..5eefedc4d 100644 > --- a/mesh/cfgmod-server.c > +++ b/mesh/cfgmod-server.c > @@ -80,13 +80,12 @@ static uint16_t config_pub_get(struct mesh_node *node, const uint8_t *pkt, > > pub = mesh_model_pub_get(node, ele_addr, id, &status); > > - rtx = pub->rtx.cnt + (((pub->rtx.interval / 50) - 1) << 3); > - > - if (pub && status == MESH_STATUS_SUCCESS) > + if (pub && status == MESH_STATUS_SUCCESS) { > + rtx = pub->rtx.cnt + (((pub->rtx.interval / 50) - 1) << 3); > return set_pub_status(status, ele_addr, id, pub->addr, pub->idx, > pub->credential, pub->ttl, pub->period, > rtx); > - else > + } else > return set_pub_status(status, ele_addr, id, 0, 0, 0, 0, 0, 0); > } > > @@ -592,12 +591,7 @@ static uint16_t cfg_appkey_msg(struct mesh_node *node, const uint8_t *pkt, > struct mesh_net *net = node_get_net(node); > > n_idx = l_get_le16(pkt) & 0xfff; > - if (n_idx > NET_IDX_MAX) > - return 0; > - > a_idx = l_get_le16(pkt + 1) >> 4; > - if (a_idx > APP_IDX_MAX) > - return 0; > > n = mesh_model_opcode_set(OP_APPKEY_STATUS, msg); > > diff --git a/mesh/keyring.c b/mesh/keyring.c > index bbe501063..1ef4fc3ef 100644 > --- a/mesh/keyring.c > +++ b/mesh/keyring.c > @@ -50,18 +50,22 @@ bool keyring_put_net_key(struct mesh_node *node, uint16_t net_idx, > return false; > > snprintf(key_file, PATH_MAX, "%s%s", node_path, net_key_dir); > - mkdir(key_file, 0755); > + > + if (!mkdir(key_file, 0755)) > + return false; > + > snprintf(key_file, PATH_MAX, "%s%s/%3.3x", node_path, net_key_dir, > net_idx); > l_debug("Put Net Key %s", key_file); > > fd = open(key_file, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR); > - if (fd >= 0) { > - if (write(fd, key, sizeof(*key)) == sizeof(*key)) > - result = true; > + if (fd < 0) > + return false; > > - close(fd); > - } > + if (write(fd, key, sizeof(*key)) == sizeof(*key)) > + result = true; > + > + close(fd); > > return result; > } > @@ -83,7 +87,10 @@ bool keyring_put_app_key(struct mesh_node *node, uint16_t app_idx, > return false; > > snprintf(key_file, PATH_MAX, "%s%s", node_path, app_key_dir); > - mkdir(key_file, 0755); > + > + if (!mkdir(key_file, 0755)) > + return false; > + > snprintf(key_file, PATH_MAX, "%s%s/%3.3x", node_path, app_key_dir, > app_idx); > l_debug("Put App Key %s", key_file); > @@ -100,16 +107,17 @@ bool keyring_put_app_key(struct mesh_node *node, uint16_t app_idx, > } > > lseek(fd, 0, SEEK_SET); > - } else > + } else { > fd = open(key_file, O_WRONLY | O_CREAT | O_TRUNC, > S_IRUSR | S_IWUSR); > + if (fd < 0) > + return false; > + } > > - if (fd >= 0) { > - if (write(fd, key, sizeof(*key)) == sizeof(*key)) > - result = true; > + if (write(fd, key, sizeof(*key)) == sizeof(*key)) > + result = true; > > - close(fd); > - } > + close(fd); > > return result; > } > @@ -198,7 +206,9 @@ bool keyring_put_remote_dev_key(struct mesh_node *node, uint16_t unicast, > return false; > > snprintf(key_file, PATH_MAX, "%s%s", node_path, dev_key_dir); > - mkdir(key_file, 0755); > + > + if (!mkdir(key_file, 0755)) > + return false; > > for (i = 0; i < count; i++) { > snprintf(key_file, PATH_MAX, "%s%s/%4.4x", node_path,
Hi Inga, The changes to mesh/keyring.c break create network for me. I think the mkdir tests should be if (!!mkdir(key_file, 0755)) not if (!mkdir(key_file, 0755)) With that change, I can create networks again. Steve On Tue, 2020-11-10 at 18:27 +0000, Gix, Brian wrote: > Applied > > On Thu, 2020-11-05 at 23:10 -0800, Inga Stotland wrote: > > This fixes a NULL pointer dereference error (cfgmod-server.c) > > and miscellaneous issues related to unchecked return status. > > --- > > mesh/agent.c | 43 ++++++++++++++++++++++++++++------------ > > --- > > mesh/appkey.c | 6 +++--- > > mesh/cfgmod-server.c | 12 +++--------- > > mesh/keyring.c | 38 ++++++++++++++++++++++++-------------- > > 4 files changed, 58 insertions(+), 41 deletions(-) > > > > diff --git a/mesh/agent.c b/mesh/agent.c > > index b0d523d16..5058d0d8d 100644 > > --- a/mesh/agent.c > > +++ b/mesh/agent.c > > @@ -95,7 +95,7 @@ static bool simple_match(const void *a, const > > void *b) > > return a == b; > > } > > > > -static void parse_prov_caps(struct mesh_agent_prov_caps *caps, > > +static bool parse_prov_caps(struct mesh_agent_prov_caps *caps, > > struct l_dbus_message_iter > > *property) > > { > > struct l_dbus_message_iter iter_caps; > > @@ -103,7 +103,7 @@ static void parse_prov_caps(struct > > mesh_agent_prov_caps *caps, > > uint32_t i; > > > > if (!l_dbus_message_iter_get_variant(property, "as", > > &iter_caps)) > > - return; > > + return false; > > > > while (l_dbus_message_iter_next_entry(&iter_caps, &str)) { > > for (i = 0; i < L_ARRAY_SIZE(cap_table); i++) { > > @@ -129,9 +129,10 @@ static void parse_prov_caps(struct > > mesh_agent_prov_caps *caps, > > caps->static_type = 1; > > } > > > > + return true; > > } > > > > -static void parse_oob_info(struct mesh_agent_prov_caps *caps, > > +static bool parse_oob_info(struct mesh_agent_prov_caps *caps, > > struct l_dbus_message_iter > > *property) > > { > > struct l_dbus_message_iter iter_oob; > > @@ -139,7 +140,7 @@ static void parse_oob_info(struct > > mesh_agent_prov_caps *caps, > > const char *str; > > > > if (!l_dbus_message_iter_get_variant(property, "as", > > &iter_oob)) > > - return; > > + return false; > > > > while (l_dbus_message_iter_next_entry(&iter_oob, &str)) { > > for (i = 0; i < L_ARRAY_SIZE(oob_table); i++) { > > @@ -148,9 +149,11 @@ static void parse_oob_info(struct > > mesh_agent_prov_caps *caps, > > caps->oob_info |= oob_table[i].mask; > > } > > } > > + > > + return true; > > } > > > > -static void parse_properties(struct mesh_agent *agent, > > +static bool parse_properties(struct mesh_agent *agent, > > struct l_dbus_message_iter > > *properties) > > { > > const char *key, *uri_string; > > @@ -160,15 +163,20 @@ static void parse_properties(struct > > mesh_agent *agent, > > > > while (l_dbus_message_iter_next_entry(properties, &key, > > &variant)) { > > if (!strcmp(key, "Capabilities")) { > > - parse_prov_caps(&agent->caps, &variant); > > + if (!parse_prov_caps(&agent->caps, > > &variant)) > > + return false; > > } else if (!strcmp(key, "URI")) { > > - l_dbus_message_iter_get_variant(&variant, > > "s", > > - > > &uri_ > > string); > > + if > > (!l_dbus_message_iter_get_variant(&variant, "s", > > + &ur > > i_string)) > > + return false; > > /* TODO: compute hash */ > > } else if (!strcmp(key, "OutOfBandInfo")) { > > - parse_oob_info(&agent->caps, &variant); > > + if (!parse_oob_info(&agent->caps, > > &variant)) > > + return false; > > } > > } > > + > > + return true; > > } > > > > static void agent_free(void *agent_data) > > @@ -253,7 +261,10 @@ struct mesh_agent *mesh_agent_create(const > > char *path, const char *owner, > > agent->owner = l_strdup(owner); > > agent->path = l_strdup(path); > > > > - parse_properties(agent, properties); > > + if (!parse_properties(agent, properties)) { > > + l_free(agent); > > + return NULL; > > + } > > > > l_queue_push_tail(agents, agent); > > > > @@ -312,15 +323,17 @@ static void properties_reply(struct > > l_dbus_message *reply, void *user_data) > > err = get_reply_error(reply); > > > > if (err != MESH_ERROR_NONE) > > - goto fail; > > + goto done; > > > > if (!l_dbus_message_get_arguments(reply, "a{sv}", > > &properties)) { > > err = MESH_ERROR_FAILED; > > - goto fail; > > + goto done; > > } > > > > - parse_properties(agent, &properties); > > -fail: > > + if (!parse_properties(agent, &properties)) > > + err = MESH_ERROR_FAILED; > > + > > +done: > > if (req->cb) { > > cb = req->cb; > > cb(req->user_data, err); > > @@ -425,7 +438,7 @@ static void key_reply(struct l_dbus_message > > *reply, void *user_data) > > mesh_agent_key_cb_t cb; > > struct l_dbus_message_iter iter_array; > > uint32_t n = 0, expected_len = 0; > > - uint8_t *buf; > > + uint8_t *buf = NULL; > > int err; > > > > if (!l_queue_find(agents, simple_match, agent) || !agent- > > >req) > > diff --git a/mesh/appkey.c b/mesh/appkey.c > > index 7efb8f5c4..549f5a80d 100644 > > --- a/mesh/appkey.c > > +++ b/mesh/appkey.c > > @@ -100,11 +100,11 @@ bool appkey_key_init(struct mesh_net *net, > > uint16_t net_idx, uint16_t app_idx, > > if (!app_keys) > > return NULL; > > > > - key = app_key_new(); > > - if (!key) > > + if (!mesh_net_have_key(net, net_idx)) > > return false; > > > > - if (!mesh_net_have_key(net, net_idx)) > > + key = app_key_new(); > > + if (!key) > > return false; > > > > key->net_idx = net_idx; > > diff --git a/mesh/cfgmod-server.c b/mesh/cfgmod-server.c > > index 0009a1bee..5eefedc4d 100644 > > --- a/mesh/cfgmod-server.c > > +++ b/mesh/cfgmod-server.c > > @@ -80,13 +80,12 @@ static uint16_t config_pub_get(struct mesh_node > > *node, const uint8_t *pkt, > > > > pub = mesh_model_pub_get(node, ele_addr, id, &status); > > > > - rtx = pub->rtx.cnt + (((pub->rtx.interval / 50) - 1) << 3); > > - > > - if (pub && status == MESH_STATUS_SUCCESS) > > + if (pub && status == MESH_STATUS_SUCCESS) { > > + rtx = pub->rtx.cnt + (((pub->rtx.interval / 50) - > > 1) << 3); > > return set_pub_status(status, ele_addr, id, pub- > > >addr, pub->idx, > > pub->credential, pub->ttl, > > pub->period, > > rtx); > > - else > > + } else > > return set_pub_status(status, ele_addr, id, 0, 0, > > 0, 0, 0, 0); > > } > > > > @@ -592,12 +591,7 @@ static uint16_t cfg_appkey_msg(struct > > mesh_node *node, const uint8_t *pkt, > > struct mesh_net *net = node_get_net(node); > > > > n_idx = l_get_le16(pkt) & 0xfff; > > - if (n_idx > NET_IDX_MAX) > > - return 0; > > - > > a_idx = l_get_le16(pkt + 1) >> 4; > > - if (a_idx > APP_IDX_MAX) > > - return 0; > > > > n = mesh_model_opcode_set(OP_APPKEY_STATUS, msg); > > > > diff --git a/mesh/keyring.c b/mesh/keyring.c > > index bbe501063..1ef4fc3ef 100644 > > --- a/mesh/keyring.c > > +++ b/mesh/keyring.c > > @@ -50,18 +50,22 @@ bool keyring_put_net_key(struct mesh_node > > *node, uint16_t net_idx, > > return false; > > > > snprintf(key_file, PATH_MAX, "%s%s", node_path, > > net_key_dir); > > - mkdir(key_file, 0755); > > + > > + if (!mkdir(key_file, 0755)) > > + return false; > > + > > snprintf(key_file, PATH_MAX, "%s%s/%3.3x", node_path, > > net_key_dir, > > net > > _idx); > > l_debug("Put Net Key %s", key_file); > > > > fd = open(key_file, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | > > S_IWUSR); > > - if (fd >= 0) { > > - if (write(fd, key, sizeof(*key)) == sizeof(*key)) > > - result = true; > > + if (fd < 0) > > + return false; > > > > - close(fd); > > - } > > + if (write(fd, key, sizeof(*key)) == sizeof(*key)) > > + result = true; > > + > > + close(fd); > > > > return result; > > } > > @@ -83,7 +87,10 @@ bool keyring_put_app_key(struct mesh_node *node, > > uint16_t app_idx, > > return false; > > > > snprintf(key_file, PATH_MAX, "%s%s", node_path, > > app_key_dir); > > - mkdir(key_file, 0755); > > + > > + if (!mkdir(key_file, 0755)) > > + return false; > > + > > snprintf(key_file, PATH_MAX, "%s%s/%3.3x", node_path, > > app_key_dir, > > app > > _idx); > > l_debug("Put App Key %s", key_file); > > @@ -100,16 +107,17 @@ bool keyring_put_app_key(struct mesh_node > > *node, uint16_t app_idx, > > } > > > > lseek(fd, 0, SEEK_SET); > > - } else > > + } else { > > fd = open(key_file, O_WRONLY | O_CREAT | O_TRUNC, > > S_IRUSR | > > S_IWUSR); > > + if (fd < 0) > > + return false; > > + } > > > > - if (fd >= 0) { > > - if (write(fd, key, sizeof(*key)) == sizeof(*key)) > > - result = true; > > + if (write(fd, key, sizeof(*key)) == sizeof(*key)) > > + result = true; > > > > - close(fd); > > - } > > + close(fd); > > > > return result; > > } > > @@ -198,7 +206,9 @@ bool keyring_put_remote_dev_key(struct > > mesh_node *node, uint16_t unicast, > > return false; > > > > snprintf(key_file, PATH_MAX, "%s%s", node_path, > > dev_key_dir); > > - mkdir(key_file, 0755); > > + > > + if (!mkdir(key_file, 0755)) > > + return false; > > > > for (i = 0; i < count; i++) { > > snprintf(key_file, PATH_MAX, "%s%s/%4.4x", > > node_path,
Hi Steve, On Sat, 2020-11-28 at 12:05 -0500, Steve Brown wrote: > Hi Inga, > > The changes to mesh/keyring.c break create network for me. > > I think the mkdir tests should be > if (!!mkdir(key_file, 0755)) Yes, you are correct: it's a wrong check. Will fix. > not > if (!mkdir(key_file, 0755)) > > With that change, I can create networks again. > > Steve > Best regards, Inga
diff --git a/mesh/agent.c b/mesh/agent.c index b0d523d16..5058d0d8d 100644 --- a/mesh/agent.c +++ b/mesh/agent.c @@ -95,7 +95,7 @@ static bool simple_match(const void *a, const void *b) return a == b; } -static void parse_prov_caps(struct mesh_agent_prov_caps *caps, +static bool parse_prov_caps(struct mesh_agent_prov_caps *caps, struct l_dbus_message_iter *property) { struct l_dbus_message_iter iter_caps; @@ -103,7 +103,7 @@ static void parse_prov_caps(struct mesh_agent_prov_caps *caps, uint32_t i; if (!l_dbus_message_iter_get_variant(property, "as", &iter_caps)) - return; + return false; while (l_dbus_message_iter_next_entry(&iter_caps, &str)) { for (i = 0; i < L_ARRAY_SIZE(cap_table); i++) { @@ -129,9 +129,10 @@ static void parse_prov_caps(struct mesh_agent_prov_caps *caps, caps->static_type = 1; } + return true; } -static void parse_oob_info(struct mesh_agent_prov_caps *caps, +static bool parse_oob_info(struct mesh_agent_prov_caps *caps, struct l_dbus_message_iter *property) { struct l_dbus_message_iter iter_oob; @@ -139,7 +140,7 @@ static void parse_oob_info(struct mesh_agent_prov_caps *caps, const char *str; if (!l_dbus_message_iter_get_variant(property, "as", &iter_oob)) - return; + return false; while (l_dbus_message_iter_next_entry(&iter_oob, &str)) { for (i = 0; i < L_ARRAY_SIZE(oob_table); i++) { @@ -148,9 +149,11 @@ static void parse_oob_info(struct mesh_agent_prov_caps *caps, caps->oob_info |= oob_table[i].mask; } } + + return true; } -static void parse_properties(struct mesh_agent *agent, +static bool parse_properties(struct mesh_agent *agent, struct l_dbus_message_iter *properties) { const char *key, *uri_string; @@ -160,15 +163,20 @@ static void parse_properties(struct mesh_agent *agent, while (l_dbus_message_iter_next_entry(properties, &key, &variant)) { if (!strcmp(key, "Capabilities")) { - parse_prov_caps(&agent->caps, &variant); + if (!parse_prov_caps(&agent->caps, &variant)) + return false; } else if (!strcmp(key, "URI")) { - l_dbus_message_iter_get_variant(&variant, "s", - &uri_string); + if (!l_dbus_message_iter_get_variant(&variant, "s", + &uri_string)) + return false; /* TODO: compute hash */ } else if (!strcmp(key, "OutOfBandInfo")) { - parse_oob_info(&agent->caps, &variant); + if (!parse_oob_info(&agent->caps, &variant)) + return false; } } + + return true; } static void agent_free(void *agent_data) @@ -253,7 +261,10 @@ struct mesh_agent *mesh_agent_create(const char *path, const char *owner, agent->owner = l_strdup(owner); agent->path = l_strdup(path); - parse_properties(agent, properties); + if (!parse_properties(agent, properties)) { + l_free(agent); + return NULL; + } l_queue_push_tail(agents, agent); @@ -312,15 +323,17 @@ static void properties_reply(struct l_dbus_message *reply, void *user_data) err = get_reply_error(reply); if (err != MESH_ERROR_NONE) - goto fail; + goto done; if (!l_dbus_message_get_arguments(reply, "a{sv}", &properties)) { err = MESH_ERROR_FAILED; - goto fail; + goto done; } - parse_properties(agent, &properties); -fail: + if (!parse_properties(agent, &properties)) + err = MESH_ERROR_FAILED; + +done: if (req->cb) { cb = req->cb; cb(req->user_data, err); @@ -425,7 +438,7 @@ static void key_reply(struct l_dbus_message *reply, void *user_data) mesh_agent_key_cb_t cb; struct l_dbus_message_iter iter_array; uint32_t n = 0, expected_len = 0; - uint8_t *buf; + uint8_t *buf = NULL; int err; if (!l_queue_find(agents, simple_match, agent) || !agent->req) diff --git a/mesh/appkey.c b/mesh/appkey.c index 7efb8f5c4..549f5a80d 100644 --- a/mesh/appkey.c +++ b/mesh/appkey.c @@ -100,11 +100,11 @@ bool appkey_key_init(struct mesh_net *net, uint16_t net_idx, uint16_t app_idx, if (!app_keys) return NULL; - key = app_key_new(); - if (!key) + if (!mesh_net_have_key(net, net_idx)) return false; - if (!mesh_net_have_key(net, net_idx)) + key = app_key_new(); + if (!key) return false; key->net_idx = net_idx; diff --git a/mesh/cfgmod-server.c b/mesh/cfgmod-server.c index 0009a1bee..5eefedc4d 100644 --- a/mesh/cfgmod-server.c +++ b/mesh/cfgmod-server.c @@ -80,13 +80,12 @@ static uint16_t config_pub_get(struct mesh_node *node, const uint8_t *pkt, pub = mesh_model_pub_get(node, ele_addr, id, &status); - rtx = pub->rtx.cnt + (((pub->rtx.interval / 50) - 1) << 3); - - if (pub && status == MESH_STATUS_SUCCESS) + if (pub && status == MESH_STATUS_SUCCESS) { + rtx = pub->rtx.cnt + (((pub->rtx.interval / 50) - 1) << 3); return set_pub_status(status, ele_addr, id, pub->addr, pub->idx, pub->credential, pub->ttl, pub->period, rtx); - else + } else return set_pub_status(status, ele_addr, id, 0, 0, 0, 0, 0, 0); } @@ -592,12 +591,7 @@ static uint16_t cfg_appkey_msg(struct mesh_node *node, const uint8_t *pkt, struct mesh_net *net = node_get_net(node); n_idx = l_get_le16(pkt) & 0xfff; - if (n_idx > NET_IDX_MAX) - return 0; - a_idx = l_get_le16(pkt + 1) >> 4; - if (a_idx > APP_IDX_MAX) - return 0; n = mesh_model_opcode_set(OP_APPKEY_STATUS, msg); diff --git a/mesh/keyring.c b/mesh/keyring.c index bbe501063..1ef4fc3ef 100644 --- a/mesh/keyring.c +++ b/mesh/keyring.c @@ -50,18 +50,22 @@ bool keyring_put_net_key(struct mesh_node *node, uint16_t net_idx, return false; snprintf(key_file, PATH_MAX, "%s%s", node_path, net_key_dir); - mkdir(key_file, 0755); + + if (!mkdir(key_file, 0755)) + return false; + snprintf(key_file, PATH_MAX, "%s%s/%3.3x", node_path, net_key_dir, net_idx); l_debug("Put Net Key %s", key_file); fd = open(key_file, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR); - if (fd >= 0) { - if (write(fd, key, sizeof(*key)) == sizeof(*key)) - result = true; + if (fd < 0) + return false; - close(fd); - } + if (write(fd, key, sizeof(*key)) == sizeof(*key)) + result = true; + + close(fd); return result; } @@ -83,7 +87,10 @@ bool keyring_put_app_key(struct mesh_node *node, uint16_t app_idx, return false; snprintf(key_file, PATH_MAX, "%s%s", node_path, app_key_dir); - mkdir(key_file, 0755); + + if (!mkdir(key_file, 0755)) + return false; + snprintf(key_file, PATH_MAX, "%s%s/%3.3x", node_path, app_key_dir, app_idx); l_debug("Put App Key %s", key_file); @@ -100,16 +107,17 @@ bool keyring_put_app_key(struct mesh_node *node, uint16_t app_idx, } lseek(fd, 0, SEEK_SET); - } else + } else { fd = open(key_file, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR); + if (fd < 0) + return false; + } - if (fd >= 0) { - if (write(fd, key, sizeof(*key)) == sizeof(*key)) - result = true; + if (write(fd, key, sizeof(*key)) == sizeof(*key)) + result = true; - close(fd); - } + close(fd); return result; } @@ -198,7 +206,9 @@ bool keyring_put_remote_dev_key(struct mesh_node *node, uint16_t unicast, return false; snprintf(key_file, PATH_MAX, "%s%s", node_path, dev_key_dir); - mkdir(key_file, 0755); + + if (!mkdir(key_file, 0755)) + return false; for (i = 0; i < count; i++) { snprintf(key_file, PATH_MAX, "%s%s/%4.4x", node_path,