]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Add missing field sizes
authorArran Cudbard-Bell <a.cudbardb@freeradius.org>
Thu, 17 Nov 2016 01:45:45 +0000 (20:45 -0500)
committerArran Cudbard-Bell <a.cudbardb@freeradius.org>
Thu, 17 Nov 2016 17:42:47 +0000 (12:42 -0500)
src/lib/value.c

index 7315872aa69322062cfd2f68feab2e96ed9fe52c..f9336d7d3fd404347c3ac8e73642e6faccc8d8bc 100644 (file)
@@ -31,53 +31,64 @@ RCSID("$Id$")
  * location passed as a void *.
  */
 size_t const value_box_field_sizes[] = {
-       [PW_TYPE_STRING]        = SIZEOF_MEMBER(value_box_t, datum.strvalue),
-       [PW_TYPE_OCTETS]        = SIZEOF_MEMBER(value_box_t, datum.octets),
-       [PW_TYPE_IFID]          = SIZEOF_MEMBER(value_box_t, datum.ifid),
-       [PW_TYPE_IPV4_ADDR]     = SIZEOF_MEMBER(value_box_t, datum.ipaddr),
-       [PW_TYPE_IPV4_PREFIX]   = SIZEOF_MEMBER(value_box_t, datum.ipv4prefix),
-       [PW_TYPE_IPV6_ADDR]     = SIZEOF_MEMBER(value_box_t, datum.ipv6addr),
-       [PW_TYPE_IPV6_PREFIX]   = SIZEOF_MEMBER(value_box_t, datum.ipv6prefix),
-       [PW_TYPE_BOOLEAN]       = SIZEOF_MEMBER(value_box_t, datum.boolean),
-       [PW_TYPE_BYTE]          = SIZEOF_MEMBER(value_box_t, datum.byte),
-       [PW_TYPE_SHORT]         = SIZEOF_MEMBER(value_box_t, datum.ushort),
-       [PW_TYPE_INTEGER]       = SIZEOF_MEMBER(value_box_t, datum.integer),
-       [PW_TYPE_INTEGER64]     = SIZEOF_MEMBER(value_box_t, datum.integer64),
-       [PW_TYPE_SIZE]          = SIZEOF_MEMBER(value_box_t, datum.size),
-       [PW_TYPE_SIGNED]        = SIZEOF_MEMBER(value_box_t, datum.sinteger),
-       [PW_TYPE_TIMEVAL]       = SIZEOF_MEMBER(value_box_t, datum.timeval),
-       [PW_TYPE_DECIMAL]       = SIZEOF_MEMBER(value_box_t, datum.decimal),
-       [PW_TYPE_ETHERNET]      = SIZEOF_MEMBER(value_box_t, datum.ether),
-       [PW_TYPE_DATE]          = SIZEOF_MEMBER(value_box_t, datum.date),
-       [PW_TYPE_MAX]           = 0     /* Force compiler to allocate memory for all types */
+       [PW_TYPE_STRING]                        = SIZEOF_MEMBER(value_box_t, datum.strvalue),
+       [PW_TYPE_OCTETS]                        = SIZEOF_MEMBER(value_box_t, datum.octets),
+
+       [PW_TYPE_IPV4_ADDR]                     = SIZEOF_MEMBER(value_box_t, datum.ipaddr),
+       [PW_TYPE_IPV4_PREFIX]           = SIZEOF_MEMBER(value_box_t, datum.ipv4prefix),
+       [PW_TYPE_IPV6_ADDR]                     = SIZEOF_MEMBER(value_box_t, datum.ipv6addr),
+       [PW_TYPE_IPV6_PREFIX]           = SIZEOF_MEMBER(value_box_t, datum.ipv6prefix),
+       [PW_TYPE_IFID]                          = SIZEOF_MEMBER(value_box_t, datum.ifid),
+       [PW_TYPE_ETHERNET]                      = SIZEOF_MEMBER(value_box_t, datum.ether),
+
+       [PW_TYPE_BOOLEAN]                       = SIZEOF_MEMBER(value_box_t, datum.boolean),
+       [PW_TYPE_BYTE]                          = SIZEOF_MEMBER(value_box_t, datum.byte),
+       [PW_TYPE_SHORT]                         = SIZEOF_MEMBER(value_box_t, datum.ushort),
+       [PW_TYPE_INTEGER]                       = SIZEOF_MEMBER(value_box_t, datum.integer),
+       [PW_TYPE_INTEGER64]                     = SIZEOF_MEMBER(value_box_t, datum.integer64),
+       [PW_TYPE_SIZE]                          = SIZEOF_MEMBER(value_box_t, datum.size),
+
+       [PW_TYPE_SIGNED]                        = SIZEOF_MEMBER(value_box_t, datum.sinteger),
+
+       [PW_TYPE_TIMEVAL]                       = SIZEOF_MEMBER(value_box_t, datum.timeval),
+       [PW_TYPE_DECIMAL]                       = SIZEOF_MEMBER(value_box_t, datum.decimal),
+       [PW_TYPE_DATE]                          = SIZEOF_MEMBER(value_box_t, datum.date),
+
+       [PW_TYPE_ABINARY]                       = SIZEOF_MEMBER(value_box_t, datum.filter),
+       [PW_TYPE_MAX]                           = 0     /* Force compiler to allocate memory for all types */
 };
 
 /** Just in case we have a particularly rebellious compiler
  *
  * @note Not even sure if this is required though it does make the code
  *     more robust in the case where someone changes the order of the
- *     fields in the #value_box_t struct.
- *
+ *     fields in the #value_box_t struct (and we add fields outside of the union).
  */
 size_t const value_box_offsets[] = {
-       [PW_TYPE_STRING]        = offsetof(value_box_t, datum.strvalue),
-       [PW_TYPE_OCTETS]        = offsetof(value_box_t, datum.octets),
-       [PW_TYPE_IFID]          = offsetof(value_box_t, datum.ifid),
-       [PW_TYPE_IPV4_ADDR]     = offsetof(value_box_t, datum.ipaddr),
-       [PW_TYPE_IPV4_PREFIX]   = offsetof(value_box_t, datum.ipv4prefix),
-       [PW_TYPE_IPV6_ADDR]     = offsetof(value_box_t, datum.ipv6addr),
-       [PW_TYPE_IPV6_PREFIX]   = offsetof(value_box_t, datum.ipv6prefix),
-       [PW_TYPE_BOOLEAN]       = offsetof(value_box_t, datum.boolean),
-       [PW_TYPE_BYTE]          = offsetof(value_box_t, datum.byte),
-       [PW_TYPE_SHORT]         = offsetof(value_box_t, datum.ushort),
-       [PW_TYPE_INTEGER]       = offsetof(value_box_t, datum.integer),
-       [PW_TYPE_INTEGER64]     = offsetof(value_box_t, datum.integer64),
-       [PW_TYPE_SIZE]          = offsetof(value_box_t, datum.size),
-       [PW_TYPE_SIGNED]        = offsetof(value_box_t, datum.sinteger),
-       [PW_TYPE_TIMEVAL]       = offsetof(value_box_t, datum.timeval),
-       [PW_TYPE_DECIMAL]       = offsetof(value_box_t, datum.decimal),
-       [PW_TYPE_ETHERNET]      = offsetof(value_box_t, datum.ether),
-       [PW_TYPE_DATE]          = offsetof(value_box_t, datum.date),
+       [PW_TYPE_STRING]                        = offsetof(value_box_t, datum.strvalue),
+       [PW_TYPE_OCTETS]                        = offsetof(value_box_t, datum.octets),
+
+       [PW_TYPE_IPV4_ADDR]                     = offsetof(value_box_t, datum.ipaddr),
+       [PW_TYPE_IPV4_PREFIX]           = offsetof(value_box_t, datum.ipv4prefix),
+       [PW_TYPE_IPV6_ADDR]                     = offsetof(value_box_t, datum.ipv6addr),
+       [PW_TYPE_IPV6_PREFIX]           = offsetof(value_box_t, datum.ipv6prefix),
+       [PW_TYPE_IFID]                          = offsetof(value_box_t, datum.ifid),
+       [PW_TYPE_ETHERNET]                      = offsetof(value_box_t, datum.ether),
+
+       [PW_TYPE_BOOLEAN]                       = offsetof(value_box_t, datum.boolean),
+       [PW_TYPE_BYTE]                          = offsetof(value_box_t, datum.byte),
+       [PW_TYPE_SHORT]                         = offsetof(value_box_t, datum.ushort),
+       [PW_TYPE_INTEGER]                       = offsetof(value_box_t, datum.integer),
+       [PW_TYPE_INTEGER64]                     = offsetof(value_box_t, datum.integer64),
+       [PW_TYPE_SIZE]                          = offsetof(value_box_t, datum.size),
+
+       [PW_TYPE_SIGNED]                        = offsetof(value_box_t, datum.sinteger),
+
+       [PW_TYPE_TIMEVAL]                       = offsetof(value_box_t, datum.timeval),
+       [PW_TYPE_DECIMAL]                       = offsetof(value_box_t, datum.decimal),
+       [PW_TYPE_DATE]                          = offsetof(value_box_t, datum.date),
+
+       [PW_TYPE_ABINARY]                       = offsetof(value_box_t, datum.filter),
        [PW_TYPE_MAX]           = 0     /* Force compiler to allocate memory for all types */
 };
 
@@ -1691,23 +1702,24 @@ int value_box_copy(TALLOC_CTX *ctx, value_box_t *dst, PW_TYPE src_type, const va
 {
        switch (src_type) {
        default:
-               memcpy(dst, src, sizeof(*dst));
+               memcpy(&dst->datum, &src->datum, value_box_field_sizes[src_type]);
                break;
 
        case PW_TYPE_STRING:
                dst->datum.strvalue = talloc_bstrndup(ctx, src->datum.strvalue, src->length);
-               dst->tainted = src->tainted;
                if (!dst->datum.strvalue) return -1;
                break;
 
        case PW_TYPE_OCTETS:
                dst->datum.octets = talloc_memdup(ctx, src->datum.octets, src->length);
-               dst->tainted = src->tainted;
                talloc_set_type(dst->datum.strvalue, uint8_t);
                if (!dst->datum.octets) return -1;
                break;
        }
+
+       dst->type = src->type;
        dst->length = src->length;
+       dst->tainted = src->tainted;
 
        return 0;
 }