[PATCH] bugfix: a single SSL record can't contain >16KiB, therefore we must loop when writing a larger buffer

Daniel Lenski dlenski at gmail.com
Wed Nov 29 00:49:16 PST 2017


A single SSL record can't contain >16KiB, so the HTTPS request buffer may not get 
fully written if it's larger than this.

I discovered this frustrating bug while working on GlobalProtect HIP support, which
requires sending giant blobs of XML to the gateway.

Signed-off-by: Daniel Lenski <dlenski at gmail.com>
---
 http.c                 | 6 +++++-
 openconnect-internal.h | 3 +++
 2 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/http.c b/http.c
index 812e002..b6908c0 100644
--- a/http.c
+++ b/http.c
@@ -913,7 +913,11 @@ int do_https_request(struct openconnect_info *vpninfo, const char *method,
 	if (vpninfo->dump_http_traffic)
 		dump_buf(vpninfo, '>', buf->data);
 
-	result = vpninfo->ssl_write(vpninfo, buf->data, buf->pos);
+	for (int i=result=0; i<=buf->pos; i+=16384) {
+		result = vpninfo->ssl_write(vpninfo, buf->data+i, MIN(buf->pos-i, 16384) );
+		if (result<0)
+			break;
+	}
 	if (rq_retry && result < 0) {
 		openconnect_close_https(vpninfo, 0);
 		goto retry;
diff --git a/openconnect-internal.h b/openconnect-internal.h
index 923d5a1..02716fd 100644
--- a/openconnect-internal.h
+++ b/openconnect-internal.h
@@ -122,6 +122,9 @@
 #ifndef MAX
 #define MAX(x,y) ((x)>(y))?(x):(y)
 #endif
+#ifndef MIN
+#define MIN(x,y) ((x)<(y))?(x):(y)
+#endif
 /****************************************************************************/
 
 struct pkt {
-- 
2.7.4




More information about the openconnect-devel mailing list