]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Make nsupdate use OS-supplied ephemeral port range
authorMichał Kępień <michal@isc.org>
Wed, 6 Mar 2019 13:01:24 +0000 (14:01 +0100)
committerMichał Kępień <michal@isc.org>
Wed, 6 Mar 2019 13:03:09 +0000 (14:03 +0100)
Make nsupdate honor the operating system's preferred ephemeral port
range instead of always using the default 1024-65535 range for outgoing
messages.

(cherry picked from commit 06f582f23e7e3204a110d9b5a619c4d9ce451f07)

bin/nsupdate/nsupdate.c

index 548e0ce1079483c6145287374cbc156ac831112e..de60313f08cb48a04b5906dbdfc4b0deea7d63c1 100644 (file)
@@ -33,6 +33,7 @@
 #include <isc/log.h>
 #include <isc/mem.h>
 #include <isc/parseint.h>
+#include <isc/portset.h>
 #include <isc/print.h>
 #include <isc/random.h>
 #include <isc/region.h>
@@ -850,6 +851,34 @@ shutdown_program(isc_task_t *task, isc_event_t *event) {
        maybeshutdown();
 }
 
+/*
+ * Try honoring the operating system's preferred ephemeral port range.
+ */
+static void
+set_source_ports(dns_dispatchmgr_t *manager) {
+       isc_portset_t *v4portset = NULL, *v6portset = NULL;
+       in_port_t udpport_low, udpport_high;
+       isc_result_t result;
+
+       result = isc_portset_create(gmctx, &v4portset);
+       check_result(result, "isc_portset_create (v4)");
+       result = isc_net_getudpportrange(AF_INET, &udpport_low, &udpport_high);
+       check_result(result, "isc_net_getudpportrange (v4)");
+       isc_portset_addrange(v4portset, udpport_low, udpport_high);
+
+       result = isc_portset_create(gmctx, &v6portset);
+       check_result(result, "isc_portset_create (v6)");
+       result = isc_net_getudpportrange(AF_INET6, &udpport_low, &udpport_high);
+       check_result(result, "isc_net_getudpportrange (v6)");
+       isc_portset_addrange(v6portset, udpport_low, udpport_high);
+
+       result = dns_dispatchmgr_setavailports(manager, v4portset, v6portset);
+       check_result(result, "dns_dispatchmgr_setavailports");
+
+       isc_portset_destroy(gmctx, &v4portset);
+       isc_portset_destroy(gmctx, &v6portset);
+}
+
 static void
 setup_system(void) {
        isc_result_t result;
@@ -975,6 +1004,8 @@ setup_system(void) {
        check_result(result, "dst_lib_init");
        is_dst_up = true;
 
+       set_source_ports(dispatchmgr);
+
        attrmask = DNS_DISPATCHATTR_UDP | DNS_DISPATCHATTR_TCP;
        attrmask |= DNS_DISPATCHATTR_IPV4 | DNS_DISPATCHATTR_IPV6;