summaryrefslogtreecommitdiff
path: root/media-libs/libmp4v2/files/libmp4v2-2.1.3-mem-leaks-1.patch
diff options
context:
space:
mode:
Diffstat (limited to 'media-libs/libmp4v2/files/libmp4v2-2.1.3-mem-leaks-1.patch')
-rw-r--r--media-libs/libmp4v2/files/libmp4v2-2.1.3-mem-leaks-1.patch150
1 files changed, 150 insertions, 0 deletions
diff --git a/media-libs/libmp4v2/files/libmp4v2-2.1.3-mem-leaks-1.patch b/media-libs/libmp4v2/files/libmp4v2-2.1.3-mem-leaks-1.patch
new file mode 100644
index 000000000000..a12c24f4e3fe
--- /dev/null
+++ b/media-libs/libmp4v2/files/libmp4v2-2.1.3-mem-leaks-1.patch
@@ -0,0 +1,150 @@
+From c724815a541b763455ff38922af96f652627bce6 Mon Sep 17 00:00:00 2001
+From: Robert Kausch <robert.kausch@freac.org>
+Date: Tue, 16 May 2023 00:19:02 +0200
+Subject: [PATCH] Fix memory leaks in case MP4File::ReadBytes() throws an
+ exception.
+
+--- a/src/atom_rtp.cpp
++++ b/src/atom_rtp.cpp
+@@ -125,12 +125,19 @@ void MP4RtpAtom::ReadHntiType()
+
+ // read sdp string, length is implicit in size of atom
+ uint64_t size = GetEnd() - m_File.GetPosition();
+- char* data = (char*)MP4Malloc(size + 1);
++ char* data = (char*) MP4Malloc(size + 1);
+ ASSERT(data != NULL);
+- m_File.ReadBytes((uint8_t*)data, size);
+- data[size] = '\0';
+- ((MP4StringProperty*)m_pProperties[1])->SetValue(data);
+- MP4Free(data);
++ try {
++ m_File.ReadBytes((uint8_t*) data, size);
++ data[size] = '\0';
++ ((MP4StringProperty*) m_pProperties[1])->SetValue(data);
++ MP4Free(data);
++ }
++ catch (Exception*) {
++ // free memory and rethrow
++ MP4Free(data);
++ throw;
++ }
+ }
+
+ void MP4RtpAtom::Write()
+--- a/src/atom_sdp.cpp
++++ b/src/atom_sdp.cpp
+@@ -36,12 +36,19 @@ void MP4SdpAtom::Read()
+ {
+ // read sdp string, length is implicit in size of atom
+ uint64_t size = GetEnd() - m_File.GetPosition();
+- char* data = (char*)MP4Malloc(size + 1);
++ char* data = (char*) MP4Malloc(size + 1);
+ ASSERT(data != NULL);
+- m_File.ReadBytes((uint8_t*)data, size);
+- data[size] = '\0';
+- ((MP4StringProperty*)m_pProperties[0])->SetValue(data);
+- MP4Free(data);
++ try {
++ m_File.ReadBytes((uint8_t*) data, size);
++ data[size] = '\0';
++ ((MP4StringProperty*) m_pProperties[0])->SetValue(data);
++ MP4Free(data);
++ }
++ catch (Exception*) {
++ // free memory and rethrow
++ MP4Free(data);
++ throw;
++ }
+ }
+
+ void MP4SdpAtom::Write()
+--- a/src/mp4file_io.cpp
++++ b/src/mp4file_io.cpp
+@@ -325,19 +325,26 @@ char* MP4File::ReadString()
+ {
+ uint32_t length = 0;
+ uint32_t alloced = 64;
+- char* data = (char*)MP4Malloc(alloced);
+-
+- do {
+- if (length == alloced) {
+- data = (char*)MP4Realloc(data, alloced * 2);
+- if (data == NULL) return NULL;
+- alloced *= 2;
+- }
+- ReadBytes((uint8_t*)&data[length], 1);
+- length++;
+- } while (data[length - 1] != 0);
+-
+- data = (char*)MP4Realloc(data, length);
++ char* data = (char*) MP4Malloc(alloced);
++ try {
++ do {
++ if (length == alloced) {
++ data = (char*) MP4Realloc(data, alloced * 2);
++ if (data == NULL)
++ return NULL;
++ alloced *= 2;
++ }
++ ReadBytes((uint8_t*) &data[length], 1);
++ length++;
++ } while (data[length - 1] != 0);
++
++ data = (char*) MP4Realloc(data, length);
++ }
++ catch (Exception*) {
++ // free memory and rethrow
++ MP4Free(data);
++ throw;
++ }
+ return data;
+ }
+
+@@ -384,21 +391,34 @@ char* MP4File::ReadCountedString(uint8_t charSize, bool allowExpandedCount, uint
+ }
+
+ uint32_t byteLength = charLength * charSize;
+- char* data = (char*)MP4Malloc(byteLength + 1);
+- if (byteLength > 0) {
+- ReadBytes((uint8_t*)data, byteLength);
+- }
+- data[byteLength] = '\0';
+-
+- // read padding
+- if (fixedLength) {
+- const uint8_t padsize = fixedLength - byteLength -1U;
+- if( padsize ) {
+- uint8_t* padbuf = (uint8_t*)malloc( padsize );
+- ReadBytes( padbuf, padsize );
+- free( padbuf );
++ char* data = (char*) MP4Malloc(byteLength + 1);
++ try {
++ if (byteLength > 0)
++ ReadBytes((uint8_t*) data, byteLength);
++ data[byteLength] = '\0';
++
++ // read padding
++ if (fixedLength) {
++ const uint8_t padsize = fixedLength - byteLength -1U;
++ if (padsize) {
++ uint8_t* padbuf = (uint8_t*) MP4Malloc(padsize);
++ try {
++ ReadBytes(padbuf, padsize);
++ MP4Free(padbuf);
++ }
++ catch (Exception*) {
++ // free memory and rethrow
++ MP4Free(padbuf);
++ throw;
++ }
++ }
+ }
+ }
++ catch (Exception*) {
++ // free memory and rethrow
++ MP4Free(data);
++ throw;
++ }
+
+ return data;
+ }