From: Alan T. DeKok Date: Thu, 15 Feb 2018 21:37:17 +0000 (-0500) Subject: cache leftover data when retransmitting X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b9929536eb2743d94d8d7877f4d271faeb80fc7e;p=thirdparty%2Ffreeradius-server.git cache leftover data when retransmitting --- diff --git a/src/modules/proto_detail/proto_detail.h b/src/modules/proto_detail/proto_detail.h index 2431ce2c27c..c42f4b661df 100644 --- a/src/modules/proto_detail/proto_detail.h +++ b/src/modules/proto_detail/proto_detail.h @@ -114,6 +114,9 @@ typedef struct proto_detail_work_t { int count; //!< number of packets we read from this file. + size_t leftover; + uint8_t *leftover_buffer; + size_t last_search; //!< where we last searched in the buffer //!< MUST be offset, as the buffers can change. diff --git a/src/modules/proto_detail/proto_detail_work.c b/src/modules/proto_detail/proto_detail_work.c index 7623549c9da..d463157e3fd 100644 --- a/src/modules/proto_detail/proto_detail_work.c +++ b/src/modules/proto_detail/proto_detail_work.c @@ -144,6 +144,18 @@ static ssize_t mod_read(void *instance, void **packet_ctx, fr_time_t **recv_time fr_dlist_remove(&track->entry); + /* + * Don't over-write "leftover" bytes! + */ + if (*leftover) { + rad_assert(inst->leftover == 0); + if (!inst->leftover_buffer) MEM(inst->leftover_buffer = talloc_array(inst, uint8_t, buffer_len)); + + memcpy(inst->leftover_buffer, buffer, *leftover); + inst->leftover = *leftover; + *leftover = 0; + } + rad_assert(buffer_len >= track->packet_len); memcpy(buffer, track->packet, track->packet_len); @@ -175,6 +187,18 @@ static ssize_t mod_read(void *instance, void **packet_ctx, fr_time_t **recv_time return 0; } + /* + * If we've cached leftover data from the ring buffer, + * copy it back. + */ + if (inst->leftover) { + rad_assert(*leftover == 0); + rad_assert(inst->leftover < buffer_len); + + memcpy(buffer, inst->leftover_buffer, inst->leftover); + *leftover = inst->leftover; + } + /* * Seek to the current read offset. */