Multi component FACILITY messages only process the first component.
The code was only processing the first ROSE component in the facility message. I also updated rosetest.c to have a multiple component ROSE message test. (closes issue #17428) Reported by: patrol-cz Patches: issue17428.patch uploaded by rmudgett (license 664) Tested by: rmudgett, patrol-cz git-svn-id: https://origsvn.digium.com/svn/libpri/branches/1.4@1785 2fbb986a-6c06-0410-b554-c9c1f0a7f128
This commit is contained in:
parent
660609c45b
commit
505181cc1e
3
q931.c
3
q931.c
@ -2536,6 +2536,8 @@ static int process_facility(struct pri *ctrl, q931_call *call, int msgtype, q931
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Process all components in the facility. */
|
||||
while (pos < end) {
|
||||
pos = rose_decode(ctrl, pos, end, &rose);
|
||||
if (!pos) {
|
||||
return -1;
|
||||
@ -2556,6 +2558,7 @@ static int process_facility(struct pri *ctrl, q931_call *call, int msgtype, q931
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
7
rose.c
7
rose.c
@ -2671,13 +2671,6 @@ const unsigned char *rose_decode(struct pri *ctrl, const unsigned char *pos,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (pos < end) {
|
||||
if (ctrl->debug & PRI_DEBUG_APDU) {
|
||||
pri_message(ctrl, " %u byte(s) of trailing data not consumed.\n",
|
||||
(unsigned) (end - pos));
|
||||
}
|
||||
}
|
||||
|
||||
return pos;
|
||||
}
|
||||
|
||||
|
126
rosetest.c
126
rosetest.c
@ -1524,7 +1524,6 @@ static unsigned char rose_etsi_indefinite_len[] = {
|
||||
0x00, 0x00,
|
||||
0x05, 0x00,
|
||||
0x00, 0x00,
|
||||
0x00, 0x00,
|
||||
0x00, 0x00
|
||||
/* *INDENT-ON* */
|
||||
};
|
||||
@ -1569,7 +1568,6 @@ static unsigned char rose_etsi_unused_indefinite_len[] = {
|
||||
0x00, 0x00,
|
||||
0x05, 0x00,
|
||||
0x00, 0x00,
|
||||
0x00, 0x00,
|
||||
0x00, 0x00
|
||||
/* *INDENT-ON* */
|
||||
};
|
||||
@ -1606,45 +1604,7 @@ static unsigned char rose_etsi_unused[] = {
|
||||
0x30, 0x06,
|
||||
0x84, 0x04,
|
||||
0x31, 0x38, 0x30, 0x33,
|
||||
0x05, 0x00,
|
||||
0x00, 0x00
|
||||
/* *INDENT-ON* */
|
||||
};
|
||||
|
||||
static unsigned char rose_etsi_extra[] = {
|
||||
/* *INDENT-OFF* */
|
||||
/*
|
||||
* Context Specific/C [1 0x01] <A1> Len:24 <18>
|
||||
* Integer(2 0x02) <02> Len:1 <01>
|
||||
* <44>
|
||||
* Integer(2 0x02) <02> Len:1 <01>
|
||||
* <07>
|
||||
* Sequence/C(48 0x30) <30> Len:16 <10>
|
||||
* Enumerated(10 0x0A) <0A> Len:1 <01>
|
||||
* <01>
|
||||
* Enumerated(10 0x0A) <0A> Len:1 <01>
|
||||
* <05>
|
||||
* Sequence/C(48 0x30) <30> Len:6 <06>
|
||||
* Context Specific [4 0x04] <84> Len:4 <04>
|
||||
* <31 38 30 33>
|
||||
* NULL(5 0x05) <05> Len:0 <00>
|
||||
*/
|
||||
0x91,
|
||||
0xA1, 0x18,
|
||||
0x02, 0x01,
|
||||
0x44,
|
||||
0x02, 0x01,
|
||||
0x07,
|
||||
0x30, 0x10,
|
||||
0x0A, 0x01,
|
||||
0x01,
|
||||
0x0A, 0x01,
|
||||
0x05,
|
||||
0x30, 0x06,
|
||||
0x84, 0x04,
|
||||
0x31, 0x38, 0x30, 0x33,
|
||||
0x05, 0x00,
|
||||
0x00, 0x00
|
||||
0x05, 0x00
|
||||
/* *INDENT-ON* */
|
||||
};
|
||||
|
||||
@ -2783,6 +2743,62 @@ static const struct rose_message rose_qsig_msgs[] = {
|
||||
/* *INDENT-ON* */
|
||||
};
|
||||
|
||||
static unsigned char rose_qsig_multiple_msg[] = {
|
||||
/* *INDENT-OFF* */
|
||||
/*
|
||||
* Context Specific/C [10 0x0A] <AA> Len:6 <06>
|
||||
* Context Specific [0 0x00] <80> Len:1 <01>
|
||||
* <00> - "~"
|
||||
* Context Specific [2 0x02] <82> Len:1 <01>
|
||||
* <00> - "~"
|
||||
* Context Specific [11 0x0B] <8B> Len:1 <01>
|
||||
* <00> - "~"
|
||||
* Context Specific/C [1 0x01] <A1> Len:16 <10>
|
||||
* Integer(2 0x02) <02> Len:1 <01>
|
||||
* <01> - "~"
|
||||
* Integer(2 0x02) <02> Len:1 <01>
|
||||
* <55> - "U"
|
||||
* Sequence/C(48 0x30) <30> Len:8 <08>
|
||||
* Context Specific [2 0x02] <82> Len:3 <03>
|
||||
* <01 30 40> - "~0@"
|
||||
* Context Specific [6 0x06] <86> Len:1 <01>
|
||||
* <01> - "~"
|
||||
* Context Specific/C [1 0x01] <A1> Len:19 <13>
|
||||
* Integer(2 0x02) <02> Len:1 <01>
|
||||
* <02> - "~"
|
||||
* Integer(2 0x02) <02> Len:1 <01>
|
||||
* <00> - "~"
|
||||
* Context Specific [0 0x00] <80> Len:11 <0B>
|
||||
* <4D 6F 64 65 6D 20 44 69-73 63 6F> - "Modem Disco"
|
||||
*/
|
||||
0x9f,
|
||||
0xaa, 0x06,
|
||||
0x80, 0x01,
|
||||
0x00,
|
||||
0x82, 0x01,
|
||||
0x00,
|
||||
0x8b, 0x01,
|
||||
0x00,
|
||||
0xa1, 0x10,
|
||||
0x02, 0x01,
|
||||
0x01,
|
||||
0x02, 0x01,
|
||||
0x55,
|
||||
0x30, 0x08,
|
||||
0x82, 0x03,
|
||||
0x01, 0x30, 0x40,
|
||||
0x86, 0x01,
|
||||
0x01,
|
||||
0xa1, 0x13,
|
||||
0x02, 0x01,
|
||||
0x02,
|
||||
0x02, 0x01,
|
||||
0x00,
|
||||
0x80, 0x0b,
|
||||
0x4d, 0x6f, 0x64, 0x65, 0x6d, 0x20, 0x44, 0x69, 0x73, 0x63, 0x6f
|
||||
/* *INDENT-ON* */
|
||||
};
|
||||
|
||||
|
||||
static const struct rose_message rose_dms100_msgs[] = {
|
||||
/* *INDENT-OFF* */
|
||||
@ -2890,9 +2906,12 @@ static void rose_test_msg(struct pri *ctrl, unsigned index,
|
||||
if (!dec_pos) {
|
||||
pri_error(ctrl, "Error: Message:%u failed to decode header\n", index);
|
||||
} else {
|
||||
while (dec_pos < dec_end) {
|
||||
dec_pos = rose_decode(ctrl, dec_pos, dec_end, &decoded_msg);
|
||||
if (!dec_pos) {
|
||||
pri_error(ctrl, "Error: Message:%u failed to decode ROSE\n", index);
|
||||
pri_error(ctrl, "Error: Message:%u failed to decode ROSE\n",
|
||||
index);
|
||||
break;
|
||||
} else {
|
||||
if (header
|
||||
&& memcmp(header, &decoded_header, sizeof(decoded_header))) {
|
||||
@ -2900,7 +2919,9 @@ static void rose_test_msg(struct pri *ctrl, unsigned index,
|
||||
index);
|
||||
}
|
||||
if (memcmp(encode_msg, &decoded_msg, sizeof(decoded_msg))) {
|
||||
pri_error(ctrl, "Error: Message:%u ROSE did not match\n", index);
|
||||
pri_error(ctrl, "Error: Message:%u ROSE did not match\n",
|
||||
index);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -2938,9 +2959,12 @@ static void rose_test_exception(struct pri *ctrl, const char *name,
|
||||
if (!pos) {
|
||||
pri_error(ctrl, "Error: %s test: Message failed to decode header\n", name);
|
||||
} else {
|
||||
while (pos < end) {
|
||||
pos = rose_decode(ctrl, pos, end, &decoded_msg);
|
||||
if (!pos) {
|
||||
pri_error(ctrl, "Error: %s test: Message failed to decode ROSE\n", name);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -3049,24 +3073,20 @@ int main(int argc, char *argv[])
|
||||
|
||||
dummy_ctrl.switchtype = PRI_SWITCH_EUROISDN_E1;
|
||||
|
||||
rose_test_exception(&dummy_ctrl, "Extra bytes on end", rose_etsi_extra,
|
||||
sizeof(rose_etsi_extra));
|
||||
|
||||
rose_test_exception(&dummy_ctrl, "Indefinite length", rose_etsi_indefinite_len,
|
||||
sizeof(rose_etsi_indefinite_len) - 2);
|
||||
rose_test_exception(&dummy_ctrl, "Indefinite length (extra)",
|
||||
rose_etsi_indefinite_len, sizeof(rose_etsi_indefinite_len));
|
||||
sizeof(rose_etsi_indefinite_len));
|
||||
|
||||
rose_test_exception(&dummy_ctrl, "Unused components (indefinite length)",
|
||||
rose_etsi_unused_indefinite_len, sizeof(rose_etsi_unused_indefinite_len) - 2);
|
||||
rose_test_exception(&dummy_ctrl, "Unused components (indefinite length, extra)",
|
||||
rose_etsi_unused_indefinite_len, sizeof(rose_etsi_unused_indefinite_len));
|
||||
|
||||
rose_test_exception(&dummy_ctrl, "Unused components", rose_etsi_unused,
|
||||
sizeof(rose_etsi_unused) - 2);
|
||||
rose_test_exception(&dummy_ctrl, "Unused components (extra)", rose_etsi_unused,
|
||||
sizeof(rose_etsi_unused));
|
||||
|
||||
dummy_ctrl.switchtype = PRI_SWITCH_QSIG;
|
||||
|
||||
rose_test_exception(&dummy_ctrl, "Multiple component messages",
|
||||
rose_qsig_multiple_msg, sizeof(rose_qsig_multiple_msg));
|
||||
|
||||
/* ------------------------------------------------------------------- */
|
||||
|
||||
pri_message(&dummy_ctrl, "\n\n"
|
||||
|
Loading…
Reference in New Issue
Block a user