summaryrefslogtreecommitdiff
path: root/main/dns_srv.c
diff options
context:
space:
mode:
authorJoshua Colp <jcolp@digium.com>2015-05-10 10:36:51 -0300
committerJoshua Colp <jcolp@digium.com>2015-05-10 10:39:32 -0300
commitf82bd76e3c6672b4796d8742baa8125067de3ccf (patch)
tree67e98f65479bb0918d63d78a31fa886175228757 /main/dns_srv.c
parent32eb812b28ffc1745e08cb507d8c4409d3ed297a (diff)
dns_srv: Fix SRV sorting when records with priority zero exist with non-zero.
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
Diffstat (limited to 'main/dns_srv.c')
-rw-r--r--main/dns_srv.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/main/dns_srv.c b/main/dns_srv.c
index f5d038ae7..e4a3d8bbd 100644
--- a/main/dns_srv.c
+++ b/main/dns_srv.c
@@ -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;
+ }
}
}