[sr-dev] git:pd/outbound: modules_k/outbound: tightened up error handling in decode_flow_token()

Peter Dunkley peter.dunkley at crocodile-rcs.com
Mon Dec 31 18:11:19 CET 2012


Module: sip-router
Branch: pd/outbound
Commit: 5ceef3cb48fc4b1e9c75abf91ba45f59f5125751
URL:    http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=5ceef3cb48fc4b1e9c75abf91ba45f59f5125751

Author: Peter Dunkley <peter.dunkley at crocodile-rcs.com>
Committer: Peter Dunkley <peter.dunkley at crocodile-rcs.com>
Date:   Mon Dec 31 12:54:37 2012 +0000

modules_k/outbound: tightened up error handling in decode_flow_token()

---

 modules_k/outbound/ob_mod.c |   27 ++++++++++++++++++++++-----
 1 files changed, 22 insertions(+), 5 deletions(-)

diff --git a/modules_k/outbound/ob_mod.c b/modules_k/outbound/ob_mod.c
index 5b7b226..c9e55eb 100644
--- a/modules_k/outbound/ob_mod.c
+++ b/modules_k/outbound/ob_mod.c
@@ -95,8 +95,8 @@ static int mod_init(void)
 /* Structure of flow token
 
    <HMAC-SHA1-80><protocol><dst_ip><dst_port><src_ip><src_port>
-          10     +    1    +  16   +    2    +  16   +    2
-	   = 47 bytes maximum
+          10     +    1    + 4or16 +    2    +  16   +    2
+	   = 35 bytes minimum and 47 bytes maximum
 
    <protocol> specifies whether the addresses are IPv4 or IPv6 and the
    transport.
@@ -105,9 +105,11 @@ static int mod_init(void)
 
    IP addresses will be 4 (for IPv6) or 16 (for IPv6) bytes.
 
+   Minimum base64 encoded size: ceiling((35+2)/3)*4 = 52 bytes
    Maximum base64 encoded size: ceiling((47+2)/3)*4 = 68 bytes
 */
 
+#define UNENC_FLOW_TOKEN_MIN_LENGTH	35
 #define UNENC_FLOW_TOKEN_MAX_LENGTH	47
 #define SHA1_LENGTH			20
 #define SHA1_80_LENGTH			10
@@ -169,10 +171,25 @@ int decode_flow_token(struct receive_info *rcv, str flow_token)
 {
 	int pos = FLOW_TOKEN_START_POS, flow_length, i;
 
-	if (flow_token.len > base64_enc_len(UNENC_FLOW_TOKEN_MAX_LENGTH))
+	if (rcv == NULL)
 	{
-		LM_INFO("bad flow token length.  Length is %d, expected <= %d\n",
-			flow_token.len, UNENC_FLOW_TOKEN_MAX_LENGTH);
+		LM_ERR("bad receive_info structure provided\n");
+		return -1;
+	}
+
+	if (flow_token.s == NULL)
+	{
+		LM_INFO("no flow token provided\n");
+		return -1;
+	}
+
+	if (flow_token.len != base64_enc_len(UNENC_FLOW_TOKEN_MIN_LENGTH)
+	    && flow_token.len != base64_enc_len(UNENC_FLOW_TOKEN_MAX_LENGTH))
+	{
+		LM_INFO("bad flow token length.  Length is %d, expected %d"
+			" or %d.\n", flow_token.len,
+			UNENC_FLOW_TOKEN_MIN_LENGTH,
+			UNENC_FLOW_TOKEN_MAX_LENGTH);
 		return -1;
 	}
 




More information about the sr-dev mailing list