]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
clean up encode_concat()
authorAlan T. DeKok <aland@freeradius.org>
Tue, 20 Apr 2021 10:29:54 +0000 (06:29 -0400)
committerAlan T. DeKok <aland@freeradius.org>
Tue, 20 Apr 2021 10:29:54 +0000 (06:29 -0400)
slen is for signed return values, not for unsigned data lengths,
among other things.

src/protocols/radius/encode.c

index cfc3aee3f0493b12131ee61f8c1a04fb6bc95262..95d1524a5257eec2e0c3bcdaea691dcb0c8bbaae 100644 (file)
@@ -847,8 +847,7 @@ static ssize_t encode_concat(fr_dbuff_t *dbuff,
                             fr_dcursor_t *cursor, UNUSED void *encode_ctx)
 {
        uint8_t const           *p;
-       size_t                  left;
-       ssize_t                 slen;
+       size_t                  data_len;
        fr_pair_t const *vp = fr_dcursor_current(cursor);
        fr_dbuff_t              work_dbuff = FR_DBUFF_NO_ADVANCE(dbuff);
        fr_dbuff_marker_t       hdr;
@@ -856,31 +855,24 @@ static ssize_t encode_concat(fr_dbuff_t *dbuff,
        FR_PROTO_STACK_PRINT(da_stack, depth);
 
        p = vp->vp_octets;
-       slen = fr_radius_attr_len(vp);
+       data_len = fr_radius_attr_len(vp);
        fr_dbuff_marker(&hdr, &work_dbuff);
 
-       while (slen > 0) {
-               uint8_t                 hlen;
+       while (data_len > 0) {
+               size_t frag_len = (data_len > RADIUS_MAX_STRING_LENGTH) ? RADIUS_MAX_STRING_LENGTH : data_len;
 
                fr_dbuff_set(&hdr, &work_dbuff);
-               hlen = 2;
-               FR_DBUFF_IN_BYTES_RETURN(&work_dbuff, (uint8_t) da_stack->da[depth]->attr, hlen);
-
-               left = slen;
+               FR_DBUFF_IN_BYTES_RETURN(&work_dbuff, (uint8_t) da_stack->da[depth]->attr, 0x00);
 
-               /* no more than 253 octets */
-               if (left > RADIUS_MAX_STRING_LENGTH) left = RADIUS_MAX_STRING_LENGTH;
+               FR_DBUFF_IN_MEMCPY_RETURN(&work_dbuff, p, frag_len);
 
-               FR_DBUFF_IN_MEMCPY_RETURN(&work_dbuff, p, left);
+               fr_dbuff_advance(&hdr, 1);
+               fr_dbuff_in(&hdr, (uint8_t) (2 + frag_len));
 
-               FR_PROTO_HEX_DUMP(fr_dbuff_current(&hdr) + 2, left, "concat value octets");
-               FR_PROTO_HEX_DUMP(fr_dbuff_current(&hdr), 2, "concat header rfc");
+               FR_PROTO_HEX_DUMP(fr_dbuff_current(&hdr) - 1, 2 + frag_len, "encode_concat fragment");
 
-               hlen += left;
-               fr_dbuff_advance(&hdr, 1);
-               fr_dbuff_in(&hdr, hlen);
-               p += left;
-               slen -= left;
+               p += frag_len;
+               data_len -= frag_len;
        }
 
        vp = fr_dcursor_next(cursor);