mirror of
https://github.com/vanhoefm/fragattacks.git
synced 2025-02-21 03:23:04 -05:00
WPS ER: Fix UPnP XML Device Description parser to find correct device
The device description file may include multiple devices. Improve the simplistic parser by first trying to find the WFADevice:1 device before fetching the device parameters. While this is still far from complete XML parsing, this should address the most common root device specifications.
This commit is contained in:
parent
86957e6298
commit
ae9c400358
@ -75,8 +75,8 @@
|
|||||||
* Note that angle brackets present in the original data must have been encoded
|
* Note that angle brackets present in the original data must have been encoded
|
||||||
* as < and > so they will not trouble us.
|
* as < and > so they will not trouble us.
|
||||||
*/
|
*/
|
||||||
static int xml_next_tag(const char *in, const char **out,
|
int xml_next_tag(const char *in, const char **out,
|
||||||
const char **out_tagname, const char **end)
|
const char **out_tagname, const char **end)
|
||||||
{
|
{
|
||||||
while (*in && *in != '<')
|
while (*in && *in != '<')
|
||||||
in++;
|
in++;
|
||||||
|
@ -16,6 +16,8 @@
|
|||||||
void xml_data_encode(struct wpabuf *buf, const char *data, int len);
|
void xml_data_encode(struct wpabuf *buf, const char *data, int len);
|
||||||
void xml_add_tagged_data(struct wpabuf *buf, const char *tag,
|
void xml_add_tagged_data(struct wpabuf *buf, const char *tag,
|
||||||
const char *data);
|
const char *data);
|
||||||
|
int xml_next_tag(const char *in, const char **out,
|
||||||
|
const char **out_tagname, const char **end);
|
||||||
char * xml_get_first_item(const char *doc, const char *item);
|
char * xml_get_first_item(const char *doc, const char *item);
|
||||||
struct wpabuf * xml_get_base64_item(const char *data, const char *name,
|
struct wpabuf * xml_get_base64_item(const char *data, const char *name,
|
||||||
enum http_reply_code *ret);
|
enum http_reply_code *ret);
|
||||||
|
@ -502,16 +502,61 @@ static void wps_er_get_device_info(struct wps_er_ap *ap)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static const char * wps_er_find_wfadevice(const char *data)
|
||||||
|
{
|
||||||
|
const char *tag, *tagname, *end;
|
||||||
|
char *val;
|
||||||
|
int found = 0;
|
||||||
|
|
||||||
|
while (!found) {
|
||||||
|
/* Find next <device> */
|
||||||
|
for (;;) {
|
||||||
|
if (xml_next_tag(data, &tag, &tagname, &end))
|
||||||
|
return NULL;
|
||||||
|
data = end;
|
||||||
|
if (!os_strncasecmp(tagname, "device", 6) &&
|
||||||
|
*tag != '/' &&
|
||||||
|
(tagname[6] == '>' || !isgraph(tagname[6]))) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check whether deviceType is WFADevice */
|
||||||
|
val = xml_get_first_item(data, "deviceType");
|
||||||
|
if (val == NULL)
|
||||||
|
return NULL;
|
||||||
|
wpa_printf(MSG_DEBUG, "WPS ER: Found deviceType '%s'", val);
|
||||||
|
found = os_strcasecmp(val, "urn:schemas-wifialliance-org:"
|
||||||
|
"device:WFADevice:1") == 0;
|
||||||
|
os_free(val);
|
||||||
|
}
|
||||||
|
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void wps_er_parse_device_description(struct wps_er_ap *ap,
|
static void wps_er_parse_device_description(struct wps_er_ap *ap,
|
||||||
struct wpabuf *reply)
|
struct wpabuf *reply)
|
||||||
{
|
{
|
||||||
/* Note: reply includes null termination after the buffer data */
|
/* Note: reply includes null termination after the buffer data */
|
||||||
const char *data = wpabuf_head(reply);
|
const char *tmp, *data = wpabuf_head(reply);
|
||||||
char *pos;
|
char *pos;
|
||||||
|
|
||||||
wpa_hexdump_ascii(MSG_MSGDUMP, "WPS ER: Device info",
|
wpa_hexdump_ascii(MSG_MSGDUMP, "WPS ER: Device info",
|
||||||
wpabuf_head(reply), wpabuf_len(reply));
|
wpabuf_head(reply), wpabuf_len(reply));
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The root device description may include multiple devices, so first
|
||||||
|
* find the beginning of the WFADevice description to allow the
|
||||||
|
* simplistic parser to pick the correct entries.
|
||||||
|
*/
|
||||||
|
tmp = wps_er_find_wfadevice(data);
|
||||||
|
if (tmp == NULL) {
|
||||||
|
wpa_printf(MSG_DEBUG, "WPS ER: WFADevice:1 device not found - "
|
||||||
|
"trying to parse invalid data");
|
||||||
|
} else
|
||||||
|
data = tmp;
|
||||||
|
|
||||||
ap->friendly_name = xml_get_first_item(data, "friendlyName");
|
ap->friendly_name = xml_get_first_item(data, "friendlyName");
|
||||||
wpa_printf(MSG_DEBUG, "WPS ER: friendlyName='%s'", ap->friendly_name);
|
wpa_printf(MSG_DEBUG, "WPS ER: friendlyName='%s'", ap->friendly_name);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user