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 8b4bb17..5f2ad75 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 42b77d6..4f05c52 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"
+