[libpri-commits] rmudgett: branch 1.4 r1785 - in /branches/1.4: q931.c rose.c rosetest.c

SVN commits to the libpri project libpri-commits at lists.digium.com
Tue Jun 1 11:30:13 CDT 2010


Author: rmudgett
Date: Tue Jun  1 11:30:09 2010
New Revision: 1785

URL: http://svnview.digium.com/svn/libpri?view=rev&rev=1785
Log:
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

Modified:
    branches/1.4/q931.c
    branches/1.4/rose.c
    branches/1.4/rosetest.c

Modified: branches/1.4/q931.c
URL: http://svnview.digium.com/svn/libpri/branches/1.4/q931.c?view=diff&rev=1785&r1=1784&r2=1785
==============================================================================
--- branches/1.4/q931.c (original)
+++ branches/1.4/q931.c Tue Jun  1 11:30:09 2010
@@ -2536,25 +2536,28 @@
 		return -1;
 	}
 
-	pos = rose_decode(ctrl, pos, end, &rose);
-	if (!pos) {
-		return -1;
-	}
-	switch (rose.type) {
-	case ROSE_COMP_TYPE_INVOKE:
-		rose_handle_invoke(ctrl, call, msgtype, ie, &header, &rose.component.invoke);
-		break;
-	case ROSE_COMP_TYPE_RESULT:
-		rose_handle_result(ctrl, call, msgtype, ie, &header, &rose.component.result);
-		break;
-	case ROSE_COMP_TYPE_ERROR:
-		rose_handle_error(ctrl, call, msgtype, ie, &header, &rose.component.error);
-		break;
-	case ROSE_COMP_TYPE_REJECT:
-		rose_handle_reject(ctrl, call, msgtype, ie, &header, &rose.component.reject);
-		break;
-	default:
-		return -1;
+	/* Process all components in the facility. */
+	while (pos < end) {
+		pos = rose_decode(ctrl, pos, end, &rose);
+		if (!pos) {
+			return -1;
+		}
+		switch (rose.type) {
+		case ROSE_COMP_TYPE_INVOKE:
+			rose_handle_invoke(ctrl, call, msgtype, ie, &header, &rose.component.invoke);
+			break;
+		case ROSE_COMP_TYPE_RESULT:
+			rose_handle_result(ctrl, call, msgtype, ie, &header, &rose.component.result);
+			break;
+		case ROSE_COMP_TYPE_ERROR:
+			rose_handle_error(ctrl, call, msgtype, ie, &header, &rose.component.error);
+			break;
+		case ROSE_COMP_TYPE_REJECT:
+			rose_handle_reject(ctrl, call, msgtype, ie, &header, &rose.component.reject);
+			break;
+		default:
+			return -1;
+		}
 	}
 	return 0;
 }

Modified: branches/1.4/rose.c
URL: http://svnview.digium.com/svn/libpri/branches/1.4/rose.c?view=diff&rev=1785&r1=1784&r2=1785
==============================================================================
--- branches/1.4/rose.c (original)
+++ branches/1.4/rose.c Tue Jun  1 11:30:09 2010
@@ -2671,13 +2671,6 @@
 		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;
 }
 

Modified: branches/1.4/rosetest.c
URL: http://svnview.digium.com/svn/libpri/branches/1.4/rosetest.c?view=diff&rev=1785&r1=1784&r2=1785
==============================================================================
--- branches/1.4/rosetest.c (original)
+++ branches/1.4/rosetest.c Tue Jun  1 11:30:09 2010
@@ -1524,7 +1524,6 @@
 			0x00, 0x00,
 			0x05, 0x00,
 		0x00, 0x00,
-	0x00, 0x00,
 	0x00, 0x00
 /* *INDENT-ON* */
 };
@@ -1569,7 +1568,6 @@
 			0x00, 0x00,
 			0x05, 0x00,
 		0x00, 0x00,
-	0x00, 0x00,
 	0x00, 0x00
 /* *INDENT-ON* */
 };
@@ -1606,45 +1604,7 @@
 			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 @@
 /* *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,17 +2906,22 @@
 			if (!dec_pos) {
 				pri_error(ctrl, "Error: Message:%u failed to decode header\n", index);
 			} else {
-				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);
-				} else {
-					if (header
-						&& memcmp(header, &decoded_header, sizeof(decoded_header))) {
-						pri_error(ctrl, "Error: Message:%u Header did not match\n",
+				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);
-					}
-					if (memcmp(encode_msg, &decoded_msg, sizeof(decoded_msg))) {
-						pri_error(ctrl, "Error: Message:%u ROSE did not match\n", index);
+						break;
+					} else {
+						if (header
+							&& memcmp(header, &decoded_header, sizeof(decoded_header))) {
+							pri_error(ctrl, "Error: Message:%u Header did not match\n",
+								index);
+						}
+						if (memcmp(encode_msg, &decoded_msg, sizeof(decoded_msg))) {
+							pri_error(ctrl, "Error: Message:%u ROSE did not match\n",
+								index);
+						}
 					}
 				}
 			}
@@ -2938,9 +2959,12 @@
 	if (!pos) {
 		pri_error(ctrl, "Error: %s test: Message failed to decode header\n", name);
 	} else {
-		pos = rose_decode(ctrl, pos, end, &decoded_msg);
-		if (!pos) {
-			pri_error(ctrl, "Error: %s test: Message failed to decode ROSE\n", name);
+		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,23 +3073,19 @@
 
 	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));
 
 /* ------------------------------------------------------------------- */
 




More information about the libpri-commits mailing list