Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/external/bsd/dhcp/dist/relay Fix buggy dhcrelay(8) requireme...



details:   https://anonhg.NetBSD.org/src/rev/252161e1f5d5
branches:  trunk
changeset: 824431:252161e1f5d5
user:      manu <manu%NetBSD.org@localhost>
date:      Mon Jun 05 07:35:23 2017 +0000

description:
Fix buggy dhcrelay(8) requirement to stay in foreground

This version of dhcrelay(8) needed to stay inforeground with -d flag in
order to service requests. Running inbackground turned it deaf to DHCP
requests.

This was caused by wrong kqueue(2) usage, where kevent(2) was used with
a file descriptor obtained by a kqueue(2) call done before fork(2).
kqueue(2) man page says "The queue is not inherited by a child created
with fork(2)". As a result, kevent(2) calls always got EBADF.

The fix is to reorder function calls in dhcrelay(8) main() function.
dhcp_context_create(), which causes kqueue(2) to be invoked, is
moved with its dependencies after fork(2). This matches the code layout
of dhclient(8) and dhcpd(8), which do not have the bug.

The fix was not submitted upstream since latest ISC DHCP code was
refactored and does not have the bug anymore.

diffstat:

 external/bsd/dhcp/dist/relay/dhcrelay.c |  42 ++++++++++++++++----------------
 1 files changed, 21 insertions(+), 21 deletions(-)

diffs (84 lines):

diff -r 0789a7fc5111 -r 252161e1f5d5 external/bsd/dhcp/dist/relay/dhcrelay.c
--- a/external/bsd/dhcp/dist/relay/dhcrelay.c   Mon Jun 05 02:15:55 2017 +0000
+++ b/external/bsd/dhcp/dist/relay/dhcrelay.c   Mon Jun 05 07:35:23 2017 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: dhcrelay.c,v 1.6 2016/01/10 20:10:45 christos Exp $    */
+/*     $NetBSD: dhcrelay.c,v 1.7 2017/06/05 07:35:23 manu Exp $        */
 /* dhcrelay.c
 
    DHCP/BOOTP Relay Agent. */
@@ -28,7 +28,7 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: dhcrelay.c,v 1.6 2016/01/10 20:10:45 christos Exp $");
+__RCSID("$NetBSD: dhcrelay.c,v 1.7 2017/06/05 07:35:23 manu Exp $");
 
 #include "dhcpd.h"
 #include <syslog.h>
@@ -207,13 +207,6 @@
        setlogmask(LOG_UPTO(LOG_INFO));
 #endif 
 
-       /* Set up the isc and dns library managers */
-       status = dhcp_context_create(DHCP_CONTEXT_PRE_DB | DHCP_CONTEXT_POST_DB,
-                                    NULL, NULL);
-       if (status != ISC_R_SUCCESS)
-               log_fatal("Can't initialize context: %s",
-                         isc_result_totext(status));
-
        /* Set up the OMAPI. */
        status = omapi_init();
        if (status != ISC_R_SUCCESS)
@@ -536,17 +529,6 @@
        }
 #endif
 
-       /* Get the current time... */
-       gettimeofday(&cur_tv, NULL);
-
-       /* Discover all the network interfaces. */
-       discover_interfaces(DISCOVER_RELAY);
-
-#ifdef DHCPv6
-       if (local_family == AF_INET6)
-               setup_streams();
-#endif
-
        /* Become a daemon... */
        if (!no_daemon) {
                int pid;
@@ -587,6 +569,24 @@
                IGNORE_RET (chdir("/"));
        }
 
+       /* Set up the isc and dns library managers */
+       status = dhcp_context_create(DHCP_CONTEXT_PRE_DB | DHCP_CONTEXT_POST_DB,
+                                    NULL, NULL);
+       if (status != ISC_R_SUCCESS)
+               log_fatal("Can't initialize context: %s",
+                         isc_result_totext(status));
+
+       /* Get the current time... */
+       gettimeofday(&cur_tv, NULL);
+
+       /* Discover all the network interfaces. */
+       discover_interfaces(DISCOVER_RELAY);
+
+#ifdef DHCPv6
+       if (local_family == AF_INET6)
+               setup_streams();
+#endif
+
        /* Set up the packet handler... */
        if (local_family == AF_INET)
                bootp_packet_handler = do_relay4;
@@ -948,7 +948,7 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: dhcrelay.c,v 1.6 2016/01/10 20:10:45 christos Exp $");
+__RCSID("$NetBSD: dhcrelay.c,v 1.7 2017/06/05 07:35:23 manu Exp $");
 static int
 add_relay_agent_options(struct interface_info *ip, struct dhcp_packet *packet,
                        unsigned length, struct in_addr giaddr) {



Home | Main Index | Thread Index | Old Index