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:
parent
0a1c0afe8d
commit
befde6acf7
15 changed files with 209 additions and 174 deletions
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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?
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -72,7 +72,7 @@ SrsFastLog::SrsFastLog()
|
|||
|
||||
SrsFastLog::~SrsFastLog()
|
||||
{
|
||||
srs_freepa(log_data);
|
||||
srs_freep(log_data);
|
||||
|
||||
if (fd > 0) {
|
||||
::close(fd);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.");
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue