]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MINOR: dns: allow srv record weight set to 0
authorBaptiste Assmann <bedis9@gmail.com>
Mon, 21 Oct 2019 13:13:48 +0000 (15:13 +0200)
committerChristopher Faulet <cfaulet@haproxy.com>
Tue, 22 Oct 2019 11:44:12 +0000 (13:44 +0200)
Processing of SRV record weight was inaccurate and when a SRV record's
weight was set to 0, HAProxy enforced it to '1'.
This patch aims at fixing this without breaking compability with
previous behavior.

Backport status: 1.8 to 2.0

src/dns.c

index 0ce6e83029d2c16cf4a8bdb158c9243e01e9362c..15d40a13a2142134cedd862d4a096874a3fe45cf 100644 (file)
--- a/src/dns.c
+++ b/src/dns.c
@@ -543,10 +543,12 @@ static void dns_check_dns_response(struct dns_resolution *res)
                                    !memcmp(srv->hostname_dn, item->target, item->data_len)) {
                                        int ha_weight;
 
-                                       /* Make sure weight is at least 1, so
-                                        * that the server will be used.
+                                       /* DNS weight range if from 0 to 65535
+                                        * HAProxy weight is from 0 to 256
+                                        * The rule below ensures that weight 0 is well respected
+                                        * while allowing a "mapping" from DNS weight into HAProxy's one.
                                         */
-                                       ha_weight = item->weight / 256 + 1;
+                                       ha_weight = (item->weight + 255) / 256;
                                        if (srv->uweight != ha_weight) {
                                                char weight[9];
 
@@ -590,10 +592,12 @@ static void dns_check_dns_response(struct dns_resolution *res)
                                    !(srv->flags & SRV_F_CHECKPORT))
                                        srv->check.port = item->port;
 
-                               /* Make sure weight is at least 1, so
-                                * that the server will be used.
+                               /* DNS weight range if from 0 to 65535
+                                * HAProxy weight is from 0 to 256
+                                * The rule below ensures that weight 0 is well respected
+                                * while allowing a "mapping" from DNS weight into HAProxy's one.
                                 */
-                               ha_weight = item->weight / 256 + 1;
+                               ha_weight = (item->weight + 255) / 256;
 
                                snprintf(weight, sizeof(weight), "%d", ha_weight);
                                server_parse_weight_change_request(srv, weight);