|
|
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;
|