From 65e1790bb88b5e2d97ccb6ce729599d70206db21 Mon Sep 17 00:00:00 2001 From: "Alan T. DeKok" Date: Mon, 18 Jun 2018 10:30:25 -0400 Subject: [PATCH] handle variable length State attributes --- src/main/state.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/main/state.c b/src/main/state.c index 3676e838170..8f47da3c5d8 100644 --- a/src/main/state.c +++ b/src/main/state.c @@ -293,8 +293,16 @@ static state_entry_t *fr_state_create(fr_state_t *state, const char *server, RAD WARN("State should be %zd octets!", sizeof(entry->state)); } - memcpy(entry->state, vp->vp_octets, sizeof(entry->state)); + /* + * Be tolerant of variable State attributes + */ + if (vp->vp_length >= sizeof(entry->state)) { + memcpy(entry->state, vp->vp_octets, sizeof(entry->state)); + } else { + memcpy(entry->state, vp->vp_octets, vp->vp_length); + memset(&entry->state[vp->vp_length], 0, sizeof(entry->state) - vp->vp_length); + } } else { vp = fr_pair_afrom_num(packet, PW_STATE, 0); fr_pair_value_memcpy(vp, entry->state, sizeof(entry->state)); @@ -342,9 +350,12 @@ static state_entry_t *fr_state_find(fr_state_t *state, const char *server, RADIU vp = fr_pair_find_by_num(packet->vps, PW_STATE, 0, TAG_ANY); if (!vp) return NULL; - if (vp->vp_length != sizeof(my_entry.state)) return NULL; - - memcpy(my_entry.state, vp->vp_octets, sizeof(my_entry.state)); + if (vp->vp_length >= sizeof(my_entry.state)) { + memcpy(my_entry.state, vp->vp_octets, sizeof(my_entry.state)); + } else { + memcpy(my_entry.state, vp->vp_octets, vp->vp_length); + memset(&my_entry.state[vp->vp_length], 0, sizeof(my_entry.state) - vp->vp_length); + } /* Make unique for different virtual servers handling same request */ -- 2.47.3