pbx_dundi: DUNDi weight parameter not processed correctly
authorSean Bright <sean.bright@gmail.com>
Tue, 21 Feb 2017 21:09:47 +0000 (16:09 -0500)
committerSean Bright <sean.bright@gmail.com>
Tue, 21 Feb 2017 23:10:34 +0000 (17:10 -0600)
The DUNDi weight field is not always converted from network byte order
to host byte order. This can result in incorrect weight values and
incorrect selection of DUNDi destinations.

ASTERISK-18731 #close
Reported by: Peter Racz
Patches:
dundi_weight.patch (license #6290) patch uploaded by Peter Racz

Change-Id: Iba3e1a700ff539db57211a7bbc26f7b22ea9a1be

pbx/pbx_dundi.c

index 50a9160..58086aa 100644 (file)
@@ -992,9 +992,9 @@ static int dundi_prop_precache(struct dundi_transaction *trans, struct dundi_ies
                                        sizeof(trans->parent->dr[trans->parent->respcount].tech));
                                trans->parent->respcount++;
                                ast_clear_flag_nonstd(trans->parent->hmd, DUNDI_HINT_DONT_ASK);
-                       } else if (trans->parent->dr[z].weight > ies->answers[x]->weight) {
+                       } else if (trans->parent->dr[z].weight > ntohs(ies->answers[x]->weight)) {
                                /* Update weight if appropriate */
-                               trans->parent->dr[z].weight = ies->answers[x]->weight;
+                               trans->parent->dr[z].weight = ntohs(ies->answers[x]->weight);
                        }
                } else
                        ast_log(LOG_NOTICE, "Dropping excessive answers in precache for %s@%s\n",
@@ -1762,9 +1762,9 @@ static int handle_command_response(struct dundi_transaction *trans, struct dundi
                                                                        sizeof(trans->parent->dr[trans->parent->respcount].tech));
                                                                trans->parent->respcount++;
                                                                ast_clear_flag_nonstd(trans->parent->hmd, DUNDI_HINT_DONT_ASK);
-                                                       } else if (trans->parent->dr[z].weight > ies.answers[x]->weight) {
+                                                       } else if (trans->parent->dr[z].weight > ntohs(ies.answers[x]->weight)) {
                                                                /* Update weight if appropriate */
-                                                               trans->parent->dr[z].weight = ies.answers[x]->weight;
+                                                               trans->parent->dr[z].weight = ntohs(ies.answers[x]->weight);
                                                        }
                                                } else
                                                        ast_log(LOG_NOTICE, "Dropping excessive answers to request for %s@%s\n",