aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Johnston <markj@FreeBSD.org>2021-05-28 14:41:43 +0000
committerMark Johnston <markj@FreeBSD.org>2021-05-28 17:00:19 +0000
commitf9972532343bb1eb101bf7afef2966972eea3b5e (patch)
tree7b1afc3617fd8d0c3546d89d6262be97a8de5e86
parent4aaf6dd0a6b11accf34ca999465c34e29153680f (diff)
libradius: Fix attribute length validation in rad_get_attr(3)
The length of the attribute header needs to be excluded when comparing the attribute length against the length of the packet. Otherwise, validation may incorrectly fail when fetching the final attribute in a message. Fixes: 8d5c78130 ("libradius: Fix input validation bugs") Reported by: Peter Eriksson Tested by: Peter Eriksson Sponsored by: The FreeBSD Foundation (cherry picked from commit 6bb5699d2b59491097bc21ffa3c097cdd4853f89)
-rw-r--r--lib/libradius/radlib.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/lib/libradius/radlib.c b/lib/libradius/radlib.c
index 18aee8b53024..4d21887c4ee2 100644
--- a/lib/libradius/radlib.c
+++ b/lib/libradius/radlib.c
@@ -964,7 +964,12 @@ rad_get_attr(struct rad_handle *h, const void **value, size_t *lenp)
}
type = h->in[h->in_pos++];
len = h->in[h->in_pos++];
- if (len < 2 || h->in_pos + len > h->in_len) {
+ if (len < 2) {
+ generr(h, "Malformed attribute in response");
+ return -1;
+ }
+ len -= 2;
+ if (h->in_pos + len > h->in_len) {
generr(h, "Malformed attribute in response");
return -1;
}