diff options
author | cinap_lenrek <cinap_lenrek@gmx.de> | 2013-09-14 19:19:08 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@gmx.de> | 2013-09-14 19:19:08 +0200 |
commit | 56836bfdbdca9fd6a5b608d249d178a22d3337d8 (patch) | |
tree | 75b84ef6650f92a48ba70823cb1e22f27d1d39bd /sys/src/libsec | |
parent | be5992955d4e417ca625b07af93a800464d4c11f (diff) |
tls: fix various tlsClient()/tlsServer() related bugs
- TLSconn structure on stack but not initialized (zeroed)
- original filedescriptor double closed in error case
- original filedescriptor leaked in success case
- leaked TLSconn.sessionID and TLSconn.cert
- clarify in pushtls(2) and pushssl(2)
Diffstat (limited to 'sys/src/libsec')
-rw-r--r-- | sys/src/libsec/port/tlshand.c | 50 |
1 files changed, 31 insertions, 19 deletions
diff --git a/sys/src/libsec/port/tlshand.c b/sys/src/libsec/port/tlshand.c index c9dd093db..2ad92e37a 100644 --- a/sys/src/libsec/port/tlshand.c +++ b/sys/src/libsec/port/tlshand.c @@ -335,8 +335,8 @@ tlsServer(int fd, TLSconn *conn) return -1; } buf[n] = 0; - sprint(conn->dir, "#a/tls/%s", buf); - sprint(dname, "#a/tls/%s/hand", buf); + snprint(conn->dir, sizeof(conn->dir), "#a/tls/%s", buf); + snprint(dname, sizeof(dname), "#a/tls/%s/hand", buf); hand = open(dname, ORDWR); if(hand < 0){ close(ctl); @@ -344,27 +344,32 @@ tlsServer(int fd, TLSconn *conn) } fprint(ctl, "fd %d 0x%x", fd, ProtocolVersion); tls = tlsServer2(ctl, hand, conn->cert, conn->certlen, conn->trace, conn->chain); - sprint(dname, "#a/tls/%s/data", buf); + snprint(dname, sizeof(dname), "#a/tls/%s/data", buf); data = open(dname, ORDWR); - close(fd); close(hand); close(ctl); - if(data < 0) - return -1; - if(tls == nil){ - close(data); + if(data < 0 || tls == nil){ + if(tls != nil) + tlsConnectionFree(tls); return -1; } - if(conn->cert) - free(conn->cert); + free(conn->cert); conn->cert = 0; // client certificates are not yet implemented conn->certlen = 0; conn->sessionIDlen = tls->sid->len; conn->sessionID = emalloc(conn->sessionIDlen); memcpy(conn->sessionID, tls->sid->data, conn->sessionIDlen); - if(conn->sessionKey != nil && conn->sessionType != nil && strcmp(conn->sessionType, "ttls") == 0) - tls->sec->prf(conn->sessionKey, conn->sessionKeylen, tls->sec->sec, MasterSecretSize, conn->sessionConst, tls->sec->crandom, RandomSize, tls->sec->srandom, RandomSize); + if(conn->sessionKey != nil + && conn->sessionType != nil + && strcmp(conn->sessionType, "ttls") == 0) + tls->sec->prf( + conn->sessionKey, conn->sessionKeylen, + tls->sec->sec, MasterSecretSize, + conn->sessionConst, + tls->sec->crandom, RandomSize, + tls->sec->srandom, RandomSize); tlsConnectionFree(tls); + close(fd); return data; } @@ -378,7 +383,7 @@ tlsClient(int fd, TLSconn *conn) int n, data, ctl, hand; TlsConnection *tls; - if(!conn) + if(conn == nil) return -1; ctl = open("#a/tls/clone", ORDWR); if(ctl < 0) @@ -389,14 +394,14 @@ tlsClient(int fd, TLSconn *conn) return -1; } buf[n] = 0; - sprint(conn->dir, "#a/tls/%s", buf); - sprint(dname, "#a/tls/%s/hand", buf); + snprint(conn->dir, sizeof(conn->dir), "#a/tls/%s", buf); + snprint(dname, sizeof(dname), "#a/tls/%s/hand", buf); hand = open(dname, ORDWR); if(hand < 0){ close(ctl); return -1; } - sprint(dname, "#a/tls/%s/data", buf); + snprint(dname, sizeof(dname), "#a/tls/%s/data", buf); data = open(dname, ORDWR); if(data < 0){ close(hand); @@ -407,7 +412,6 @@ tlsClient(int fd, TLSconn *conn) tls = tlsClient2(ctl, hand, conn->sessionID, conn->sessionIDlen, conn->cert, conn->certlen, conn->trace); close(hand); close(ctl); - close(fd); if(tls == nil){ close(data); return -1; @@ -418,9 +422,17 @@ tlsClient(int fd, TLSconn *conn) conn->sessionIDlen = tls->sid->len; conn->sessionID = emalloc(conn->sessionIDlen); memcpy(conn->sessionID, tls->sid->data, conn->sessionIDlen); - if(conn->sessionKey != nil && conn->sessionType != nil && strcmp(conn->sessionType, "ttls") == 0) - tls->sec->prf(conn->sessionKey, conn->sessionKeylen, tls->sec->sec, MasterSecretSize, conn->sessionConst, tls->sec->crandom, RandomSize, tls->sec->srandom, RandomSize); + if(conn->sessionKey != nil + && conn->sessionType != nil + && strcmp(conn->sessionType, "ttls") == 0) + tls->sec->prf( + conn->sessionKey, conn->sessionKeylen, + tls->sec->sec, MasterSecretSize, + conn->sessionConst, + tls->sec->crandom, RandomSize, + tls->sec->srandom, RandomSize); tlsConnectionFree(tls); + close(fd); return data; } |