WPS: As a workaround, pad zero-length device attributes
Some deployed WPS implementations fail to parse zero-length attributes. As a workaround, send a null character if the device attribute string is empty. This allows default values (empty strings) to be used without interop issues.
This commit is contained in:
parent
febc0551c5
commit
34cbe7d0b0
1 changed files with 60 additions and 10 deletions
|
@ -26,8 +26,18 @@ static int wps_build_manufacturer(struct wps_device_data *dev,
|
||||||
wpa_printf(MSG_DEBUG, "WPS: * Manufacturer");
|
wpa_printf(MSG_DEBUG, "WPS: * Manufacturer");
|
||||||
wpabuf_put_be16(msg, ATTR_MANUFACTURER);
|
wpabuf_put_be16(msg, ATTR_MANUFACTURER);
|
||||||
len = dev->manufacturer ? os_strlen(dev->manufacturer) : 0;
|
len = dev->manufacturer ? os_strlen(dev->manufacturer) : 0;
|
||||||
wpabuf_put_be16(msg, len);
|
if (len == 0) {
|
||||||
wpabuf_put_data(msg, dev->manufacturer, len);
|
/*
|
||||||
|
* Some deployed WPS implementations fail to parse zero-length
|
||||||
|
* attributes. As a workaround, send a null character if the
|
||||||
|
* device attribute string is empty.
|
||||||
|
*/
|
||||||
|
wpabuf_put_be16(msg, 1);
|
||||||
|
wpabuf_put_u8(msg, '\0');
|
||||||
|
} else {
|
||||||
|
wpabuf_put_be16(msg, len);
|
||||||
|
wpabuf_put_data(msg, dev->manufacturer, len);
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -39,8 +49,18 @@ static int wps_build_model_name(struct wps_device_data *dev,
|
||||||
wpa_printf(MSG_DEBUG, "WPS: * Model Name");
|
wpa_printf(MSG_DEBUG, "WPS: * Model Name");
|
||||||
wpabuf_put_be16(msg, ATTR_MODEL_NAME);
|
wpabuf_put_be16(msg, ATTR_MODEL_NAME);
|
||||||
len = dev->model_name ? os_strlen(dev->model_name) : 0;
|
len = dev->model_name ? os_strlen(dev->model_name) : 0;
|
||||||
wpabuf_put_be16(msg, len);
|
if (len == 0) {
|
||||||
wpabuf_put_data(msg, dev->model_name, len);
|
/*
|
||||||
|
* Some deployed WPS implementations fail to parse zero-length
|
||||||
|
* attributes. As a workaround, send a null character if the
|
||||||
|
* device attribute string is empty.
|
||||||
|
*/
|
||||||
|
wpabuf_put_be16(msg, 1);
|
||||||
|
wpabuf_put_u8(msg, '\0');
|
||||||
|
} else {
|
||||||
|
wpabuf_put_be16(msg, len);
|
||||||
|
wpabuf_put_data(msg, dev->model_name, len);
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -52,8 +72,18 @@ static int wps_build_model_number(struct wps_device_data *dev,
|
||||||
wpa_printf(MSG_DEBUG, "WPS: * Model Number");
|
wpa_printf(MSG_DEBUG, "WPS: * Model Number");
|
||||||
wpabuf_put_be16(msg, ATTR_MODEL_NUMBER);
|
wpabuf_put_be16(msg, ATTR_MODEL_NUMBER);
|
||||||
len = dev->model_number ? os_strlen(dev->model_number) : 0;
|
len = dev->model_number ? os_strlen(dev->model_number) : 0;
|
||||||
wpabuf_put_be16(msg, len);
|
if (len == 0) {
|
||||||
wpabuf_put_data(msg, dev->model_number, len);
|
/*
|
||||||
|
* Some deployed WPS implementations fail to parse zero-length
|
||||||
|
* attributes. As a workaround, send a null character if the
|
||||||
|
* device attribute string is empty.
|
||||||
|
*/
|
||||||
|
wpabuf_put_be16(msg, 1);
|
||||||
|
wpabuf_put_u8(msg, '\0');
|
||||||
|
} else {
|
||||||
|
wpabuf_put_be16(msg, len);
|
||||||
|
wpabuf_put_data(msg, dev->model_number, len);
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -65,8 +95,18 @@ static int wps_build_serial_number(struct wps_device_data *dev,
|
||||||
wpa_printf(MSG_DEBUG, "WPS: * Serial Number");
|
wpa_printf(MSG_DEBUG, "WPS: * Serial Number");
|
||||||
wpabuf_put_be16(msg, ATTR_SERIAL_NUMBER);
|
wpabuf_put_be16(msg, ATTR_SERIAL_NUMBER);
|
||||||
len = dev->serial_number ? os_strlen(dev->serial_number) : 0;
|
len = dev->serial_number ? os_strlen(dev->serial_number) : 0;
|
||||||
wpabuf_put_be16(msg, len);
|
if (len == 0) {
|
||||||
wpabuf_put_data(msg, dev->serial_number, len);
|
/*
|
||||||
|
* Some deployed WPS implementations fail to parse zero-length
|
||||||
|
* attributes. As a workaround, send a null character if the
|
||||||
|
* device attribute string is empty.
|
||||||
|
*/
|
||||||
|
wpabuf_put_be16(msg, 1);
|
||||||
|
wpabuf_put_u8(msg, '\0');
|
||||||
|
} else {
|
||||||
|
wpabuf_put_be16(msg, len);
|
||||||
|
wpabuf_put_data(msg, dev->serial_number, len);
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -91,8 +131,18 @@ static int wps_build_dev_name(struct wps_device_data *dev, struct wpabuf *msg)
|
||||||
wpa_printf(MSG_DEBUG, "WPS: * Device Name");
|
wpa_printf(MSG_DEBUG, "WPS: * Device Name");
|
||||||
wpabuf_put_be16(msg, ATTR_DEV_NAME);
|
wpabuf_put_be16(msg, ATTR_DEV_NAME);
|
||||||
len = dev->device_name ? os_strlen(dev->device_name) : 0;
|
len = dev->device_name ? os_strlen(dev->device_name) : 0;
|
||||||
wpabuf_put_be16(msg, len);
|
if (len == 0) {
|
||||||
wpabuf_put_data(msg, dev->device_name, len);
|
/*
|
||||||
|
* Some deployed WPS implementations fail to parse zero-length
|
||||||
|
* attributes. As a workaround, send a null character if the
|
||||||
|
* device attribute string is empty.
|
||||||
|
*/
|
||||||
|
wpabuf_put_be16(msg, 1);
|
||||||
|
wpabuf_put_u8(msg, '\0');
|
||||||
|
} else {
|
||||||
|
wpabuf_put_be16(msg, len);
|
||||||
|
wpabuf_put_data(msg, dev->device_name, len);
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue