summaryrefslogtreecommitdiff
path: root/sys/src/cmd/upas/fs
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@gmx.de>2012-11-28 08:51:50 +0100
committercinap_lenrek <cinap_lenrek@gmx.de>2012-11-28 08:51:50 +0100
commit8b7897b57a0df3e2f6f50ae866f1ab829322387a (patch)
treea1f3f881571a830ee71d796ed9f35857cedff6c7 /sys/src/cmd/upas/fs
parenta8fc4ddc6d6af888f9f68d2c1ee9adffcc74cc73 (diff)
upas/fs: fix tlsClient() memory leaks
Diffstat (limited to 'sys/src/cmd/upas/fs')
-rw-r--r--sys/src/cmd/upas/fs/imap4.c16
-rw-r--r--sys/src/cmd/upas/fs/pop3.c26
2 files changed, 26 insertions, 16 deletions
diff --git a/sys/src/cmd/upas/fs/imap4.c b/sys/src/cmd/upas/fs/imap4.c
index 9c4ce574a..7ddf33d3b 100644
--- a/sys/src/cmd/upas/fs/imap4.c
+++ b/sys/src/cmd/upas/fs/imap4.c
@@ -399,7 +399,6 @@ starttls(Imap *imap, TLSconn *connp)
int sfd;
uchar digest[SHA1dlen];
- fmtinstall('H', encodefmt);
memset(connp, 0, sizeof *connp);
sfd = tlsClient(imap->fd, connp);
if(sfd < 0) {
@@ -414,6 +413,7 @@ starttls(Imap *imap, TLSconn *connp)
sha1(connp->cert, connp->certlen, digest, nil);
if(!imap->thumb || !okThumbprint(digest, imap->thumb)){
close(sfd);
+ fmtinstall('H', encodefmt);
werrstr("server certificate %.*H not recognized",
SHA1dlen, digest);
return -1;
@@ -451,10 +451,10 @@ imap4dial(Imap *imap)
if(imap->mustssl){
sfd = starttls(imap, &conn);
- if (sfd < 0) {
- free(conn.cert);
+ free(conn.cert);
+ free(conn.sessionID);
+ if(sfd < 0)
return imaperrstr(imap->host, port);
- }
if(imap->debug){
char fn[128];
int fd;
@@ -463,9 +463,11 @@ imap4dial(Imap *imap)
fd = open(fn, ORDWR);
if(fd < 0)
fprint(2, "opening ctl: %r\n");
- if(fprint(fd, "debug") < 0)
- fprint(2, "writing ctl: %r\n");
- close(fd);
+ else {
+ if(fprint(fd, "debug") < 0)
+ fprint(2, "writing ctl: %r\n");
+ close(fd);
+ }
}
}
Binit(&imap->bin, imap->fd, OREAD);
diff --git a/sys/src/cmd/upas/fs/pop3.c b/sys/src/cmd/upas/fs/pop3.c
index bd51a1a2f..fbb6f6c5e 100644
--- a/sys/src/cmd/upas/fs/pop3.c
+++ b/sys/src/cmd/upas/fs/pop3.c
@@ -119,31 +119,39 @@ pop3pushtls(Pop *pop)
int fd;
uchar digest[SHA1dlen];
TLSconn conn;
+ char *err;
+ err = nil;
memset(&conn, 0, sizeof conn);
// conn.trace = pop3log;
fd = tlsClient(pop->fd, &conn);
- if(fd < 0)
- return "tls error";
+ if(fd < 0){
+ err = "tls error";
+ goto out;
+ }
if(conn.cert==nil || conn.certlen <= 0){
- close(fd);
- return "server did not provide TLS certificate";
+ err = "server did not provide TLS certificate";
+ goto out;
}
sha1(conn.cert, conn.certlen, digest, nil);
if(!pop->thumb || !okThumbprint(digest, pop->thumb)){
fmtinstall('H', encodefmt);
- close(fd);
- free(conn.cert);
fprint(2, "upas/fs pop3: server certificate %.*H not recognized\n", SHA1dlen, digest);
- return "bad server certificate";
+ err = "bad server certificate";
+ goto out;
}
- free(conn.cert);
close(pop->fd);
pop->fd = fd;
pop->encrypted = 1;
Binit(&pop->bin, pop->fd, OREAD);
Binit(&pop->bout, pop->fd, OWRITE);
- return nil;
+ fd = -1;
+out:
+ free(conn.sessionID);
+ free(conn.cert);
+ if(fd >= 0)
+ close(fd);
+ return err;
}
//