]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
do aligned access to structs
authorAlan T. DeKok <aland@freeradius.org>
Wed, 17 Mar 2021 13:19:30 +0000 (09:19 -0400)
committerAlan T. DeKok <aland@freeradius.org>
Wed, 17 Mar 2021 17:50:44 +0000 (13:50 -0400)
src/protocols/radius/abinary.c

index d9cbf1e91ac9d78877af86b5e5103cf0807ede59..a801c39cebdadde9c8b429c804f71604213ea9a2 100644 (file)
@@ -1330,6 +1330,7 @@ ssize_t fr_radius_decode_abinary(fr_pair_t *vp, uint8_t const *data, size_t data
        char                    buffer[FR_IPADDR_PREFIX_STRLEN];
        char                    string[256];
        fr_sbuff_t              sbuff = FR_SBUFF_OUT(string, sizeof(string));
+       uint64_t                aligned[256 / sizeof(uint64_t)];
 
        static char const *action[] = {"drop", "forward"};
        static char const *direction[] = {"out", "in"};
@@ -1339,7 +1340,15 @@ ssize_t fr_radius_decode_abinary(fr_pair_t *vp, uint8_t const *data, size_t data
         */
        if (data_len < 4) return -1;
 
-       filter = (ascend_filter_t const *) data;
+       /*
+        *      ascend data filters aren't concatenated across
+        *      multiple RADIUS attributes.
+        */
+       if (data_len > RADIUS_MAX_STRING_LENGTH) return -1;
+
+       memcpy(aligned, data, data_len);
+
+       filter = (ascend_filter_t const *) aligned;
 
        switch ((ascend_filter_type_t)filter->type) {
        case ASCEND_FILTER_IP: