]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Decode EVS data types correctly.
authorAlan T. DeKok <aland@freeradius.org>
Fri, 12 Jun 2015 15:24:41 +0000 (11:24 -0400)
committerAlan T. DeKok <aland@freeradius.org>
Fri, 12 Jun 2015 15:45:03 +0000 (11:45 -0400)
src/lib/radius.c

index 56db17af8965442a17105276d1745b3bba7d68f7..0e1b01a56c1c23a3dcc98802bc7b95f794f1762e 100644 (file)
@@ -3360,7 +3360,6 @@ ssize_t data2vp(TALLOC_CTX *ctx,
        ssize_t rcode;
        uint32_t vendor;
        DICT_ATTR const *child;
-       DICT_VENDOR *dv;
        VALUE_PAIR *vp;
        uint8_t const *data = start;
        char *p;
@@ -3664,16 +3663,19 @@ ssize_t data2vp(TALLOC_CTX *ctx,
 
                memcpy(&vendor, data, 4);
                vendor = ntohl(vendor);
-               dv = dict_vendorbyvalue(vendor);
-               if (!dv) {
-                       child = dict_unknown_afrom_fields(ctx, data[4], da->vendor | vendor);
-               } else {
-                       child = dict_attrbyparent(da, data[4], vendor);
-                       if (!child) {
-                               child = dict_unknown_afrom_fields(ctx, data[4], da->vendor | vendor);
-                       }
+               vendor |= da->vendor;
+
+               child = dict_attrbyvalue(data[4], vendor);
+               if (!child) {
+                       /*
+                        *      Create a "raw" attribute from the
+                        *      contents of the EVS VSA.
+                        */
+                       da = dict_unknown_afrom_fields(ctx, data[4], vendor);
+                       data += 5;
+                       datalen -= 5;
+                       break;
                }
-               if (!child) goto raw;
 
                rcode = data2vp(ctx, packet, original, secret, child,
                                data + 5, attrlen - 5, attrlen - 5, pvp);