From: Alan T. DeKok Date: Mon, 15 Jan 2018 15:28:52 +0000 (-0500) Subject: move src_dst to array[0] at the end of the struct X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3cb95feae0e0f5e43d2b8d60b7ea7b64693a151b;p=thirdparty%2Ffreeradius-server.git move src_dst to array[0] at the end of the struct --- diff --git a/src/lib/io/track.c b/src/lib/io/track.c index 8537fa1e90d..413521b0c4f 100644 --- a/src/lib/io/track.c +++ b/src/lib/io/track.c @@ -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. diff --git a/src/lib/io/track.h b/src/lib/io/track.h index f71e609f362..f51c9b4f2b8 100644 --- a/src/lib/io/track.h +++ b/src/lib/io/track.h @@ -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; /** diff --git a/src/modules/proto_radius/proto_radius_udp.c b/src/modules/proto_radius/proto_radius_udp.c index 629a69501e9..ef40d68942f 100644 --- a/src/modules/proto_radius/proto_radius_udp.c +++ b/src/modules/proto_radius/proto_radius_udp.c @@ -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);