Blame SOURCES/freeradius-FR-GV-302-do-checks-based-on-pointers-not-on-decoded.patch

16502d
From 019e35431db17661aa1d74d995fd0315af9a8dbf Mon Sep 17 00:00:00 2001
16502d
From: "Alan T. DeKok" <aland@freeradius.org>
16502d
Date: Tue, 27 Jun 2017 21:54:10 -0400
16502d
Subject: [PATCH] FR-GV-302 - do checks based on pointers, not on decoded data
16502d
16502d
because decoded data may be empty
16502d
---
16502d
 src/lib/radius.c       | 10 +++++++++-
16502d
 src/tests/unit/rfc.txt | 12 ++++++++++++
16502d
 2 files changed, 21 insertions(+), 1 deletion(-)
16502d
16502d
diff --git a/src/lib/radius.c b/src/lib/radius.c
16502d
index ad6b15b46..7114e1650 100644
16502d
--- a/src/lib/radius.c
16502d
+++ b/src/lib/radius.c
16502d
@@ -2952,16 +2952,23 @@ static ssize_t data2vp_concat(TALLOC_CTX *ctx,
16502d
 	 *	don't care about walking off of the end of it.
16502d
 	 */
16502d
 	while (ptr < end) {
16502d
+		if (ptr[1] < 2) return -1;
16502d
+		if ((ptr + ptr[1]) > end) return -1;
16502d
+
16502d
 		total += ptr[1] - 2;
16502d
 
16502d
 		ptr += ptr[1];
16502d
 
16502d
+		if (ptr == end) break;
16502d
+
16502d
 		/*
16502d
 		 *	Attributes MUST be consecutive.
16502d
 		 */
16502d
 		if (ptr[0] != attr) break;
16502d
 	}
16502d
 
16502d
+	end = ptr;
16502d
+
16502d
 	vp = fr_pair_afrom_da(ctx, da);
16502d
 	if (!vp) return -1;
16502d
 
16502d
@@ -2974,7 +2981,7 @@ static ssize_t data2vp_concat(TALLOC_CTX *ctx,
16502d
 
16502d
 	total = 0;
16502d
 	ptr = start;
16502d
-	while (total < vp->vp_length) {
16502d
+	while (ptr < end) {
16502d
 		memcpy(p, ptr + 2, ptr[1] - 2);
16502d
 		p += ptr[1] - 2;
16502d
 		total += ptr[1] - 2;
16502d
@@ -2982,6 +2989,7 @@ static ssize_t data2vp_concat(TALLOC_CTX *ctx,
16502d
 	}
16502d
 
16502d
 	*pvp = vp;
16502d
+
16502d
 	return ptr - start;
16502d
 }
16502d
 
16502d
diff --git a/src/tests/unit/rfc.txt b/src/tests/unit/rfc.txt
16502d
index 00247940b..d870975e3 100644
16502d
--- a/src/tests/unit/rfc.txt
16502d
+++ b/src/tests/unit/rfc.txt
16502d
@@ -178,6 +178,18 @@ data Failed to parse IPv4 address string "256/8"
16502d
 attribute PMIP6-Home-IPv4-HoA = bob/8
16502d
 data Failed to parse IPv4 address string "bob/8"
16502d
 
16502d
+#
16502d
+#  A "concat" attribute, with no data
16502d
+#
16502d
+decode 89 02
16502d
+data PKM-SS-Cert = 0x
16502d
+
16502d
+#
16502d
+#  Or with weirdly formatted data
16502d
+#
16502d
+decode 89 03 ff 89 02 89 03 fe
16502d
+data PKM-SS-Cert = 0xfffe
16502d
+
16502d
 $INCLUDE tunnel.txt
16502d
 $INCLUDE errors.txt
16502d
 $INCLUDE extended.txt
16502d
-- 
16502d
2.13.2
16502d