aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Faurot <eric@faurot.net>2014-05-12 16:39:17 +0200
committerEric Faurot <eric@faurot.net>2014-05-12 16:39:17 +0200
commitb9c3e800a31b892cbced2ece18f6a43457e3b3c7 (patch)
tree8e21ef62d83eccbb2d82eae51aaaa0fe082fc55b
parentremove some refernces to MFA (diff)
downloadOpenSMTPD-b9c3e800a31b892cbced2ece18f6a43457e3b3c7.tar.xz
OpenSMTPD-b9c3e800a31b892cbced2ece18f6a43457e3b3c7.zip
Fix a possible double free when tls is required but not advertised by
the server.
-rw-r--r--smtpd/mta_session.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/smtpd/mta_session.c b/smtpd/mta_session.c
index 520aab9a..efe3e00c 100644
--- a/smtpd/mta_session.c
+++ b/smtpd/mta_session.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: mta_session.c,v 1.60 2014/04/19 13:35:51 gilles Exp $ */
+/* $OpenBSD$ */
/*
* Copyright (c) 2008 Pierre-Yves Ritschard <pyr@openbsd.org>
@@ -91,6 +91,7 @@ enum mta_state {
#define MTA_LMTP 0x0800
#define MTA_WAIT 0x1000
#define MTA_HANGON 0x2000
+#define MTA_RECONN 0x4000
#define MTA_EXT_STARTTLS 0x01
#define MTA_EXT_PIPELINING 0x02
@@ -633,7 +634,7 @@ mta_enter_state(struct mta_session *s, int newstate)
else if ((s->ext & MTA_EXT_STARTTLS) == 0) {
if (s->flags & MTA_FORCE_TLS || s->flags & MTA_WANT_SECURE) {
mta_error(s, "TLS required but not supported by remote host");
- mta_connect(s);
+ s->flags |= MTA_RECONN;
}
else
/* server doesn't support starttls, do not use it */
@@ -1250,6 +1251,11 @@ mta_io(struct io *io, int evt)
mta_free(s);
return;
}
+ if (s->flags & MTA_RECONN) {
+ s->flags &= ~MTA_RECONN;
+ mta_connect(s);
+ return;
+ }
iobuf_normalize(&s->iobuf);