--- /sys/src/libsec/port/tlshand.c +++ /sys/src/libsec/port/tlshand.c @@ -73,7 +73,7 @@ typedef struct TlsConnection{ int state; // must be set using setstate // input buffer for handshake messages - uchar buf[MaxChunk+2048]; + uchar buf[MaxChunk+8*1024]; uchar *rp, *ep; uchar crandom[RandomSize]; // client random @@ -403,8 +403,11 @@ tlsClient(int fd, TLSconn *conn) } sprint(dname, "#a/tls/%s/data", buf); data = open(dname, ORDWR); - if(data < 0) + if(data < 0) { + close(hand); + close(ctl); return -1; + } fprint(ctl, "fd %d 0x%x", fd, ProtocolVersion); tls = tlsClient2(ctl, hand, conn->sessionID, conn->sessionIDlen, conn->trace); close(fd); @@ -1249,6 +1252,7 @@ msgClear(Msg *m) case HClientHello: freebytes(m->u.clientHello.sid); freeints(m->u.clientHello.ciphers); + m->u.clientHello.ciphers = nil; freebytes(m->u.clientHello.compressors); break; case HServerHello: @@ -1435,7 +1439,7 @@ tlsConnectionFree(TlsConnection *c) tlsSecClose(c->sec); freebytes(c->sid); freebytes(c->cert); - memset(c, 0, sizeof(c)); + memset(c, 0, sizeof *c); free(c); } @@ -1546,12 +1550,14 @@ initCiphers(void) j = open("#a/tls/encalgs", OREAD); if(j < 0){ werrstr("can't open #a/tls/encalgs: %r"); + unlock(&ciphLock); return 0; } n = read(j, s, MaxAlgF-1); close(j); if(n <= 0){ werrstr("nothing in #a/tls/encalgs: %r"); + unlock(&ciphLock); return 0; } s[n] = 0; @@ -1570,12 +1576,14 @@ initCiphers(void) j = open("#a/tls/hashalgs", OREAD); if(j < 0){ werrstr("can't open #a/tls/hashalgs: %r"); + unlock(&ciphLock); return 0; } n = read(j, s, MaxAlgF-1); close(j); if(n <= 0){ werrstr("nothing in #a/tls/hashalgs: %r"); + unlock(&ciphLock); return 0; } s[n] = 0; @@ -1899,6 +1907,11 @@ tlsSecFinished(TlsSec *sec, HandHash hs, uchar *fin, int nfin, int isclient) } hs.md5.malloced = 0; hs.sha1.malloced = 0; + if(sec->setFinished == nil ){ + sec->ok = -1; + werrstr("nil sec->setFinished in tlsSecFinished"); + return -1; + } (*sec->setFinished)(sec, hs, fin, isclient); return 1; } @@ -1951,6 +1964,8 @@ setVers(TlsSec *sec, int v) break; default: werrstr("invalid version"); + sec->setFinished = nil; + sec->prf = nil; return -1; } sec->vers = v; @@ -1967,6 +1982,10 @@ setVers(TlsSec *sec, int v) static void setSecrets(TlsSec *sec, uchar *kd, int nkd) { + if (sec->prf == nil) { + werrstr("nil sec->prf in setSecrets"); + return; + } (*sec->prf)(kd, nkd, sec->sec, MasterSecretSize, "key expansion", sec->srandom, RandomSize, sec->crandom, RandomSize); } @@ -2086,6 +2105,10 @@ tlsSetFinished(TlsSec *sec, HandHash hs, uchar *finished, int isClient) label = "client finished"; else label = "server finished"; + if (sec->prf == nil) { + werrstr("nil sec->prf in tlsSetFinished"); + return; + } (*sec->prf)(finished, TLSFinishedLen, sec->sec, MasterSecretSize, label, h0, MD5dlen, h1, SHA1dlen); } @@ -2262,7 +2285,8 @@ pkcs1_decrypt(TlsSec *sec, uchar *epm, int nepm) if(i < modlen - 1) ans = makebytes(eb->data+i+1, modlen-(i+1)); } - freebytes(eb); + if (eb != ans) /* not freed above? */ + freebytes(eb); return ans; }