]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Fix config bug related to port setting
authorMatthijs Mekking <matthijs@isc.org>
Wed, 26 Oct 2022 07:55:55 +0000 (09:55 +0200)
committerMatthijs Mekking <matthijs@isc.org>
Thu, 27 Oct 2022 10:18:18 +0000 (12:18 +0200)
There are three levels there for the port value, with increasing
priority:

1. The default ports, defined by 'port' and 'tls-port' config options.
2. The primaries-level default port: primaries port <number>  { ... };
3. The primaries element-level port: primaries { <address> port
   <number>; ... };"

In 'named_config_getipandkeylist()', the 'def_port' and 'def_tlsport'
variables are extracted from level 1. The 'port' variable is extracted
from the level 2. Currently if that is unset, it defaults to the
default port ('def_port' or 'def_tlsport' depending on the transport
used), but overrides the level 2 port setting for the next primaries in
the list.

Update the code such that we inherit the port only if the level 3 port
is not set, and inherit from the default ports if the level 2 port is
also not set.

(cherry picked from commit 72d3bf8e4ed9c9ad189141e191ce1bcb2d3b9190)

bin/named/config.c

index 7743645eb3c2baf4a8ef274a44d2fa224928220e..4c956a72a514b23b0bb2abcc6d86daedce1eb6d1 100644 (file)
@@ -881,18 +881,22 @@ resume:
                        goto cleanup;
                }
 
-               /* Set the default port or tls-port */
-               if (port == 0) {
-                       if (tlss[i] != NULL) {
-                               port = def_tlsport;
-                       } else {
-                               port = def_port;
+               /* If the port is unset, take it from one of the upper levels */
+               if (isc_sockaddr_getport(&addrs[i]) == 0) {
+                       in_port_t addr_port = port;
+
+                       /* If unset, use the default port or tls-port */
+                       if (addr_port == 0) {
+                               if (tlss[i] != NULL) {
+                                       addr_port = def_tlsport;
+                               } else {
+                                       addr_port = def_port;
+                               }
                        }
-               }
 
-               if (isc_sockaddr_getport(&addrs[i]) == 0) {
-                       isc_sockaddr_setport(&addrs[i], port);
+                       isc_sockaddr_setport(&addrs[i], addr_port);
                }
+
                i++;
        }
        if (pushed != 0) {