]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
move src_dst to array[0] at the end of the struct
authorAlan T. DeKok <aland@freeradius.org>
Mon, 15 Jan 2018 15:28:52 +0000 (10:28 -0500)
committerAlan T. DeKok <aland@freeradius.org>
Mon, 15 Jan 2018 15:28:52 +0000 (10:28 -0500)
src/lib/io/track.c
src/lib/io/track.h
src/modules/proto_radius/proto_radius_udp.c

index 8537fa1e90dce18ef3806534d9373b6efb4f1760..413521b0c4ff17842ae58068eb4acdfa47ac940f 100644 (file)
@@ -100,8 +100,6 @@ fr_tracking_t *fr_radius_tracking_create(TALLOC_CTX *ctx, size_t src_dst_size,
        ft = talloc_zero(ctx, fr_tracking_t);
        if (!ft) return NULL;
 
-       memset(ft, 0, sizeof(*ft));
-
        ft->num_entries = 0;
        ft->src_dst_size = src_dst_size;
 
@@ -167,7 +165,7 @@ fr_tracking_status_t fr_radius_tracking_entry_insert(fr_tracking_entry_t **p_ent
                                                     void *src_dst)
 {
        fr_tracking_entry_t     *entry;
-       fr_tracking_entry_t my_entry;
+       uint64_t                buffer[256];
 
        (void) talloc_get_type_abort(ft, fr_tracking_t);
 
@@ -177,38 +175,29 @@ fr_tracking_status_t fr_radius_tracking_entry_insert(fr_tracking_entry_t **p_ent
         *      See if we're adding a duplicate, or
         *      over-writing an existing one.
         */
-       my_entry.src_dst = src_dst;
-       my_entry.src_dst_size = ft->src_dst_size;
-       memcpy(my_entry.data, packet, sizeof(my_entry.data));
+       entry = (fr_tracking_entry_t *) buffer;
+       memcpy(entry->src_dst, src_dst, ft->src_dst_size);
+       entry->src_dst_size = ft->src_dst_size;
+       memcpy(entry->data, packet, sizeof(entry->data));
 
-       entry = rbtree_finddata(ft->tree, &my_entry);
+       entry = rbtree_finddata(ft->tree, entry);
        if (!entry) {
-               size_t align;
-               uint8_t *p;
-
-               /*
-                *      Ensure that structures are aligned.
-                */
-               align = sizeof(fr_tracking_entry_t);
-               align += 15;
-               align &= ~(15);
-
                /*
                 *      No existing entry, create a new one.
                 */
-               entry = talloc_size(ft->tree, align + ft->src_dst_size);
+               entry = talloc_zero_size(ft->tree, sizeof(*entry) + ft->src_dst_size);
                if (!entry) return FR_TRACKING_ERROR;
 
-               memset(entry, 0, align + ft->src_dst_size);
+               talloc_set_name_const(entry, "fr_tracking_entry_t");
+
                entry->ft = ft;
                entry->timestamp = timestamp;
 
                /*
                 *      Copy the src_dst information over to the entry.
                 */
-               entry->src_dst = p = ((uint8_t *) entry) + align;
                entry->src_dst_size = ft->src_dst_size;
-               memcpy(p, src_dst, entry->src_dst_size);
+               memcpy(entry->src_dst, src_dst, entry->src_dst_size);
 
                /*
                 *      Copy the new packet over.
@@ -257,14 +246,6 @@ fr_tracking_status_t fr_radius_tracking_entry_insert(fr_tracking_entry_t **p_ent
                entry->reply_len = 0;
        }
 
-       /*
-        *      Don't change any of the fields we need
-        *      for the RB tree.
-        */
-       rad_assert(memcmp(my_entry.src_dst, src_dst, ft->src_dst_size) == 0);
-       rad_assert(my_entry.data[0] == entry->data[0]);
-       rad_assert(my_entry.data[1] == entry->data[1]);
-
        /*
         *      Don't change src_dst.  It MUST have
         *      the same data as the previous entry.
index f71e609f3626bb272d4996285df9a27cfa36f896..f51c9b4f2b81285518178f504ee5f9d5c612f6a7 100644 (file)
@@ -45,12 +45,12 @@ typedef struct fr_tracking_entry_t {
        fr_tracking_t           *ft;            //!< for cleanup_delay
        fr_event_timer_t const  *ev;            //!< for cleanup_delay
 
+       size_t                  src_dst_size;   //!< size of the data in src_dst
        fr_time_t               timestamp;      //!< when the request was received
-       void                    *src_dst;       //!< information about src/dst IP/port
-       size_t                  src_dst_size;   //!< size of the data in src_dst
        uint8_t const           *reply;         //!< the response (if any);
        size_t                  reply_len;      //!< the length of the response
        uint8_t                 data[20];       //!< the full RADIUS packet header
+       uint64_t                src_dst[0];     //!< information about src/dst IP/port
 } fr_tracking_entry_t;
 
 /**
index 629a69501e9f7692c9adafe6d2141a89be4e6d09..ef40d68942fd4789bd12c56c82dbd3689060f14e 100644 (file)
@@ -245,9 +245,7 @@ static void mod_cleanup_delay(UNUSED fr_event_list_t *el, UNUSED struct timeval
 static int mod_src_address(fr_socket_addr_t *src, UNUSED void const *instance, void const *packet_ctx)
 {
        fr_tracking_entry_t const               *track = packet_ctx;
-       proto_radius_udp_address_t const        *address = track->src_dst;
-
-       rad_assert(track->src_dst_size == sizeof(proto_radius_udp_address_t));
+       proto_radius_udp_address_t const        *address = (proto_radius_udp_address_t const *) &track->src_dst[0];
 
        memset(src, 0, sizeof(*src));
 
@@ -263,9 +261,7 @@ static int mod_src_address(fr_socket_addr_t *src, UNUSED void const *instance, v
 static int mod_dst_address(fr_socket_addr_t *dst, UNUSED void const *instance, void const *packet_ctx)
 {
        fr_tracking_entry_t const               *track = packet_ctx;
-       proto_radius_udp_address_t const        *address = track->src_dst;
-
-       rad_assert(track->src_dst_size == sizeof(proto_radius_udp_address_t));
+       proto_radius_udp_address_t const        *address = (proto_radius_udp_address_t const *) &track->src_dst[0];
 
        memset(dst, 0, sizeof(*dst));
 
@@ -281,9 +277,7 @@ static int mod_dst_address(fr_socket_addr_t *dst, UNUSED void const *instance, v
 static RADCLIENT *mod_client(UNUSED void const *instance, void const *packet_ctx)
 {
        fr_tracking_entry_t const               *track = packet_ctx;
-       proto_radius_udp_address_t const        *address = track->src_dst;
-
-       rad_assert(track->src_dst_size == sizeof(proto_radius_udp_address_t));
+       proto_radius_udp_address_t const        *address = (proto_radius_udp_address_t const *) &track->src_dst[0];
 
        return address->client;
 }
@@ -293,7 +287,7 @@ static ssize_t mod_encode(void const *instance, REQUEST *request, uint8_t *buffe
 {
        proto_radius_udp_t const                *inst = instance;
        fr_tracking_entry_t const               *track = request->async->packet_ctx;
-       proto_radius_udp_address_t const        *address = track->src_dst;
+       proto_radius_udp_address_t const        *address = (proto_radius_udp_address_t const *) &track->src_dst[0];
        RADCLIENT                               *client;
 
        /*
@@ -336,9 +330,7 @@ static int mod_decode(void const *instance, REQUEST *request, UNUSED uint8_t *co
 {
        proto_radius_udp_t const                        *inst = instance;
        fr_tracking_entry_t const               *track = request->async->packet_ctx;
-       proto_radius_udp_address_t const        *address = track->src_dst;
-
-       rad_assert(track->src_dst_size == sizeof(proto_radius_udp_address_t));
+       proto_radius_udp_address_t const        *address = (proto_radius_udp_address_t const *) &track->src_dst[0];
 
        request->client = address->client;
        request->packet->if_index = address->if_index;
@@ -1118,7 +1110,7 @@ static ssize_t mod_write(void *instance, void *packet_ctx,
 {
        proto_radius_udp_t              *inst = talloc_get_type_abort(instance, proto_radius_udp_t);
        fr_tracking_entry_t             *track = packet_ctx;
-       proto_radius_udp_address_t      *address = track->src_dst;
+       proto_radius_udp_address_t      *address = (proto_radius_udp_address_t *) &track->src_dst[0];
 
        ssize_t                         data_size;
        fr_time_t                       reply_time;
@@ -1277,7 +1269,7 @@ static ssize_t mod_write(void *instance, void *packet_ctx,
                        fr_dlist_remove(&saved->entry);
                        fr_dlist_insert_tail(&inst->dynamic_clients.packets, &saved->entry);
 
-                       address = saved->track->src_dst;
+                       address = (proto_radius_udp_address_t *) &saved->track->src_dst[0];
                        address->client = newclient;
 
                        rad_assert(inst->dynamic_clients.num_pending_packets > 0);