aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJouni Malinen <j@w1.fi>2015-09-07 14:45:53 (GMT)
committerJouni Malinen <j@w1.fi>2015-09-07 14:45:53 (GMT)
commitf0f82bd82f7566eef2431360743e548b9d325583 (patch)
tree55fe915e775a6c11f4aed67bef593c27aea3bad5 /src
parentdb9c88ebb5c6e11aba5262f46b98d4c3ffccca57 (diff)
downloadhostap-f0f82bd82f7566eef2431360743e548b9d325583.zip
hostap-f0f82bd82f7566eef2431360743e548b9d325583.tar.gz
hostap-f0f82bd82f7566eef2431360743e548b9d325583.tar.bz2
WPS ER: Clean up WPS session on PutMessage error cases
This is needed to allow new operation to be started after an error without having to wait for the AP entry to time out. Signed-off-by: Jouni Malinen <j@w1.fi>
Diffstat (limited to 'src')
-rw-r--r--src/wps/wps_er.c27
1 files changed, 20 insertions, 7 deletions
diff --git a/src/wps/wps_er.c b/src/wps/wps_er.c
index 078ff72..b840acd 100644
--- a/src/wps/wps_er.c
+++ b/src/wps/wps_er.c
@@ -1649,11 +1649,15 @@ static void wps_er_http_put_message_cb(void *ctx, struct http_client *c,
case HTTP_CLIENT_OK:
wpa_printf(MSG_DEBUG, "WPS ER: PutMessage OK");
reply = http_client_get_body(c);
- if (reply == NULL)
- break;
- msg = os_zalloc(wpabuf_len(reply) + 1);
- if (msg == NULL)
+ if (reply)
+ msg = os_zalloc(wpabuf_len(reply) + 1);
+ if (msg == NULL) {
+ if (ap->wps) {
+ wps_deinit(ap->wps);
+ ap->wps = NULL;
+ }
break;
+ }
os_memcpy(msg, wpabuf_head(reply), wpabuf_len(reply));
break;
case HTTP_CLIENT_FAILED:
@@ -1709,21 +1713,30 @@ static void wps_er_ap_put_message(struct wps_er_ap *ap,
url = http_client_url_parse(ap->control_url, &dst, &path);
if (url == NULL) {
wpa_printf(MSG_DEBUG, "WPS ER: Failed to parse controlURL");
- return;
+ goto fail;
}
buf = wps_er_soap_hdr(msg, "PutMessage", "NewInMessage", path, &dst,
&len_ptr, &body_ptr);
os_free(url);
if (buf == NULL)
- return;
+ goto fail;
wps_er_soap_end(buf, "PutMessage", len_ptr, body_ptr);
ap->http = http_client_addr(&dst, buf, 10000,
wps_er_http_put_message_cb, ap);
- if (ap->http == NULL)
+ if (ap->http == NULL) {
wpabuf_free(buf);
+ goto fail;
+ }
+ return;
+
+fail:
+ if (ap->wps) {
+ wps_deinit(ap->wps);
+ ap->wps = NULL;
+ }
}