From b9f56d578ebfd649b5d829960540859ac6ca931c Mon Sep 17 00:00:00 2001
From: Catalin Enache <catalin.enache@windriver.com>
Date: Tue, 12 Apr 2016 18:23:31 +0300
Subject: [PATCH] Add patch to limit the value of an fd we accept for a
 connection.

By limiting the highest value we accept for an fd we limit the number
of connections.

Upstream-Status: Backport
CVE: CVE-2016-2774

Author: Shawn Routhier <sar@isc.org>
Signed-off-by: Catalin Enache <catalin.enache@windriver.com>
---
 includes/site.h   | 6 ++++++
 omapip/listener.c | 9 +++++++--
 3 files changed, 18 insertions(+), 2 deletions(-)

diff --git a/includes/site.h b/includes/site.h
index 9c33de3..df020c8 100644
--- a/includes/site.h
+++ b/includes/site.h
@@ -290,6 +290,12 @@
    this option will be removed at some time. */
 /* #define INCLUDE_OLD_DHCP_ISC_ERROR_CODES */
 
+/* Limit the value of a file descriptor the serve will use
+   when accepting a connecting request.  This can be used to
+   limit the number of TCP connections that the server will
+   allow at one time.  A value of 0 means there is no limit.*/
+#define MAX_FD_VALUE 200
+
 /* Include definitions for various options.  In general these
    should be left as is, but if you have already defined one
    of these and prefer your definition you can comment the 
diff --git a/omapip/listener.c b/omapip/listener.c
index 8bdcdbd..61473cf 100644
--- a/omapip/listener.c
+++ b/omapip/listener.c
@@ -3,7 +3,7 @@
    Subroutines that support the generic listener object. */
 
 /*
- * Copyright (c) 2012,2014 by Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (c) 2012,2014,2016 by Internet Systems Consortium, Inc. ("ISC")
  * Copyright (c) 2004,2007,2009 by Internet Systems Consortium, Inc. ("ISC")
  * Copyright (c) 1999-2003 by Internet Software Consortium
  *
@@ -233,7 +233,12 @@ isc_result_t omapi_accept (omapi_object_t *h)
 			return ISC_R_NORESOURCES;
 		return ISC_R_UNEXPECTED;
 	}
-	
+
+	if ((MAX_FD_VALUE != 0) && (socket > MAX_FD_VALUE)) {
+		close(socket);
+		return (ISC_R_NORESOURCES);
+	}
+
 #if defined (TRACING)
 	/* If we're recording a trace, remember the connection. */
 	if (trace_record ()) {
-- 
2.7.4
