Possible event_callback_ leak: MediaStream never deletes its event callback
I found a possible native heap leak in MediaStream. onMediaStreamEvent stores a heap
Nan::Callback in the event_callback_ member, but the member is never deleted — not on
re-registration and not in the destructor — so it leaks for every stream that registers
an event callback.
File: erizoAPI/MediaStream.cc
Functions: MediaStream::onMediaStreamEvent, MediaStream::closeEvents, ~MediaStream
NAN_METHOD(MediaStream::onMediaStreamEvent) {
...
me->setMediaStreamEventListener(obj);
obj->has_event_callback_ = true;
obj->event_callback_ = new Nan::Callback(info[0].As<Function>()); // heap alloc into member
}
The destructor path never deletes it:
void MediaStream::closeEvents() {
has_stats_callback_ = false;
has_event_callback_ = false;
... // no delete of event_callback_
}
event_callback_ (a heap Nan::Callback holding a v8::Persistent to the JS function) is
never deleted anywhere in the file, so every MediaStream that called
onMediaStreamEvent leaks that callback when the stream is destroyed, and re-registering
leaks the previous one.
The sibling class does this correctly — WebRtcConnection::~WebRtcConnection calls
delete event_callback_;. MediaStream is missing the equivalent delete.
Suggested fix: delete event_callback_; (and stats_callback_) in closeEvents()/the
destructor, and delete the previous callback before overwriting the member on
re-registration.
Possible
event_callback_leak:MediaStreamnever deletes its event callbackI found a possible native heap leak in
MediaStream.onMediaStreamEventstores a heapNan::Callbackin theevent_callback_member, but the member is never deleted — not onre-registration and not in the destructor — so it leaks for every stream that registers
an event callback.
File:
erizoAPI/MediaStream.ccFunctions:
MediaStream::onMediaStreamEvent,MediaStream::closeEvents,~MediaStreamThe destructor path never deletes it:
event_callback_(a heapNan::Callbackholding av8::Persistentto the JS function) isnever
deleted anywhere in the file, so everyMediaStreamthat calledonMediaStreamEventleaks that callback when the stream is destroyed, and re-registeringleaks the previous one.
The sibling class does this correctly —
WebRtcConnection::~WebRtcConnectioncallsdelete event_callback_;.MediaStreamis missing the equivalent delete.Suggested fix:
delete event_callback_;(andstats_callback_) incloseEvents()/thedestructor, and delete the previous callback before overwriting the member on
re-registration.