summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoreric <eric@openbsd.org>2012-08-30 18:16:25 +0000
committereric <eric@openbsd.org>2012-08-30 18:16:25 +0000
commit30f45e1a493a787cc70dd9b12228542a251da692 (patch)
treef1b9912620079e9a1ef52e9b5d118d4dde25ee96
parentAdd the possibility to map DMA memory non-cached, based on the i386/amd64 (diff)
downloadwireguard-openbsd-30f45e1a493a787cc70dd9b12228542a251da692.tar.xz
wireguard-openbsd-30f45e1a493a787cc70dd9b12228542a251da692.zip
- correctly free the task if all rcpt where rejected
- fix refcounting - add some stat counters ok gilles@ chl@
-rw-r--r--usr.sbin/smtpd/mta.c9
-rw-r--r--usr.sbin/smtpd/mta_session.c13
2 files changed, 17 insertions, 5 deletions
diff --git a/usr.sbin/smtpd/mta.c b/usr.sbin/smtpd/mta.c
index 0b992ff4ba9..365062e8afd 100644
--- a/usr.sbin/smtpd/mta.c
+++ b/usr.sbin/smtpd/mta.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: mta.c,v 1.139 2012/08/29 16:26:17 gilles Exp $ */
+/* $OpenBSD: mta.c,v 1.140 2012/08/30 18:16:25 eric Exp $ */
/*
* Copyright (c) 2008 Pierre-Yves Ritschard <pyr@openbsd.org>
@@ -122,6 +122,7 @@ mta_imsg(struct imsgev *iev, struct imsg *imsg)
/* XXX honour route->maxrcpt */
TAILQ_INSERT_TAIL(&task->envelopes, e, entry);
+ stat_increment("mta.envelope", 1);
log_debug("mta: received evp:%016" PRIx64 " for <%s@%s>",
e->id, e->dest.user, e->dest.domain);
return;
@@ -138,6 +139,7 @@ mta_imsg(struct imsgev *iev, struct imsg *imsg)
task->route->refcount -= 1;
task->route->ntask += 1;
TAILQ_INSERT_TAIL(&task->route->tasks, task, entry);
+ stat_increment("mta.task", 1);
mta_route_drain(task->route);
}
free(batch);
@@ -440,6 +442,7 @@ mta_route_for(struct envelope *e)
route->maxrcpt = MTA_MAXRCPT;
log_trace(TRACE_MTA, "mta: new %s", mta_route_to_text(route));
+ stat_increment("mta.route", 1);
} else {
log_trace(TRACE_MTA, "mta: reusing %s", mta_route_to_text(route));
}
@@ -472,6 +475,7 @@ mta_route_drain(struct mta_route *route)
if (route->ntask == 0 && route->refcount == 0 && route->nsession == 0) {
mta_route_free(route);
+ stat_decrement("mta.route", 1);
return;
}
@@ -492,8 +496,8 @@ mta_route_drain(struct mta_route *route)
route->ntask -= 1;
while((e = TAILQ_FIRST(&task->envelopes)))
mta_envelope_done(task, e, route->errorline);
- route->refcount -= 1;
free(task);
+ stat_decrement("mta.task", 1);
}
route->nfail = 0;
/* XXX maybe close the route for while */
@@ -530,6 +534,7 @@ mta_envelope_done(struct mta_task *task, struct envelope *e, const char *status)
mta_response_delivery(e->errorline), 0, 0, -1, e, sizeof(*e));
TAILQ_REMOVE(&task->envelopes, e, entry);
free(e);
+ stat_decrement("mta.envelope", 1);
}
static int
diff --git a/usr.sbin/smtpd/mta_session.c b/usr.sbin/smtpd/mta_session.c
index db7f15a31a8..f66222342f5 100644
--- a/usr.sbin/smtpd/mta_session.c
+++ b/usr.sbin/smtpd/mta_session.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: mta_session.c,v 1.13 2012/08/21 20:19:46 eric Exp $ */
+/* $OpenBSD: mta_session.c,v 1.14 2012/08/30 18:16:25 eric Exp $ */
/*
* Copyright (c) 2008 Pierre-Yves Ritschard <pyr@openbsd.org>
@@ -152,7 +152,7 @@ mta_session(struct mta_route *route)
}
log_debug("mta: %p: spawned for %s", session, mta_route_to_text(route));
-
+ stat_increment("mta.session", 1);
mta_enter_state(session, MTA_INIT);
}
@@ -397,6 +397,7 @@ mta_enter_state(struct mta_session *s, int newstate)
}
route = s->route;
free(s);
+ stat_decrement("mta.session", 1);
mta_route_collect(route);
break;
@@ -454,6 +455,8 @@ mta_enter_state(struct mta_session *s, int newstate)
TAILQ_REMOVE(&s->route->tasks, s->task, entry);
s->route->ntask -= 1;
s->task->session = s;
+ stat_decrement("mta.task", 1);
+ stat_increment("mta.task.running", 1);
mta_enter_state(s, MTA_DATA);
} else {
log_debug("mta: %p: no pending task for %s", s,
@@ -598,6 +601,9 @@ mta_response(struct mta_session *s, char *line)
if (line[0] != '2') {
mta_envelope_done(s->task, evp, line);
if (TAILQ_EMPTY(&s->task->envelopes)) {
+ free(s->task);
+ s->task = NULL;
+ stat_decrement("mta.task.running", 1);
mta_enter_state(s, MTA_SMTP_RSET);
break;
}
@@ -833,6 +839,7 @@ mta_status(struct mta_session *s, int connerr, const char *fmt, ...)
mta_envelope_done(s->task, e, status);
free(s->task);
s->task = NULL;
+ stat_decrement("mta.task.running", 1);
}
if (connerr)
@@ -861,8 +868,8 @@ mta_envelope_done(struct mta_task *task, struct envelope *e, const char *status)
mta_response_delivery(e->errorline), 0, 0, -1, e, sizeof(*e));
TAILQ_REMOVE(&task->envelopes, e, entry);
-
free(e);
+ stat_decrement("mta.envelope", 1);
}
#define CASE(x) case x : return #x