res_pjsip_rfc3326.c: Account for more than one 'Reason' header
authorRoss Beer <ross.beer@voicehost.co.uk>
Wed, 14 Mar 2018 16:17:23 +0000 (16:17 +0000)
committerRichard Mudgett <rmudgett@digium.com>
Wed, 14 Mar 2018 23:49:56 +0000 (17:49 -0600)
ASTERISK-27741

Change-Id: I0aa59a54735c6d20b95c54db1bd095dbf93e7adf

res/res_pjsip_rfc3326.c

index 5ac16f0..76b0d08 100644 (file)
 
 static void rfc3326_use_reason_header(struct ast_sip_session *session, struct pjsip_rx_data *rdata)
 {
-       const pj_str_t str_reason = { "Reason", 6 };
-       pjsip_generic_string_hdr *header = pjsip_msg_find_hdr_by_name(rdata->msg_info.msg, &str_reason, NULL);
-       char buf[20], *cause, *text;
+       static const pj_str_t str_reason = { "Reason", 6 };
+       pjsip_generic_string_hdr *header;
+       char buf[20];
+       char *cause;
+       char *text;
        int code;
 
-       if (!header) {
-               return;
-       }
+       header = pjsip_msg_find_hdr_by_name(rdata->msg_info.msg, &str_reason, NULL);
+       for (; header;
+               header = pjsip_msg_find_hdr_by_name(rdata->msg_info.msg, &str_reason, header->next)) {
+               ast_copy_pj_str(buf, &header->hvalue, sizeof(buf));
+               cause = ast_skip_blanks(buf);
 
-       ast_copy_pj_str(buf, &header->hvalue, sizeof(buf));
-       cause = ast_skip_blanks(buf);
+               if (strncasecmp(cause, "Q.850", 5) || !(cause = strstr(cause, "cause="))) {
+                       continue;
+               }
 
-       if (strncasecmp(cause, "Q.850", 5) || !(cause = strstr(cause, "cause="))) {
-               return;
-       }
+               /* If text is present get rid of it */
+               if ((text = strstr(cause, ";"))) {
+                       *text = '\0';
+               }
 
-       /* If text is present get rid of it */
-       if ((text = strstr(cause, ";"))) {
-               *text = '\0';
-       }
+               if (sscanf(cause, "cause=%30d", &code) != 1) {
+                       continue;
+               }
 
-       if (sscanf(cause, "cause=%30d", &code) != 1) {
-               return;
+               ast_channel_hangupcause_set(session->channel, code & 0x7f);
+               break;
        }
-
-       ast_channel_hangupcause_set(session->channel, code & 0x7f);
 }
 
 static int rfc3326_incoming_request(struct ast_sip_session *session, struct pjsip_rx_data *rdata)