From da67595b694c79886117bf92cf16e57e8ec9d14a Mon Sep 17 00:00:00 2001
From: Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>
Date: Sat, 12 May 2018 19:36:44 +0900
Subject: [PATCH] Fix memory leak

---
 lib/ngtcp2_acktr.c   | 10 ++++++++++
 lib/ngtcp2_ringbuf.c |  2 ++
 lib/ngtcp2_ringbuf.h |  3 +++
 3 files changed, 15 insertions(+)

diff --git a/lib/ngtcp2_acktr.c b/lib/ngtcp2_acktr.c
index 6101f78d..5796c70f 100644
--- a/lib/ngtcp2_acktr.c
+++ b/lib/ngtcp2_acktr.c
@@ -202,8 +202,18 @@ ngtcp2_acktr_ack_entry *ngtcp2_acktr_add_ack(ngtcp2_acktr *acktr,
   ngtcp2_acktr_ack_entry *ent;
 
   if (unprotected) {
+    if (ngtcp2_ringbuf_full(&acktr->hs_acks)) {
+      ent = ngtcp2_ringbuf_get(&acktr->hs_acks,
+                               ngtcp2_ringbuf_len(&acktr->hs_acks) - 1);
+      ngtcp2_mem_free(acktr->mem, ent->ack);
+    }
     ent = ngtcp2_ringbuf_push_front(&acktr->hs_acks);
   } else {
+    if (ngtcp2_ringbuf_full(&acktr->acks)) {
+      ent = ngtcp2_ringbuf_get(&acktr->acks,
+                               ngtcp2_ringbuf_len(&acktr->acks) - 1);
+      ngtcp2_mem_free(acktr->mem, ent->ack);
+    }
     ent = ngtcp2_ringbuf_push_front(&acktr->acks);
   }
   ent->ack = fr;
diff --git a/lib/ngtcp2_ringbuf.c b/lib/ngtcp2_ringbuf.c
index a5754dba..a0176070 100644
--- a/lib/ngtcp2_ringbuf.c
+++ b/lib/ngtcp2_ringbuf.c
@@ -78,3 +78,5 @@ void *ngtcp2_ringbuf_get(ngtcp2_ringbuf *rb, size_t offset) {
 }
 
 size_t ngtcp2_ringbuf_len(ngtcp2_ringbuf *rb) { return rb->len; }
+
+int ngtcp2_ringbuf_full(ngtcp2_ringbuf *rb) { return rb->len == rb->nmemb; }
diff --git a/lib/ngtcp2_ringbuf.h b/lib/ngtcp2_ringbuf.h
index 260c5a82..2ba4a204 100644
--- a/lib/ngtcp2_ringbuf.h
+++ b/lib/ngtcp2_ringbuf.h
@@ -91,4 +91,7 @@ void *ngtcp2_ringbuf_get(ngtcp2_ringbuf *rb, size_t offset);
 /* ngtcp2_ringbuf_len returns the number of elements stored. */
 size_t ngtcp2_ringbuf_len(ngtcp2_ringbuf *rb);
 
+/* ngtcp2_ringbuf_full returns nonzero if |rb| is full. */
+int ngtcp2_ringbuf_full(ngtcp2_ringbuf *rb);
+
 #endif /* NGTCP2_RINGBUF_H */
-- 
GitLab