summaryrefslogtreecommitdiff
path: root/usr.sbin
diff options
context:
space:
mode:
authorGilles Chehade <gilles@cvs.openbsd.org>2015-10-02 00:26:46 +0000
committerGilles Chehade <gilles@cvs.openbsd.org>2015-10-02 00:26:46 +0000
commitd3eb0332005ba9687d4756ae0c39ecd906793364 (patch)
tree267328d4109808311e834a4f656848531d9ba428 /usr.sbin
parentd7d87ad6d6313d5fc2f7cab325884f7ae12204af (diff)
do not allow connid to wrap and collide with another active connection id.
this allows a local user to trigger a fatal() and exit the daemon. reported by Qualys Security
Diffstat (limited to 'usr.sbin')
-rw-r--r--usr.sbin/smtpd/control.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/usr.sbin/smtpd/control.c b/usr.sbin/smtpd/control.c
index 834d126e016..68c2b992798 100644
--- a/usr.sbin/smtpd/control.c
+++ b/usr.sbin/smtpd/control.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: control.c,v 1.104 2015/06/11 19:27:16 gilles Exp $ */
+/* $OpenBSD: control.c,v 1.105 2015/10/02 00:26:45 gilles Exp $ */
/*
* Copyright (c) 2012 Gilles Chehade <gilles@poolp.org>
@@ -71,7 +71,7 @@ static void control_broadcast_verbose(int, int);
static struct stat_backend *stat_backend = NULL;
extern const char *backend_stat;
-static uint32_t connid = 0;
+static uint64_t connid = 0;
static struct tree ctl_conns;
static struct tree ctl_count;
static struct stat_digest digest;
@@ -365,10 +365,14 @@ control_accept(int listenfd, short event, void *arg)
}
(*count)++;
+ do {
+ ++connid;
+ } while (tree_get(&ctl_conns, connid));
+
c = xcalloc(1, sizeof(*c), "control_accept");
c->euid = euid;
c->egid = egid;
- c->id = ++connid;
+ c->id = connid;
c->mproc.proc = PROC_CLIENT;
c->mproc.handler = control_dispatch_ext;
c->mproc.data = c;