]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
cache leftover data when retransmitting
authorAlan T. DeKok <aland@freeradius.org>
Thu, 15 Feb 2018 21:37:17 +0000 (16:37 -0500)
committerAlan T. DeKok <aland@freeradius.org>
Thu, 15 Feb 2018 21:37:34 +0000 (16:37 -0500)
src/modules/proto_detail/proto_detail.h
src/modules/proto_detail/proto_detail_work.c

index 2431ce2c27c3b5c4e0afd2ff8d35f9bdc532c396..c42f4b661df368c1fe5543a3ae9f757268c17371 100644 (file)
@@ -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.
 
index 7623549c9dada342649e4d750fb4f8956722d993..d463157e3fdf8f9c398d650f90600fd90bf5c7a8 100644 (file)
@@ -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.
         */