mirror of
https://github.com/albfan/miraclecast.git
synced 2025-03-09 23:38:56 +00:00
miracle-*ctl: resolve object parsing issue in ctl_wifi_fetch()
while parsing ctl_peer and ctl_link objects, if a ctl_peer appear prior to its related ctl_link, -EINVAL is reported, and miracle-*ctl will quit immediately.
This commit is contained in:
parent
cfc98095d1
commit
14041bd968
1 changed files with 48 additions and 21 deletions
|
@ -823,7 +823,7 @@ static int ctl_wifi_parse_peer(struct ctl_wifi *w,
|
||||||
|
|
||||||
l = ctl_wifi_find_link_by_peer(w, label);
|
l = ctl_wifi_find_link_by_peer(w, label);
|
||||||
if (!l)
|
if (!l)
|
||||||
return cli_EINVAL();
|
return -EINVAL;
|
||||||
|
|
||||||
r = ctl_peer_new(&p, l, label);
|
r = ctl_peer_new(&p, l, label);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
|
@ -1149,6 +1149,42 @@ void ctl_wifi_free(struct ctl_wifi *w)
|
||||||
free(w);
|
free(w);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int ctl_wifi_parse_objects(struct ctl_wifi *w,
|
||||||
|
sd_bus_message *m,
|
||||||
|
bool ignore_link_not_found)
|
||||||
|
{
|
||||||
|
bool again = false;
|
||||||
|
int r = sd_bus_message_enter_container(m, 'a', "{oa{sa{sv}}}");
|
||||||
|
if (r < 0)
|
||||||
|
return cli_log_parser(r);
|
||||||
|
|
||||||
|
while ((r = sd_bus_message_enter_container(m,
|
||||||
|
'e',
|
||||||
|
"oa{sa{sv}}")) > 0) {
|
||||||
|
r = ctl_wifi_parse_object(w, m, true);
|
||||||
|
if(ignore_link_not_found && -EINVAL == r) {
|
||||||
|
r = sd_bus_message_skip(m, "a{sa{sv}}");
|
||||||
|
if(0 > r)
|
||||||
|
return cli_log_parser(r);
|
||||||
|
again = true;
|
||||||
|
}
|
||||||
|
if (r < 0)
|
||||||
|
return r;
|
||||||
|
|
||||||
|
r = sd_bus_message_exit_container(m);
|
||||||
|
if (r < 0)
|
||||||
|
return cli_log_parser(r);
|
||||||
|
}
|
||||||
|
if (r < 0)
|
||||||
|
return cli_log_parser(r);
|
||||||
|
|
||||||
|
r = sd_bus_message_exit_container(m);
|
||||||
|
if (r < 0)
|
||||||
|
return cli_log_parser(r);
|
||||||
|
|
||||||
|
return again ? -EAGAIN : 0;
|
||||||
|
}
|
||||||
|
|
||||||
int ctl_wifi_fetch(struct ctl_wifi *w)
|
int ctl_wifi_fetch(struct ctl_wifi *w)
|
||||||
{
|
{
|
||||||
_sd_bus_message_unref_ sd_bus_message *m = NULL;
|
_sd_bus_message_unref_ sd_bus_message *m = NULL;
|
||||||
|
@ -1172,29 +1208,20 @@ int ctl_wifi_fetch(struct ctl_wifi *w)
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
r = sd_bus_message_enter_container(m, 'a', "{oa{sa{sv}}}");
|
r = ctl_wifi_parse_objects(w, m, true);
|
||||||
if (r < 0)
|
if(0 <= r || -EAGAIN != r) {
|
||||||
return cli_log_parser(r);
|
goto end;
|
||||||
|
|
||||||
while ((r = sd_bus_message_enter_container(m,
|
|
||||||
'e',
|
|
||||||
"oa{sa{sv}}")) > 0) {
|
|
||||||
r = ctl_wifi_parse_object(w, m, true);
|
|
||||||
if (r < 0)
|
|
||||||
return r;
|
|
||||||
|
|
||||||
r = sd_bus_message_exit_container(m);
|
|
||||||
if (r < 0)
|
|
||||||
return cli_log_parser(r);
|
|
||||||
}
|
}
|
||||||
if (r < 0)
|
|
||||||
return cli_log_parser(r);
|
|
||||||
|
|
||||||
r = sd_bus_message_exit_container(m);
|
r = sd_bus_message_rewind(m, true);
|
||||||
if (r < 0)
|
if(0 > r) {
|
||||||
return cli_log_parser(r);
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
r = ctl_wifi_parse_objects(w, m, false);
|
||||||
|
|
||||||
|
end:
|
||||||
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct ctl_link *ctl_wifi_find_link(struct ctl_wifi *w,
|
struct ctl_link *ctl_wifi_find_link(struct ctl_wifi *w,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue