code: drawterm

Download patch

ref: cdb9a6e131c162f8c6f29b4fb131bb78b9ea7928
parent: 43866763e399e223a6e9b6f16e0c09bb16be19fa
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Tue Apr 4 15:02:25 EDT 2017

tlshand: simplify tlsReadN() (from 9front)

--- a/libsec/tlshand.c
+++ b/libsec/tlshand.c
@@ -99,7 +99,7 @@
 	HandshakeHash	handhash;
 	Finished	finished;
 
-	uchar *sendp, *recvp, *recvw;
+	uchar *sendp;
 	uchar buf[1<<16];
 } TlsConnection;
 
@@ -690,7 +690,6 @@
 	c->trace = trace;
 	c->version = ProtocolVersion;
 	c->sendp = c->buf;
-	c->recvp = c->recvw = &c->buf[sizeof(c->buf)];
 
 	memset(&m, 0, sizeof(m));
 	if(!msgRecv(c, &m)){
@@ -995,7 +994,6 @@
 	c->trace = trace;
 	c->cert = nil;
 	c->sendp = c->buf;
-	c->recvp = c->recvw = &c->buf[sizeof(c->buf)];
 
 	c->version = ProtocolVersion;
 	tlsSecInitc(c->sec, c->version);
@@ -1263,7 +1261,7 @@
 	int n, i;
 
 	p = c->sendp;
-	e = c->recvp;
+	e = &c->buf[sizeof(c->buf)];
 	if(c->trace)
 		c->trace("send %s", msgPrint((char*)p, e - p, m));
 
@@ -1439,28 +1437,17 @@
 static uchar*
 tlsReadN(TlsConnection *c, int n)
 {
-	uchar *p, *e;
+	uchar *p, *w, *e;
 
-	p = c->recvp;
-	if(n <= c->recvw - p){
-		c->recvp += n;
-		return p;
-	}
 	e = &c->buf[sizeof(c->buf)];
-	c->recvp = e - n;
-	if(c->recvp < c->sendp || n > sizeof(c->buf)){
+	p = e - n;
+	if(n > sizeof(c->buf) || p < c->sendp){
 		tlsError(c, EDecodeError, "handshake message too long %d", n);
 		return nil;
 	}
-	memmove(c->recvp, p, c->recvw - p);
-	c->recvw -= p - c->recvp;
-	p = c->recvp;
-	c->recvp += n;
-	while(c->recvw < c->recvp){
-		if((n = read(c->hand, c->recvw, e - c->recvw)) <= 0)
+	for(w = p; w < e; w += n)
+		if((n = read(c->hand, w, e - w)) <= 0)
 			return nil;
-		c->recvw += n;
-	}
 	return p;
 }
 
@@ -1803,7 +1790,8 @@
 		goto Short;
 Ok:
 	if(c->trace)
-		c->trace("recv %s", msgPrint((char*)c->sendp, c->recvp - c->sendp, m));
+		c->trace("recv %s", msgPrint((char*)c->sendp, 
+			&c->buf[sizeof(c->buf)] - c->sendp, m));
 	return 1;
 Short:
 	tlsError(c, EDecodeError, "handshake message (%d) has invalid length", type);