gentoo-ebuilds/media-libs/libmp4v2/files/libmp4v2-2.1.3-mem-leaks-1.patch
Miroslav Šulc a61d5d15bb
media-libs/libmp4v2: fixed mem leaks
Bug: https://bugs.gentoo.org/907275
Signed-off-by: Miroslav Šulc <fordfrog@gentoo.org>
2023-06-04 09:48:36 +02:00

150 lines
4.3 KiB
Diff

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;
}