Signed-off-by: Daniel Lenski <dlenski at gmail.com> --- auth-globalprotect.c | 19 ++++++++++++++----- gpst.c | 26 +++++++++++++++++++------- 2 files changed, 33 insertions(+), 12 deletions(-) diff --git a/auth-globalprotect.c b/auth-globalprotect.c index d3799d6..4ef37f7 100644 --- a/auth-globalprotect.c +++ b/auth-globalprotect.c @@ -161,8 +161,7 @@ static int parse_login_xml(struct openconnect_info *vpninfo, xmlNode *xml_node) vpninfo->cookie = cookie->data; cookie->data = NULL; - buf_free(cookie); - return 0; + return buf_free(cookie); err_out: free(value); @@ -269,9 +268,14 @@ gateways: } buf_append(buf, " </ServerList>\n</GPPortal>\n"); - if (vpninfo->write_new_config && !buf_error(buf)) - result = vpninfo->write_new_config(vpninfo->cbdata, buf->data, buf->pos); - buf_free(buf); + if (vpninfo->write_new_config) { + result = buf_error(buf); + if (!result) + result = vpninfo->write_new_config(vpninfo->cbdata, buf->data, buf->pos); + buf_free(buf); + if (result) + goto out; + } /* process static auth form to select gateway */ result = process_auth_form(vpninfo, &form); @@ -342,6 +346,8 @@ static int gpst_login(struct openconnect_info *vpninfo, int portal) if (auth_id) append_opt(request_body, "inputStr", form->auth_id); append_form_opts(vpninfo, form, request_body); + if ((result = buf_error(request_body))) + goto out; orig_path = vpninfo->urlpath; vpninfo->urlpath = strdup(portal ? "global-protect/getconfig.esp" : "ssl-vpn/login.esp"); @@ -423,6 +429,8 @@ int gpst_bye(struct openconnect_info *vpninfo, const char *reason) */ append_opt(request_body, "computer", vpninfo->localname); buf_append(request_body, "&%s", vpninfo->cookie); + if ((result = buf_error(request_body))) + goto out; /* We need to close and reopen the HTTPS connection (to kill * the tunnel session) and submit a new HTTPS request to @@ -445,6 +453,7 @@ int gpst_bye(struct openconnect_info *vpninfo, const char *reason) else vpn_progress(vpninfo, PRG_INFO, _("Logout successful\n")); +out: buf_free(request_body); free(xml_buf); return result; diff --git a/gpst.c b/gpst.c index 68b94f7..0428dbd 100644 --- a/gpst.c +++ b/gpst.c @@ -573,6 +573,8 @@ static int gpst_get_config(struct openconnect_info *vpninfo) filter_opts(request_body, vpninfo->cookie, "preferred-ip", 0); } else buf_append(request_body, "&%s", vpninfo->cookie); + if ((result = buf_error(request_body))) + goto out; orig_path = vpninfo->urlpath; vpninfo->urlpath = strdup("ssl-vpn/getconfig.esp"); @@ -632,6 +634,7 @@ static int gpst_connect(struct openconnect_info *vpninfo) { int ret; struct oc_text_buf *reqbuf; + const char start_tunnel[12] = "START_TUNNEL"; /* NOT zero-terminated */ char buf[256]; /* Connect to SSL VPN tunnel */ @@ -646,31 +649,33 @@ static int gpst_connect(struct openconnect_info *vpninfo) buf_append(reqbuf, "GET %s?", vpninfo->urlpath); filter_opts(reqbuf, vpninfo->cookie, "user,authcookie", 1); buf_append(reqbuf, " HTTP/1.1\r\n\r\n"); + if ((ret = buf_error(reqbuf))) + goto out; if (vpninfo->dump_http_traffic) dump_buf(vpninfo, '>', reqbuf->data); vpninfo->ssl_write(vpninfo, reqbuf->data, reqbuf->pos); - buf_free(reqbuf); if ((ret = vpninfo->ssl_read(vpninfo, buf, 12)) < 0) { if (ret == -EINTR) - return ret; + goto out; vpn_progress(vpninfo, PRG_ERR, _("Error fetching GET-tunnel HTTPS response.\n")); - return -EINVAL; + ret = -EINVAL; + goto out; } - if (!strncmp(buf, "START_TUNNEL", 12)) { + if (!strncmp(buf, start_tunnel, sizeof(start_tunnel))) { ret = 0; } else if (ret==0) { vpn_progress(vpninfo, PRG_ERR, _("Gateway disconnected immediately after GET-tunnel request.\n")); ret = -EPIPE; } else { - if (ret==12) { - ret = vpninfo->ssl_gets(vpninfo, buf+12, 244); - ret = (ret>0 ? ret : 0) + 12; + if (ret==sizeof(start_tunnel)) { + ret = vpninfo->ssl_gets(vpninfo, buf+sizeof(start_tunnel), sizeof(buf)-sizeof(start_tunnel)); + ret = (ret>0 ? ret : 0) + sizeof(start_tunnel); } vpn_progress(vpninfo, PRG_ERR, _("Got inappropriate HTTP GET-tunnel response: %.*s\n"), ret, buf); @@ -688,6 +693,8 @@ static int gpst_connect(struct openconnect_info *vpninfo) vpninfo->proto->udp_close(vpninfo); } +out: + buf_free(reqbuf); return ret; } @@ -748,12 +755,15 @@ static int build_csd_token(struct openconnect_info *vpninfo) buf = buf_alloc(); append_opt(buf, "computer", vpninfo->localname); filter_opts(buf, vpninfo->cookie, "authcookie,preferred-ip", 0); + if (buf_error(buf)) + goto out; /* save as csd_token */ openconnect_md5(md5, buf->data, buf->pos); for (i=0; i < MD5_SIZE; i++) sprintf(&vpninfo->csd_token[i*2], "%02x", md5[i]); +out: return buf_free(buf); } @@ -781,6 +791,8 @@ static int check_or_submit_hip_report(struct openconnect_info *vpninfo, const ch goto out; append_opt(request_body, "md5", vpninfo->csd_token); } + if ((result = buf_error(request_body))) + goto out; orig_path = vpninfo->urlpath; vpninfo->urlpath = strdup(report ? "ssl-vpn/hipreport.esp" : "ssl-vpn/hipreportcheck.esp"); -- 2.7.4