[opus] [PATCH] Fixed LibOpusEnc packet buffer reallocation by excluding the MAX_HEADER_SIZE parameter from the calculation of the new buffer size.

sven.fisch.er at web.de sven.fisch.er at web.de
Mon Feb 8 23:37:10 UTC 2021


Hi!

I'm currently converting some Flac-files to Opus, using a modified "gapless" version of OpusEnc. Doing so I encountered a few albums that crashed the encoder, due to a memory access violation.

This seemed to be very specific to the order in which files are processed and the included meta data (tags and pictures). So I had a look at the source code and I thing there's a bug in the current version of LibOpusEnc. At some point the packet buffer needes to be resized, but the MAX_HEADER_SIZE parameter causes an inconsistency. If the buffer must be enlarged by a small number of bytes and this number is smaller than the maximum header size, the buffer won't be resized.

I've tried to prepare a patch for this issue (see below). It would be great if someone could have a look at this. Thanks.

Kind regards,
Sven

 

>From 347472e6ebdb9164ff9733e08ffb7a6dbd23d0df Mon Sep 17 00:00:00 2001
From: Sven Fischer
Date: Mon, 8 Feb 2021 22:53:49 +0100
Subject: [PATCH] Fixed libopusenc packet buffer reallocation by excluding the MAX_HEADER_SIZE parameter from the calculation of the new buffer size.
---
 src/ogg_packer.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/ogg_packer.c b/src/ogg_packer.c
index 39d5534..e7d28a6 100644
--- a/src/ogg_packer.c
+++ b/src/ogg_packer.c
@@ -241,10 +241,10 @@ unsigned char *oggp_get_packet_buffer(oggpacker *oggp, oggp_int32 bytes) {
     if (oggp->buf_fill + bytes > oggp->buf_size) {
       size_t newsize;
       unsigned char *newbuf;
-      newsize = oggp->buf_fill + bytes + MAX_HEADER_SIZE;
+      newsize = oggp->buf_fill + bytes;
       /* Making sure we don't need to do that too often. */
       newsize = newsize*3/2;
-      newbuf = realloc(oggp->alloc_buf, newsize);
+      newbuf = realloc(oggp->alloc_buf, newsize + MAX_HEADER_SIZE);
       if (newbuf != NULL) {
         oggp->alloc_buf = newbuf;
         oggp->buf_size = newsize;
-- 
2.25.1
 


More information about the opus mailing list