diff --git a/src/apps/relay/ns_ioalib_engine_impl.c b/src/apps/relay/ns_ioalib_engine_impl.c index e857c637..9fe6b94f 100644 --- a/src/apps/relay/ns_ioalib_engine_impl.c +++ b/src/apps/relay/ns_ioalib_engine_impl.c @@ -268,6 +268,9 @@ static stun_buffer_list_elem *get_elem_from_buffer_list(stun_buffer_list *bufs) ret=bufs->head; bufs->head=ret->next; --bufs->tsz; + if(bufs->tsz == 0) { + bufs->tail = NULL; + } ret->next=NULL; ret->buf.len = 0; @@ -285,12 +288,13 @@ static void pop_elem_from_buffer_list(stun_buffer_list *bufs) stun_buffer_list_elem *ret = bufs->head; bufs->head=ret->next; --bufs->tsz; + if(bufs->tsz == 0) { + bufs->tail = NULL; + } free(ret); } } - - static stun_buffer_list_elem *new_blist_elem(ioa_engine_handle e) { stun_buffer_list_elem *ret = get_elem_from_buffer_list(&(e->bufs)); @@ -313,8 +317,14 @@ static stun_buffer_list_elem *new_blist_elem(ioa_engine_handle e) static inline void add_elem_to_buffer_list(stun_buffer_list *bufs, stun_buffer_list_elem *buf_elem) { - buf_elem->next = bufs->head; - bufs->head = buf_elem; + // We want a queue, so add to tail + if(bufs->tail) { + bufs->tail->next = buf_elem; + } else { + bufs->head = buf_elem; + } + buf_elem->next = NULL; + bufs->tail = buf_elem; bufs->tsz += 1; } diff --git a/src/apps/relay/ns_ioalib_impl.h b/src/apps/relay/ns_ioalib_impl.h index 03a6ea2d..4907002d 100644 --- a/src/apps/relay/ns_ioalib_impl.h +++ b/src/apps/relay/ns_ioalib_impl.h @@ -77,6 +77,7 @@ typedef struct _stun_buffer_list_elem { typedef struct _stun_buffer_list { stun_buffer_list_elem *head; + stun_buffer_list_elem *tail; size_t tsz; } stun_buffer_list;