[svn-commits] dvossel: branch group/aoc r251483 - in /team/group/aoc: include/asterisk/ mai...

SVN commits to the Digium repositories svn-commits at lists.digium.com
Tue Mar 9 14:31:33 CST 2010


Author: dvossel
Date: Tue Mar  9 14:31:30 2010
New Revision: 251483

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=251483
Log:
added some validity checks to the decode routine

Modified:
    team/group/aoc/include/asterisk/aoc.h
    team/group/aoc/main/aoc.c
    team/group/aoc/tests/test_aoc.c

Modified: team/group/aoc/include/asterisk/aoc.h
URL: http://svnview.digium.com/svn/asterisk/team/group/aoc/include/asterisk/aoc.h?view=diff&rev=251483&r1=251482&r2=251483
==============================================================================
--- team/group/aoc/include/asterisk/aoc.h (original)
+++ team/group/aoc/include/asterisk/aoc.h Tue Mar  9 14:31:30 2010
@@ -50,16 +50,16 @@
 
 enum ast_aoc_type {
 	AOC_REQUEST = 0,
+	/* AOC_S */  /* Reserved for AOC-S support */
 	AOC_D,
-	AOC_E,
-	/* AOC_S */  /* Reserved for AOC-S support */
+	AOC_E, /* aoc-e must remain the last item in this enum */
 };
 
 enum ast_aoc_charge_type {
 	AOC_CHARGE_NA,
 	AOC_CHARGE_FREE,
 	AOC_CHARGE_CURRENCY,
-	AOC_CHARGE_UNIT,
+	AOC_CHARGE_UNIT, /* make sure unit is always the last enum here */
 };
 
 enum ast_aoc_request {
@@ -108,20 +108,22 @@
 /* \brief decodes an encoded aoc payload.
  *
  * \param ast_aoc_encoded, the encoded payload to decode.
+ * \param total size of encoded payload
  *
  * \retval heap allocated ast_aoc_decoded object ptr on success
  * \retval NULL failure
  */
-struct ast_aoc_decoded *ast_aoc_decode(struct ast_aoc_encoded *encoded);
+struct ast_aoc_decoded *ast_aoc_decode(struct ast_aoc_encoded *encoded, size_t size);
 
 /* \brief encodes a decoded aoc structure so it can be passed on the wire
  *
- * \param ast_aoc_decoded structe to be encoded
- *
- * \retval heap allocated ast_aoc_encoded object ptr on success
- * \retval NULL failure
- */
-struct ast_aoc_encoded *ast_aoc_encode(struct ast_aoc_decoded *decoded);
+ * \param ast_aoc_decoded struct to be encoded
+ * \param ast_aoc_encoded struct hold encoded data
+ *
+ * \retval size of encoded data
+ * \retval 0 failure
+ */
+size_t ast_aoc_encode(struct ast_aoc_decoded *decoded, struct ast_aoc_encoded **encoded_out);
 
 /* \brief Sets the type of total for a AOC-D message
  *

Modified: team/group/aoc/main/aoc.c
URL: http://svnview.digium.com/svn/asterisk/team/group/aoc/main/aoc.c?view=diff&rev=251483&r1=251482&r2=251483
==============================================================================
--- team/group/aoc/main/aoc.c (original)
+++ team/group/aoc/main/aoc.c Tue Mar  9 14:31:30 2010
@@ -56,7 +56,7 @@
 
 #define AOC_ENCODE_VERSION 1
 
-#define AOC_CURRENCY_NAME_SIZE 10+1
+#define AOC_CURRENCY_NAME_SIZE (10+1)
 
 /* AOC Payload Header. Holds all the encoded AOC data to pass on the wire */
 struct ast_aoc_encoded {
@@ -126,6 +126,15 @@
 		const enum ast_aoc_request requests)
 {
 	struct ast_aoc_decoded *decoded = NULL;
+
+	/* verify input */
+	if (((unsigned int) charge_type > AOC_CHARGE_UNIT) ||
+		((unsigned int) msg_type > AOC_E) ||
+		((msg_type == AOC_REQUEST) && !requests)) {
+
+		ast_log(LOG_WARNING, "Failed to create ast_aoc_decoded object, invalid input\n");
+		return NULL;
+	}
 
 	if (!(decoded = ast_calloc(1, sizeof(struct ast_aoc_decoded)))) {
 		ast_log(LOG_WARNING, "Failed to create ast_aoc_decoded object \n");
@@ -213,9 +222,15 @@
 	return 0;
 }
 
-struct ast_aoc_decoded *ast_aoc_decode(struct ast_aoc_encoded *encoded)
+struct ast_aoc_decoded *ast_aoc_decode(struct ast_aoc_encoded *encoded, size_t size)
 {
 	struct ast_aoc_decoded *decoded = ast_calloc(1, sizeof(struct ast_aoc_decoded));
+
+	/* verify our encoded payload is actually large enough to hold all the ies */
+	if ((size - (sizeof(struct ast_aoc_encoded)) != ntohs(encoded->datalen))) {
+		ast_log(LOG_WARNING, "Corrupted aoc encoded object, can not decode\n");
+		return NULL;
+	}
 
 	if (!decoded) {
 		ast_log(LOG_WARNING, "Failed to create ast_aoc_decoded object \n");
@@ -258,7 +273,6 @@
 	}
 
 	/* decode information elements */
-	/* TODO, make the lengths actually match up */
 	aoc_parse_ie(decoded, encoded->data, ntohs(encoded->datalen));
 	return decoded;
 }
@@ -329,19 +343,26 @@
 	}
 }
 
-struct ast_aoc_encoded *ast_aoc_encode(struct ast_aoc_decoded *decoded)
-{
-	struct ast_aoc_encoded *encoded = NULL;
+size_t ast_aoc_encode(struct ast_aoc_decoded *decoded, struct ast_aoc_encoded **encoded_out)
+{
 	struct aoc_ie_data ied;
+	struct ast_aoc_encoded *encoded;
+	unsigned int size = 0;
+
+	if (!decoded || !encoded_out) {
+		return 0;
+	}
 
 	/* create information element buffer before allocating the payload,
 	 * by doing this the exact size of the payload + the id data can be
 	 * allocated all at once. */
 	aoc_create_ie_data(decoded, &ied);
 
-	if (!(encoded = ast_calloc(1, (sizeof(struct ast_aoc_encoded) + ied.pos)))) {
+	size = sizeof(struct ast_aoc_encoded) + ied.pos;
+
+	if (!(encoded = ast_calloc(1, size))) {
 		ast_log(LOG_WARNING, "Failed to create ast_aoc_encoded object during decode routine. \n");
-		return NULL;
+		return 0;
 	}
 
 	/* -- Set ie data buffer */
@@ -399,8 +420,10 @@
 	/* --- Set Version Number --- */
 	encoded->version = AOC_ENCODE_VERSION;
 
-
-	return encoded;
+	/* set the output param */
+	*encoded_out = encoded;
+
+	return size;
 }
 
 enum ast_aoc_type ast_aoc_get_msg_type(struct ast_aoc_decoded *decoded)
@@ -538,12 +561,14 @@
 {
 	struct ast_aoc_decoded *new = NULL;
 	struct ast_aoc_encoded *encoded = NULL;
+	unsigned int size;
 	int res = 0;
-	if (!(encoded = ast_aoc_encode(decoded))) {
+
+	if (!(size = ast_aoc_encode(decoded, &encoded))) {
 		return -1;
 	}
 
-	if (!(new = ast_aoc_decode(encoded))) {
+	if (!(new = ast_aoc_decode(encoded, size))) {
 		ast_free(encoded);
 		return -1;
 	}

Modified: team/group/aoc/tests/test_aoc.c
URL: http://svnview.digium.com/svn/asterisk/team/group/aoc/tests/test_aoc.c?view=diff&rev=251483&r1=251482&r2=251483
==============================================================================
--- team/group/aoc/tests/test_aoc.c (original)
+++ team/group/aoc/tests/test_aoc.c Tue Mar  9 14:31:30 2010
@@ -189,13 +189,13 @@
 	/* ---- Test 3 ---- create AOC-Request. test all possible combinations */
 	{
 		int request[7] = { /* all possible request combinations */
-			0,
 			AOC_REQUEST_S,
 			AOC_REQUEST_D,
 			AOC_REQUEST_E,
 			(AOC_REQUEST_S | AOC_REQUEST_D),
 			(AOC_REQUEST_S | AOC_REQUEST_E),
 			(AOC_REQUEST_D | AOC_REQUEST_E),
+			(AOC_REQUEST_D | AOC_REQUEST_E | AOC_REQUEST_S)
 		};
 		int i;
 
@@ -219,6 +219,21 @@
 			decoded = ast_aoc_destroy_decoded(decoded);
 		}
 	}
+
+	/* ---- Test 4 ----  Make stuff blow up */
+	if ((decoded = ast_aoc_create(AOC_D, 1234567, 0))) {
+
+		ast_test_status_update(test, "Test 4: aoc-d creation with no valid charge type should fail\n");
+		res = AST_TEST_FAIL;
+		goto cleanup_aoc_test;
+	}
+	if ((decoded = ast_aoc_create(AOC_REQUEST, 0, 0))) {
+
+		ast_test_status_update(test, "Test 4: aoc-d creation with no valid charge type should fail\n");
+		res = AST_TEST_FAIL;
+		goto cleanup_aoc_test;
+	}
+
 cleanup_aoc_test:
 
 	decoded = ast_aoc_destroy_decoded(decoded);
@@ -237,4 +252,4 @@
 	return AST_MODULE_LOAD_SUCCESS;
 }
 
-AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Skeleton (sample) Test");
+AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "AOC unit tests");




More information about the svn-commits mailing list