1
0
Fork 0
mirror of https://github.com/ossrs/srs.git synced 2025-03-09 15:49:59 +00:00

fix mem leak for delete[] SharedPtrMessage array, explicit free elems. remove srs_freepa. 0.9.95

This commit is contained in:
winlin 2014-05-13 14:24:39 +08:00
parent 0a1c0afe8d
commit befde6acf7
15 changed files with 209 additions and 174 deletions

View file

@ -50,7 +50,7 @@ void SrsCodecBuffer::append(void* data, int len)
void SrsCodecBuffer::free()
{
size = 0;
srs_freepa(bytes);
srs_freep(bytes);
}
SrsCodecSample::SrsCodecSample()
@ -125,12 +125,12 @@ SrsCodec::SrsCodec()
SrsCodec::~SrsCodec()
{
srs_freepa(avc_extra_data);
srs_freepa(aac_extra_data);
srs_freep(avc_extra_data);
srs_freep(aac_extra_data);
srs_freep(stream);
srs_freepa(sequenceParameterSetNALUnit);
srs_freepa(pictureParameterSetNALUnit);
srs_freep(sequenceParameterSetNALUnit);
srs_freep(pictureParameterSetNALUnit);
}
int SrsCodec::audio_aac_demux(int8_t* data, int size, SrsCodecSample* sample)
@ -207,7 +207,7 @@ int SrsCodec::audio_aac_demux(int8_t* data, int size, SrsCodecSample* sample)
// 1.6.2.1 AudioSpecificConfig, in aac-mp4a-format-ISO_IEC_14496-3+2001.pdf, page 33.
aac_extra_size = stream->left();
if (aac_extra_size > 0) {
srs_freepa(aac_extra_data);
srs_freep(aac_extra_data);
aac_extra_data = new char[aac_extra_size];
memcpy(aac_extra_data, stream->current(), aac_extra_size);
}
@ -321,7 +321,7 @@ int SrsCodec::video_avc_demux(int8_t* data, int size, SrsCodecSample* sample)
// 5.2.4.1.1 Syntax, H.264-AVC-ISO_IEC_14496-15.pdf, page 16
avc_extra_size = stream->left();
if (avc_extra_size > 0) {
srs_freepa(avc_extra_data);
srs_freep(avc_extra_data);
avc_extra_data = new char[avc_extra_size];
memcpy(avc_extra_data, stream->current(), avc_extra_size);
}
@ -366,7 +366,7 @@ int SrsCodec::video_avc_demux(int8_t* data, int size, SrsCodecSample* sample)
return ret;
}
if (sequenceParameterSetLength > 0) {
srs_freepa(sequenceParameterSetNALUnit);
srs_freep(sequenceParameterSetNALUnit);
sequenceParameterSetNALUnit = new char[sequenceParameterSetLength];
memcpy(sequenceParameterSetNALUnit, stream->current(), sequenceParameterSetLength);
stream->skip(sequenceParameterSetLength);
@ -396,7 +396,7 @@ int SrsCodec::video_avc_demux(int8_t* data, int size, SrsCodecSample* sample)
return ret;
}
if (pictureParameterSetLength > 0) {
srs_freepa(pictureParameterSetNALUnit);
srs_freep(pictureParameterSetNALUnit);
pictureParameterSetNALUnit = new char[pictureParameterSetLength];
memcpy(pictureParameterSetNALUnit, stream->current(), pictureParameterSetLength);
stream->skip(pictureParameterSetLength);

View file

@ -93,7 +93,7 @@ SrsFileBuffer::SrsFileBuffer()
SrsFileBuffer::~SrsFileBuffer()
{
srs_freepa(start);
srs_freep(start);
}
int SrsFileBuffer::fullfill(const char* filename)
@ -117,7 +117,7 @@ int SrsFileBuffer::fullfill(const char* filename)
goto finish;
}
srs_freepa(start);
srs_freep(start);
pos = last = start = new char[filesize];
end = start + filesize;
@ -407,15 +407,15 @@ int SrsConfDirective::read_token(SrsFileBuffer* buffer, vector<string>& args)
if (found) {
int len = buffer->pos - pstart;
char* word = new char[len];
memcpy(word, pstart, len);
word[len - 1] = 0;
char* aword = new char[len];
memcpy(aword, pstart, len);
aword[len - 1] = 0;
string word_str = word;
string word_str = aword;
if (!word_str.empty()) {
args.push_back(word_str);
}
srs_freepa(word);
srs_freep(aword);
if (ch == ';') {
return ERROR_SYSTEM_CONFIG_DIRECTIVE;

View file

@ -87,7 +87,7 @@ void SrsConnection::stop()
{
srs_close_stfd(stfd);
srs_freep(pthread);
srs_freepa(ip);
srs_freep(ip);
}
int SrsConnection::get_peer_ip()

View file

@ -474,20 +474,33 @@ int SrsEdgeForwarder::cycle()
srs_verbose("no packets to forward.");
continue;
}
SrsAutoFree(SrsSharedPtrMessage*, msgs, true);
// all msgs to forward.
// all msgs to forward to origin.
// @remark, becareful, all msgs must be free explicitly,
// free by send_and_free_message or srs_freep.
for (int i = 0; i < count; i++) {
SrsSharedPtrMessage* msg = msgs[i];
srs_assert(msg);
msgs[i] = NULL;
// never use free msgs array, for it will memory leak.
// if error, directly free msgs.
if (ret != ERROR_SUCCESS) {
srs_freep(msg);
continue;
}
if ((ret = client->send_and_free_message(msg)) != ERROR_SUCCESS) {
srs_error("edge publish forwarder send message to server failed. ret=%d", ret);
return ret;
break;
}
}
// free the array itself.
srs_freep(msgs);
if (ret != ERROR_SUCCESS) {
return ret;
}
}
return ret;

View file

@ -360,7 +360,7 @@ int SrsFFMPEG::start()
}
srs_trace("start transcoder, log: %s, params: %s",
log_file.c_str(), pparam);
srs_freepa(pparam);
srs_freep(pparam);
}
// TODO: fork or vfork?

View file

@ -352,20 +352,33 @@ int SrsForwarder::forward()
srs_verbose("no packets to forward.");
continue;
}
SrsAutoFree(SrsSharedPtrMessage*, msgs, true);
// all msgs to forward.
// @remark, becareful, all msgs must be free explicitly,
// free by send_and_free_message or srs_freep.
for (int i = 0; i < count; i++) {
SrsSharedPtrMessage* msg = msgs[i];
srs_assert(msg);
msgs[i] = NULL;
// never use free msgs array, for it will memory leak.
// if error, directly free msgs.
if (ret != ERROR_SUCCESS) {
srs_freep(msg);
continue;
}
if ((ret = client->send_and_free_message(msg)) != ERROR_SUCCESS) {
srs_error("forwarder send message to server failed. ret=%d", ret);
return ret;
break;
}
}
// free the array itself.
srs_freep(msgs);
if (ret != ERROR_SUCCESS) {
return ret;
}
}
return ret;

View file

@ -523,7 +523,7 @@ SrsHttpMessage::~SrsHttpMessage()
srs_freep(_body);
srs_freep(_uri);
srs_freep(_match);
srs_freepa(_http_ts_send_buffer);
srs_freep(_http_ts_send_buffer);
}
char* SrsHttpMessage::http_ts_send_buffer()

View file

@ -72,7 +72,7 @@ SrsFastLog::SrsFastLog()
SrsFastLog::~SrsFastLog()
{
srs_freepa(log_data);
srs_freep(log_data);
if (fd > 0) {
::close(fd);

View file

@ -513,9 +513,10 @@ int SrsRtmpConn::playing(SrsSource* source)
srs_verbose("no packets in queue.");
continue;
}
SrsAutoFree(SrsSharedPtrMessage*, msgs, true);
// sendout messages
// @remark, becareful, all msgs must be free explicitly,
// free by send_and_free_message or srs_freep.
for (int i = 0; i < count; i++) {
SrsSharedPtrMessage* msg = msgs[i];
@ -525,6 +526,13 @@ int SrsRtmpConn::playing(SrsSource* source)
srs_assert(msg);
// never use free msgs array, for it will memory leak.
// if error, directly free msgs.
if (ret != ERROR_SUCCESS) {
srs_freep(msg);
continue;
}
// foreach msg, collect the duration.
// @remark: never use msg when sent it, for the protocol sdk will free it.
if (starttime < 0 || starttime > msg->header.timestamp) {
@ -535,9 +543,14 @@ int SrsRtmpConn::playing(SrsSource* source)
if ((ret = rtmp->send_and_free_message(msg)) != ERROR_SUCCESS) {
srs_error("send message to client failed. ret=%d", ret);
return ret;
break;
}
}
// free the array itself.
srs_freep(msgs);
if (ret != ERROR_SUCCESS) {
return ret;
}
// if duration specified, and exceed it, stop play live.
// @see: https://github.com/winlinvip/simple-rtmp-server/issues/45

View file

@ -844,7 +844,7 @@ int SrsSource::on_meta_data(SrsMessage* msg, SrsOnMetaDataPacket* metadata)
char* payload = NULL;
if ((ret = metadata->encode(size, payload)) != ERROR_SUCCESS) {
srs_error("encode metadata error. ret=%d", ret);
srs_freepa(payload);
srs_freep(payload);
return ret;
}
srs_verbose("encode metadata success.");

12
trunk/src/core/srs_core.hpp Executable file → Normal file
View file

@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
// current release version
#define VERSION_MAJOR "0"
#define VERSION_MINOR "9"
#define VERSION_REVISION "94"
#define VERSION_REVISION "95"
#define RTMP_SIG_SRS_VERSION VERSION_MAJOR"."VERSION_MINOR"."VERSION_REVISION
// server info.
#define RTMP_SIG_SRS_KEY "srs"
@ -81,13 +81,9 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
p = NULL; \
} \
(void)0
// free the p which represents a array
#define srs_freepa(p) \
if (p) { \
delete[] p; \
p = NULL; \
} \
(void)0
// sometimes, the freepa is useless,
// it's recomments to free each elem explicit.
// so we remove the srs_freepa utility.
// compare
#define srs_min(a, b) (((a) < (b))? (a) : (b))

View file

@ -340,7 +340,7 @@ int srs_write_packet(srs_rtmp_t rtmp, int type, u_int32_t timestamp, char* data,
msg = new SrsSharedPtrMessage();
if ((ret = msg->initialize(&header, data, size)) != ERROR_SUCCESS) {
srs_freepa(data);
srs_freep(data);
return ret;
}
} else if (type == SRS_RTMP_TYPE_VIDEO) {
@ -349,7 +349,7 @@ int srs_write_packet(srs_rtmp_t rtmp, int type, u_int32_t timestamp, char* data,
msg = new SrsSharedPtrMessage();
if ((ret = msg->initialize(&header, data, size)) != ERROR_SUCCESS) {
srs_freepa(data);
srs_freep(data);
return ret;
}
} else if (type == SRS_RTMP_TYPE_SCRIPT) {
@ -358,7 +358,7 @@ int srs_write_packet(srs_rtmp_t rtmp, int type, u_int32_t timestamp, char* data,
msg = new SrsSharedPtrMessage();
if ((ret = msg->initialize(&header, data, size)) != ERROR_SUCCESS) {
srs_freepa(data);
srs_freep(data);
return ret;
}
}
@ -370,7 +370,7 @@ int srs_write_packet(srs_rtmp_t rtmp, int type, u_int32_t timestamp, char* data,
}
} else {
// directly free data if not sent out.
srs_freepa(data);
srs_freep(data);
}
return ret;

View file

@ -336,10 +336,10 @@ namespace srs
void srs_key_block_free(key_block* key)
{
if (key->random0) {
srs_freepa(key->random0);
srs_freep(key->random0);
}
if (key->random1) {
srs_freepa(key->random1);
srs_freep(key->random1);
}
}
@ -427,10 +427,10 @@ namespace srs
void srs_digest_block_free(digest_block* digest)
{
if (digest->random0) {
srs_freepa(digest->random0);
srs_freep(digest->random0);
}
if (digest->random1) {
srs_freepa(digest->random1);
srs_freep(digest->random1);
}
}

View file

@ -192,9 +192,9 @@ SrsHandshakeBytes::SrsHandshakeBytes()
SrsHandshakeBytes::~SrsHandshakeBytes()
{
srs_freepa(c0c1);
srs_freepa(s0s1s2);
srs_freepa(c2);
srs_freep(c0c1);
srs_freep(s0s1s2);
srs_freep(c2);
}
int SrsHandshakeBytes::read_c0c1(ISrsProtocolReaderWriter* io)

View file

@ -1538,7 +1538,7 @@ SrsCommonMessage::SrsCommonMessage()
SrsCommonMessage::~SrsCommonMessage()
{
srs_freepa(payload);
srs_freep(payload);
}
SrsSharedPtrMessage::__SrsSharedPtr::__SrsSharedPtr()
@ -1550,7 +1550,7 @@ SrsSharedPtrMessage::__SrsSharedPtr::__SrsSharedPtr()
SrsSharedPtrMessage::__SrsSharedPtr::~__SrsSharedPtr()
{
srs_freepa(payload);
srs_freep(payload);
}
SrsSharedPtrMessage::SrsSharedPtrMessage()
@ -1678,14 +1678,14 @@ int SrsPacket::encode(int& psize, char*& ppayload)
if ((ret = stream.initialize(payload, size)) != ERROR_SUCCESS) {
srs_error("initialize the stream failed. ret=%d", ret);
srs_freepa(payload);
srs_freep(payload);
return ret;
}
}
if ((ret = encode_packet(&stream)) != ERROR_SUCCESS) {
srs_error("encode the packet failed. ret=%d", ret);
srs_freepa(payload);
srs_freep(payload);
return ret;
}