dns_srv: Fix SRV sorting when records with priority zero exist with non-zero.
authorJoshua Colp <jcolp@digium.com>
Sun, 10 May 2015 13:36:51 +0000 (10:36 -0300)
committerJoshua Colp <jcolp@digium.com>
Sun, 10 May 2015 13:39:32 +0000 (10:39 -0300)
The DNS SRV sorting code currently has an issue when records with a priority
of zero exist with records of a non-zero priority. This occurs because the
sorting code considers zero to mean unset when in reality is a valid
value. If the current priority is zero it will get replaced with any remaining
record that has a priority of non-zero, until no records of those exist after
which the records of priority zero are handled.

This change makes it so that the priority of the first remaining record is
the current starting priority. There is also a small optimization to prevent
iterating records when the starting priority is already zero.

Change-Id: I103511f35b50428f770bd4db3ffef70fb6f82d35

main/dns_srv.c

index f5d038a..e4a3d8b 100644 (file)
@@ -112,13 +112,15 @@ void dns_srv_sort(struct ast_dns_result *result)
        struct dns_records newlist = AST_LIST_HEAD_NOLOCK_INIT_VALUE;
 
        while (AST_LIST_FIRST(&result->records)) {
-               unsigned short cur_priority = 0;
+               unsigned short cur_priority = ((struct ast_dns_srv_record *)(AST_LIST_FIRST(&result->records)))->priority;
                struct dns_records temp_list = AST_LIST_HEAD_NOLOCK_INIT_VALUE;
 
-               /* Find the lowest current priority to work on */
-               AST_LIST_TRAVERSE(&result->records, current, list) {
-                       if (!cur_priority || ((struct ast_dns_srv_record *)current)->priority < cur_priority) {
-                               cur_priority = ((struct ast_dns_srv_record *)current)->priority;
+               /* Find the lowest current priority to work on, but if the priority is already zero there is no lower priority */
+               if (cur_priority) {
+                       AST_LIST_TRAVERSE(&result->records, current, list) {
+                               if (((struct ast_dns_srv_record *)current)->priority < cur_priority) {
+                                       cur_priority = ((struct ast_dns_srv_record *)current)->priority;
+                               }
                        }
                }