summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacek Masiulaniec <jacekm@cvs.openbsd.org>2009-01-12 19:56:28 +0000
committerJacek Masiulaniec <jacekm@cvs.openbsd.org>2009-01-12 19:56:28 +0000
commitacbb8396dea49cce77c5e4ab0f56536242c207c8 (patch)
treeaa61d417ab53bf134d6dc711da8c7f61b5c94b34
parent804baf80997663515e2df25cec9c289468eded8a (diff)
dot escaping, as required by rfc; ok gilles@
-rw-r--r--usr.sbin/smtpd/mta.c10
-rw-r--r--usr.sbin/smtpd/smtp_session.c12
2 files changed, 19 insertions, 3 deletions
diff --git a/usr.sbin/smtpd/mta.c b/usr.sbin/smtpd/mta.c
index 4f3bf21f67a..3432a27daf2 100644
--- a/usr.sbin/smtpd/mta.c
+++ b/usr.sbin/smtpd/mta.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: mta.c,v 1.12 2009/01/01 16:15:47 jacekm Exp $ */
+/* $OpenBSD: mta.c,v 1.13 2009/01/12 19:56:27 jacekm Exp $ */
/*
* Copyright (c) 2008 Pierre-Yves Ritschard <pyr@openbsd.org>
@@ -769,6 +769,14 @@ mta_write_handler(struct bufferevent *bev, void *arg)
lbuf[len] = '\0';
buf = lbuf;
}
+
+ /* "If first character of the line is a period, one
+ * additional period is inserted at the beginning."
+ * [4.5.2]
+ */
+ if (*buf == '.')
+ evbuffer_add_printf(batchp->bev->output, ".");
+
evbuffer_add_printf(batchp->bev->output, "%s\r\n", buf);
free(lbuf);
lbuf = NULL;
diff --git a/usr.sbin/smtpd/smtp_session.c b/usr.sbin/smtpd/smtp_session.c
index da5a61dc90b..a1ca0cb1b74 100644
--- a/usr.sbin/smtpd/smtp_session.c
+++ b/usr.sbin/smtpd/smtp_session.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: smtp_session.c,v 1.39 2009/01/04 00:58:59 gilles Exp $ */
+/* $OpenBSD: smtp_session.c,v 1.40 2009/01/12 19:56:27 jacekm Exp $ */
/*
* Copyright (c) 2008 Gilles Chehade <gilles@openbsd.org>
@@ -818,7 +818,7 @@ read:
int
session_read_data(struct session *s, char *line, size_t nread)
{
- size_t len = strlen(line);
+ size_t len;
size_t i;
if (strcmp(line, ".") == 0) {
@@ -849,6 +849,14 @@ session_read_data(struct session *s, char *line, size_t nread)
return 0;
}
+ /* "If the first character is a period and there are other characters
+ * on the line, the first character is deleted." [4.5.2]
+ */
+ if (*line == '.')
+ line++;
+
+ len = strlen(line);
+
if (fwrite(line, len, 1, s->s_msg.datafp) != 1 ||
fwrite("\n", 1, 1, s->s_msg.datafp) != 1) {
s->s_msg.status |= S_MESSAGE_TEMPFAILURE;