]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Parse hex Ascend-Data-Filter correctly
authorAlan T. DeKok <aland@freeradius.org>
Tue, 8 Sep 2015 14:15:34 +0000 (10:15 -0400)
committerAlan T. DeKok <aland@freeradius.org>
Tue, 8 Sep 2015 14:15:34 +0000 (10:15 -0400)
src/lib/value.c
src/tests/unit/vendor.txt

index 8b4bb17a884a1475f824bb7e75a64755217311c0..5f2ad75ef784f4874acfafe6cf586cab422d0444 100644 (file)
@@ -600,7 +600,6 @@ ssize_t value_data_from_str(TALLOC_CTX *ctx, value_data_t *dst,
                        goto finish;
                }
 
-       do_octets:
                len -= 2;
 
                /*
@@ -625,12 +624,25 @@ ssize_t value_data_from_str(TALLOC_CTX *ctx, value_data_t *dst,
 
        case PW_TYPE_ABINARY:
 #ifdef WITH_ASCEND_BINARY
-               if ((len > 1) && (strncasecmp(src, "0x", 2) == 0)) goto do_octets;
+               if ((len > 1) && (strncasecmp(src, "0x", 2) == 0)) {
+                       ssize_t bin;
 
-               if (ascend_parse_filter(dst, src, len) < 0 ) {
-                       /* Allow ascend_parse_filter's strerror to bubble up */
-                       return -1;
+                       if (len > ((sizeof(dst->filter) + 1) * 2)) {
+                               fr_strerror_printf("Hex data is too large for ascend filter");
+                               return -1;
+                       }
+
+                       bin = fr_hex2bin((uint8_t *) &dst->filter, ret, src + 2, len);
+                       if (bin < ret) {
+                               memset(((uint8_t *) &dst->filter) + bin, 0, ret - bin);
+                       }
+               } else {
+                       if (ascend_parse_filter(dst, src, len) < 0 ) {
+                               /* Allow ascend_parse_filter's strerror to bubble up */
+                               return -1;
+                       }
                }
+
                ret = sizeof(dst->filter);
                goto finish;
 #else
index 42b77d61745582092e557c80c76b0d490eb3fe44..4f05c52fe730eae4b8195e39e7fb935f0fb0c1a2 100644 (file)
@@ -27,3 +27,12 @@ data 1a 09 00 00 00 09 ab cd ef
 
 attribute Attr-26 = 0x00000009abcdef
 data Attr-26 = 0x00000009abcdef
+attribute Ascend-Data-Filter = 0x01010100010203040a0b0c0d05200600000504d2020200000000000000000000
+data Ascend-Data-Filter = "ip in forward srcip 1.2.3.4/5 dstip 10.11.12.13/32 tcp srcport = 5 dstport = 1234"
+
+encode -
+data 1a 28 00 00 02 11 f2 22 01 01 01 00 01 02 03 04 0a 0b 0c 0d 05 20 06 00 00 05 04 d2 02 02 00 00 00 00 00 00 00 00 00 00
+
+decode 1a2800000211f22201010100010203040a0b0c0d05200600000504d2020200000000000000000000
+data Ascend-Data-Filter = "ip in forward srcip 1.2.3.4/5 dstip 10.11.12.13/32 tcp srcport = 5 dstport = 1234"
+