upas/fs: fix potential filedescriptor leaks

This commit is contained in:
cinap_lenrek 2013-09-15 14:45:57 +02:00
parent 1d4fff69c6
commit 474c2c8a2c
2 changed files with 40 additions and 44 deletions

View file

@ -394,32 +394,32 @@ imaperrstr(char *host, char *port)
} }
static int static int
starttls(Imap *imap, TLSconn *connp) starttls(Imap *imap)
{ {
int sfd; int sfd;
uchar digest[SHA1dlen]; uchar digest[SHA1dlen];
TLSconn conn;
memset(connp, 0, sizeof *connp); memset(&conn, 0, sizeof(conn));
sfd = tlsClient(imap->fd, connp); sfd = tlsClient(imap->fd, &conn);
if(sfd < 0) { if(sfd < 0) {
werrstr("tlsClient: %r"); werrstr("tlsClient: %r");
return -1; return -1;
} }
if(connp->cert==nil || connp->certlen <= 0) { imap->fd = sfd;
close(sfd); free(conn.sessionID);
if(conn.cert==nil || conn.certlen <= 0) {
werrstr("server did not provide TLS certificate"); werrstr("server did not provide TLS certificate");
return -1; return -1;
} }
sha1(connp->cert, connp->certlen, digest, nil); sha1(conn.cert, conn.certlen, digest, nil);
free(conn.cert);
if(!imap->thumb || !okThumbprint(digest, imap->thumb)){ if(!imap->thumb || !okThumbprint(digest, imap->thumb)){
close(sfd);
fmtinstall('H', encodefmt); fmtinstall('H', encodefmt);
werrstr("server certificate %.*H not recognized", werrstr("server certificate %.*H not recognized",
SHA1dlen, digest); SHA1dlen, digest);
return -1; return -1;
} }
close(imap->fd);
imap->fd = sfd;
return sfd; return sfd;
} }
@ -430,8 +430,6 @@ static char*
imap4dial(Imap *imap) imap4dial(Imap *imap)
{ {
char *err, *port; char *err, *port;
int sfd;
TLSconn conn;
if(imap->fd >= 0){ if(imap->fd >= 0){
imap4cmd(imap, "noop"); imap4cmd(imap, "noop");
@ -450,35 +448,22 @@ imap4dial(Imap *imap)
return imaperrstr(imap->host, port); return imaperrstr(imap->host, port);
if(imap->mustssl){ if(imap->mustssl){
sfd = starttls(imap, &conn); if(starttls(imap) < 0){
free(conn.cert); err = imaperrstr(imap->host, port);
free(conn.sessionID); goto Out;
if(sfd < 0)
return imaperrstr(imap->host, port);
if(imap->debug){
char fn[128];
int fd;
snprint(fn, sizeof fn, "%s/ctl", conn.dir);
fd = open(fn, ORDWR);
if(fd < 0)
fprint(2, "opening ctl: %r\n");
else {
if(fprint(fd, "debug") < 0)
fprint(2, "writing ctl: %r\n");
close(fd);
}
} }
} }
Binit(&imap->bin, imap->fd, OREAD); Binit(&imap->bin, imap->fd, OREAD);
Binit(&imap->bout, imap->fd, OWRITE); Binit(&imap->bout, imap->fd, OWRITE);
err = imap4login(imap);
if(err = imap4login(imap)) { Out:
if(err != nil){
if(imap->fd >= 0){
close(imap->fd); close(imap->fd);
return err; imap->fd = -1;
} }
}
return nil; return err;
} }
// //
@ -487,9 +472,12 @@ imap4dial(Imap *imap)
static void static void
imap4hangup(Imap *imap) imap4hangup(Imap *imap)
{ {
if(imap->fd < 0)
return;
imap4cmd(imap, "LOGOUT"); imap4cmd(imap, "LOGOUT");
imap4resp(imap); imap4resp(imap);
close(imap->fd); close(imap->fd);
imap->fd = -1;
} }
// //

View file

@ -261,23 +261,29 @@ pop3dial(Pop *pop)
{ {
char *err; char *err;
if(pop->fd >= 0){
close(pop->fd);
pop->fd = -1;
}
if((pop->fd = dial(netmkaddr(pop->host, "net", pop->needssl ? "pop3s" : "pop3"), 0, 0, 0)) < 0) if((pop->fd = dial(netmkaddr(pop->host, "net", pop->needssl ? "pop3s" : "pop3"), 0, 0, 0)) < 0)
return geterrstr(); return geterrstr();
if(pop->needssl){ if(pop->needssl){
if((err = pop3pushtls(pop)) != nil) if((err = pop3pushtls(pop)) != nil)
return err; goto Out;
}else{ }else{
Binit(&pop->bin, pop->fd, OREAD); Binit(&pop->bin, pop->fd, OREAD);
Binit(&pop->bout, pop->fd, OWRITE); Binit(&pop->bout, pop->fd, OWRITE);
} }
err = pop3login(pop);
if(err = pop3login(pop)) { Out:
if(err != nil){
if(pop->fd >= 0){
close(pop->fd); close(pop->fd);
return err; pop->fd = -1;
} }
}
return nil; return err;
} }
// //
@ -286,9 +292,12 @@ pop3dial(Pop *pop)
static void static void
pop3hangup(Pop *pop) pop3hangup(Pop *pop)
{ {
if(pop->fd < 0)
return;
pop3cmd(pop, "QUIT"); pop3cmd(pop, "QUIT");
pop3resp(pop); pop3resp(pop);
close(pop->fd); close(pop->fd);
pop->fd = -1;
} }
// //
@ -563,12 +572,10 @@ pop3sync(Mailbox *mb, int doplumb)
Pop *pop; Pop *pop;
pop = mb->aux; pop = mb->aux;
if(err = pop3dial(pop)) { if(err = pop3dial(pop)) {
mb->waketime = time(0) + pop->refreshtime; mb->waketime = time(0) + pop->refreshtime;
return err; return err;
} }
if((err = pop3read(pop, mb, doplumb)) == nil){ if((err = pop3read(pop, mb, doplumb)) == nil){
pop3purge(pop, mb); pop3purge(pop, mb);
mb->d->atime = mb->d->mtime = time(0); mb->d->atime = mb->d->mtime = time(0);
@ -667,6 +674,7 @@ pop3mbox(Mailbox *mb, char *path)
} }
pop = emalloc(sizeof(*pop)); pop = emalloc(sizeof(*pop));
pop->fd = -1;
pop->freep = path; pop->freep = path;
pop->host = f[2]; pop->host = f[2];
if(nf < 4) if(nf < 4)