]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
BMP: Fix bug in buffer resize
authorOndrej Zajicek <santiago@crfreenet.org>
Wed, 31 May 2023 16:32:53 +0000 (18:32 +0200)
committerOndrej Zajicek <santiago@crfreenet.org>
Wed, 31 May 2023 16:42:14 +0000 (18:42 +0200)
The buffer code in bmp_buffer_grow(), reuse the MRT buffer handling code.

Based on comments by Michal Zagorski <mzagorsk@akamai.com>, Thanks!

proto/bmp/buffer.c

index 9e62e468c1fa21ecd30d81cc3f5cd91e832753f2..be9dd6985aa2865587c6d4919dd73dd1780ca498 100644 (file)
@@ -25,22 +25,32 @@ bmp_buffer_free(buffer *buf)
   buf->start = buf->pos = buf->end = NULL;
 }
 
+/**
+ * @brief bmp_buffer_grow
+ * @param buf - buffer to grow
+ * @param n   - required amount of available space
+ * Resize buffer in a way that there is at least @n bytes of available space.
+ */
 static void
 bmp_buffer_grow(buffer *buf, const size_t n)
 {
-  const size_t pos = bmp_buffer_pos(buf);
-  buf->start = mb_realloc(buf->start, n);
+  size_t pos = bmp_buffer_pos(buf);
+  size_t size = bmp_buffer_size(buf);
+  size_t req = pos + n;
+
+  while (size < req)
+    size = size * 3 / 2;
+
+  buf->start = mb_realloc(buf->start, size);
   buf->pos = buf->start + pos;
-  buf->end = buf->start + n;
+  buf->end = buf->start + size;
 }
 
 void
 bmp_buffer_need(buffer *buf, const size_t n)
 {
   if (bmp_buffer_avail(buf) < n)
-  {
     bmp_buffer_grow(buf, n);
-  }
 }
 
 void