upas/fs: fix potential filedescriptor leaks
This commit is contained in:
parent
1d4fff69c6
commit
474c2c8a2c
|
@ -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:
|
||||||
close(imap->fd);
|
if(err != nil){
|
||||||
return err;
|
if(imap->fd >= 0){
|
||||||
|
close(imap->fd);
|
||||||
|
imap->fd = -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
return err;
|
||||||
return nil;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
|
@ -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:
|
||||||
close(pop->fd);
|
if(err != nil){
|
||||||
return err;
|
if(pop->fd >= 0){
|
||||||
|
close(pop->fd);
|
||||||
|
pop->fd = -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
return err;
|
||||||
return nil;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -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)
|
||||||
|
|
Loading…
Reference in a new issue