summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacek Masiulaniec <jacekm@cvs.openbsd.org>2008-12-18 15:11:22 +0000
committerJacek Masiulaniec <jacekm@cvs.openbsd.org>2008-12-18 15:11:22 +0000
commita5cecaa12864a93e4fe731b0b7f4888f6a87a523 (patch)
tree0cb582dd4e65c3336f5c578b0225ae5ac5493073
parent80958c80f41e8e034f1f8e5781e0d8e3456ee627 (diff)
Cleanup /incoming before handling each MAIL FROM.
Improve cleanup condition to cover more cases. ok gilles@
-rw-r--r--usr.sbin/smtpd/queue.c5
-rw-r--r--usr.sbin/smtpd/smtp_session.c43
2 files changed, 25 insertions, 23 deletions
diff --git a/usr.sbin/smtpd/queue.c b/usr.sbin/smtpd/queue.c
index 0db5423a6ea..dd37bcaa1f6 100644
--- a/usr.sbin/smtpd/queue.c
+++ b/usr.sbin/smtpd/queue.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: queue.c,v 1.30 2008/12/17 18:47:37 jacekm Exp $ */
+/* $OpenBSD: queue.c,v 1.31 2008/12/18 15:11:21 jacekm Exp $ */
/*
* Copyright (c) 2008 Gilles Chehade <gilles@openbsd.org>
@@ -199,8 +199,7 @@ queue_dispatch_smtp(int sig, short event, void *p)
struct message *messagep;
messagep = imsg.data;
- if (messagep->message_id[0] != '\0')
- queue_delete_incoming_message(messagep->message_id);
+ queue_delete_incoming_message(messagep->message_id);
break;
}
case IMSG_QUEUE_SUBMIT_ENVELOPE: {
diff --git a/usr.sbin/smtpd/smtp_session.c b/usr.sbin/smtpd/smtp_session.c
index 105feb28da6..d6f5f560223 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.27 2008/12/13 23:19:34 jacekm Exp $ */
+/* $OpenBSD: smtp_session.c,v 1.28 2008/12/18 15:11:21 jacekm Exp $ */
/*
* Copyright (c) 2008 Gilles Chehade <gilles@openbsd.org>
@@ -64,6 +64,7 @@ int session_set_path(struct path *, char *);
void session_timeout(int, short, void *);
void session_respond(struct session *, char *, ...)
__attribute__ ((format (printf, 2, 3)));
+void session_cleanup(struct session *);
struct session_timeout {
enum session_state state;
@@ -338,9 +339,9 @@ session_rfc5321_mail_handler(struct session *s, char *args)
return 1;
}
- s->s_msg.rcptcount = 0;
-
+ session_cleanup(s);
s->s_state = S_MAILREQUEST;
+ s->s_msg.rcptcount = 0;
s->s_msg.id = s->s_id;
s->s_msg.session_id = s->s_id;
s->s_msg.session_ss = s->s_ss;
@@ -689,10 +690,6 @@ read:
if (s->s_msg.status & S_MESSAGE_PERMFAILURE) {
session_respond(s, "554 Transaction failed");
-
- /* Remove message file */
- imsg_compose(s->s_env->sc_ibufs[PROC_QUEUE], IMSG_QUEUE_REMOVE_MESSAGE,
- 0, 0, -1, &s->s_msg, sizeof(s->s_msg));
free(line);
return;
}
@@ -757,22 +754,11 @@ session_write(struct bufferevent *bev, void *p)
void
session_destroy(struct session *s)
{
- /*
- * cleanup
- */
+ session_cleanup(s);
+
log_debug("session_destroy: killing client: %p", s);
close(s->s_fd);
- if (s->s_msg.datafp != NULL) {
- fclose(s->s_msg.datafp);
- s->s_msg.datafp = NULL;
- }
-
- if (s->s_state >= S_MAIL) {
- imsg_compose(s->s_env->sc_ibufs[PROC_QUEUE], IMSG_QUEUE_REMOVE_MESSAGE,
- 0, 0, -1, &s->s_msg, sizeof(s->s_msg));
- }
-
if (s->s_bev != NULL) {
bufferevent_free(s->s_bev);
}
@@ -784,6 +770,23 @@ session_destroy(struct session *s)
}
void
+session_cleanup(struct session *s)
+{
+ if (s->s_msg.datafp != NULL) {
+ fclose(s->s_msg.datafp);
+ s->s_msg.datafp = NULL;
+ }
+
+ if (s->s_msg.message_id[0] != '\0') {
+ imsg_compose(s->s_env->sc_ibufs[PROC_QUEUE],
+ IMSG_QUEUE_REMOVE_MESSAGE, 0, 0, -1, &s->s_msg,
+ sizeof(s->s_msg));
+ s->s_msg.message_id[0] = '\0';
+ s->s_msg.message_uid[0] = '\0';
+ }
+}
+
+void
session_error(struct bufferevent *bev, short event, void *p)
{
struct session *s = p;