Skip to content

Possible event_callback_ leak: MediaStream never deletes its event callback #2032

Description

@OvOhao

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions