Blame SOURCES/freeradius-fix-crash-on-invalid-abinary-data.patch

96e2e6
From: Antonio Torres <antorres@redhat.com>
96e2e6
Date: Fri, 09 Dec 2022
96e2e6
Subject: Fix crash on invalid abinary data
96e2e6
96e2e6
A malicious RADIUS client or home server can send a malformed abinary
96e2e6
attribute which can cause the server to crash.
96e2e6
96e2e6
Backport of https://github.com/FreeRADIUS/freeradius-server/commit/0ec2b39d260e
96e2e6
96e2e6
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2151707
96e2e6
Signed-off-by: Antonio Torres <antorres@redhat.com>
96e2e6
---
96e2e6
diff --git a/src/lib/filters.c b/src/lib/filters.c
96e2e6
index 4868cd385d9f..3f3b63daeef3 100644
96e2e6
--- a/src/lib/filters.c
96e2e6
+++ b/src/lib/filters.c
96e2e6
@@ -1205,13 +1205,19 @@ void print_abinary(char *out, size_t outlen, uint8_t const *data, size_t len, in
96e2e6
 			}
96e2e6
 		}
96e2e6
 	} else if (filter->type == RAD_FILTER_GENERIC) {
96e2e6
-		int count;
96e2e6
+		size_t count, masklen;
96e2e6
+
96e2e6
+		masklen = ntohs(filter->u.generic.len);
96e2e6
+		if (masklen >= sizeof(filter->u.generic.mask)) {
96e2e6
+			*p = '\0';
96e2e6
+			return;
96e2e6
+		}
96e2e6
 
96e2e6
 		i = snprintf(p, outlen, " %u ", (unsigned int) ntohs(filter->u.generic.offset));
96e2e6
 		p += i;
96e2e6
 
96e2e6
 		/* show the mask */
96e2e6
-		for (count = 0; count < ntohs(filter->u.generic.len); count++) {
96e2e6
+		for (count = 0; count < masklen; count++) {
96e2e6
 			i = snprintf(p, outlen, "%02x", filter->u.generic.mask[count]);
96e2e6
 			p += i;
96e2e6
 			outlen -= i;
96e2e6
@@ -1222,7 +1228,7 @@ void print_abinary(char *out, size_t outlen, uint8_t const *data, size_t len, in
96e2e6
 		outlen--;
96e2e6
 
96e2e6
 		/* show the value */
96e2e6
-		for (count = 0; count < ntohs(filter->u.generic.len); count++) {
96e2e6
+		for (count = 0; count < masklen; count++) {
96e2e6
 			i = snprintf(p, outlen, "%02x", filter->u.generic.value[count]);
96e2e6
 			p += i;
96e2e6
 			outlen -= i;