]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
allow string[n] in the dictionaries
authorAlan T. DeKok <aland@freeradius.org>
Sat, 5 Dec 2020 14:24:51 +0000 (09:24 -0500)
committerAlan T. DeKok <aland@freeradius.org>
Sun, 6 Dec 2020 02:48:08 +0000 (21:48 -0500)
and fix RADIUS to allow it.  The rest of the code already
supports it.

src/lib/util/dict_tokenize.c
src/lib/util/dict_validate.c
src/protocols/radius/encode.c

index aa97a47fc6d58c628acfe14fcc0e4fd7335abfdb..cdfaa33e8d92ebc74bf7bf3556bb4914fe29fc1e 100644 (file)
@@ -282,6 +282,9 @@ static int dict_process_type_field(dict_tokenize_ctx_t *ctx, char const *name, f
                if (strcmp(name, "octets") == 0) {
                        type = FR_TYPE_OCTETS;
 
+               } else if (strcmp(name, "string") == 0) {
+                       type = FR_TYPE_STRING;
+
                } else if (strcmp(name, "struct") == 0) {
                        type = FR_TYPE_STRUCT;
 
index d582bf70ec048f033ec241903fcc6bfefd5342a4..3112df7f3c0fed913822000564626bcf4678a22e 100644 (file)
@@ -524,8 +524,7 @@ bool dict_attr_flags_valid(fr_dict_t *dict, fr_dict_attr_t const *parent,
                         *      the first member.
                         */
                        if ((dict_attr_sizes[sibling->type][1] == ~(size_t) 0) &&
-                           !((sibling->type == FR_TYPE_OCTETS) &&
-                             (sibling->flags.length > 0))) {
+                           (sibling->flags.length == 0)) {
                                fr_strerror_printf("Only the last child of a 'struct' attribute can have variable length");
                                return false;
                        }
index 8e84123caad53faacc86af4c5a223c8067ab8a8c..28a801233f60cc2076dd4f60bea8684ddadc530e 100644 (file)
@@ -471,24 +471,6 @@ static ssize_t encode_value(fr_dbuff_t *dbuff,
        }
 
        switch (da->type) {
-       /*
-        *      If asked to encode more data than allowed, we
-        *      encode only the allowed data.
-        */
-       case FR_TYPE_STRING:
-               if (flag_abinary(&da->flags)) {
-                       slen = fr_radius_encode_abinary(vp, fr_dbuff_current(&value_dbuff), fr_dbuff_remaining(&value_dbuff));
-                       if (slen <= 0) return slen;
-
-                       FR_DBUFF_ADVANCE_RETURN(&value_dbuff, (size_t) slen);
-                       break;
-               }
-               FALL_THROUGH;
-
-       case FR_TYPE_OCTETS:
-               FR_DBUFF_IN_MEMCPY_RETURN(&value_dbuff, (uint8_t const *)(vp->vp_ptr), len);
-               break;
-
        /*
         *      Common encoder might add scope byte
         */
@@ -514,12 +496,28 @@ static ssize_t encode_value(fr_dbuff_t *dbuff,
                FR_DBUFF_IN_MEMCPY_RETURN(&value_dbuff, (uint8_t const *)&vp->vp_ipv4addr, sizeof(vp->vp_ipv4addr));
                break;
 
+       /*
+        *      Special handling for "abinary".  Otherwise, fall
+        *      through to using the common encoder.
+        */
+       case FR_TYPE_STRING:
+               if (flag_abinary(&da->flags)) {
+                       slen = fr_radius_encode_abinary(vp, fr_dbuff_current(&value_dbuff), fr_dbuff_remaining(&value_dbuff));
+                       if (slen <= 0) return slen;
+
+                       FR_DBUFF_ADVANCE_RETURN(&value_dbuff, (size_t) slen);
+                       break;
+               }
+               FALL_THROUGH;
+
+       case FR_TYPE_OCTETS:
+
        /*
         *      Simple data types use the common encoder.
         */
        default:
                slen = fr_value_box_to_network(&value_dbuff, &vp->data);
-               if (slen < 0) return PAIR_ENCODE_FATAL_ERROR;
+               if (slen < 0) return slen;
                break;
        }