From 7565b705ad10fc67197d24eea6a75ada34553968 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Fri, 5 Apr 2013 16:36:29 +0200 Subject: [PATCH] Fixed memory leak in FLV library. --- lib/flv_tag.cpp | 23 +++++++++++++++++------ lib/flv_tag.h | 1 + 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/lib/flv_tag.cpp b/lib/flv_tag.cpp index fc8dada5..3c8a1994 100644 --- a/lib/flv_tag.cpp +++ b/lib/flv_tag.cpp @@ -335,6 +335,16 @@ FLV::Tag::Tag(const RTMPStream::Chunk& O){ ChunkLoader(O); } +/// Generic destructor that frees the allocated memory in the internal data variable, if any. +FLV::Tag::~Tag(){ + if (data){ + free(data); + data = 0; + buf = 0; + len = 0; + } +} + /// Assignment operator - works exactly like the copy constructor. /// This operator checks for self-assignment. FLV::Tag & FLV::Tag::operator=(const FLV::Tag& O){ @@ -759,13 +769,14 @@ bool FLV::Tag::DTSCMetaInit(DTSC::Stream & S){ bool FLV::Tag::ChunkLoader(const RTMPStream::Chunk& O){ len = O.len + 15; if (len > 0){ - if ( !data){ - data = (char*)malloc(len); - buf = len; - }else{ - if (buf < len){ - data = (char*)realloc(data, len); + if (buf < len || !data){ + char * newdata = (char*)realloc(data, len); + // on realloc fail, retain the old data + if (newdata != 0){ + data = newdata; buf = len; + }else{ + return false; } } memcpy(data + 11, &(O.data[0]), O.len); diff --git a/lib/flv_tag.h b/lib/flv_tag.h index b4bb5198..5b4289a5 100644 --- a/lib/flv_tag.h +++ b/lib/flv_tag.h @@ -39,6 +39,7 @@ namespace FLV { Tag(const Tag& O); ///< Copy constructor, copies the contents of an existing tag. Tag & operator=(const Tag& O); ///< Assignment operator - works exactly like the copy constructor. Tag(const RTMPStream::Chunk& O); ///