Skip to content

Commit

Permalink
[GStreamer] Prevent a crash when fetching data on stopped MediaRecorder
Browse files Browse the repository at this point in the history
https://bugs.webkit.org/show_bug.cgi?id=260649
rdar://problem/114370120

Reviewed by Xabier Rodriguez-Calvar.

The backend (GStreamer transcoder) is now clearly separated from the MediaRecorderPrivate, so that
fetchData() can create a weak pointer to be used from the main thread. If the backend was destroyed
in-flight no unsafe memory access is performed.

Test: http/wpt/mediarecorder/MediaRecorder-start-stop-crash.html
Canonical link: https://commits.webkit.org/267345@main
  • Loading branch information
philn committed Aug 28, 2023
1 parent 5b28d64 commit 37bc742
Show file tree
Hide file tree
Showing 5 changed files with 224 additions and 61 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<!doctype html>
<html>
<head>
<title>Starting and stopping a MediaRecorder should trigger no crash</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
</head>
<body>
<script>
promise_test(async (t) => {
const audioContext = new AudioContext();
const destination = audioContext.createMediaStreamDestination();
const recorder = new MediaRecorder(destination.stream);

recorder.start();
recorder.stop();
}, "Starting and stopping a MediaRecorder should trigger no crash");
</script>
</body>
</html>
52 changes: 52 additions & 0 deletions Source/WebCore/platform/graphics/gstreamer/GRefPtrGStreamer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,10 @@
#undef GST_USE_UNSTABLE_API
#endif

#if USE(GSTREAMER_TRANSCODER)
#include <gst/transcoder/gsttranscoder.h>
#endif

namespace WTF {

template<> GRefPtr<GstMiniObject> adoptGRef(GstMiniObject* ptr)
Expand Down Expand Up @@ -857,6 +861,54 @@ template<> void derefGPtr<GstWebRTCICE>(GstWebRTCICE* ptr)

#endif // USE(GSTREAMER_WEBRTC)

#if USE(GSTREAMER_TRANSCODER)

template<>
GRefPtr<GstTranscoder> adoptGRef(GstTranscoder* ptr)
{
return GRefPtr<GstTranscoder>(ptr, GRefPtrAdopt);
}

template<>
GstTranscoder* refGPtr<GstTranscoder>(GstTranscoder* ptr)
{
if (ptr)
gst_object_ref(GST_OBJECT_CAST(ptr));

return ptr;
}

template<>
void derefGPtr<GstTranscoder>(GstTranscoder* ptr)
{
if (ptr)
gst_object_unref(ptr);
}

template<>
GRefPtr<GstTranscoderSignalAdapter> adoptGRef(GstTranscoderSignalAdapter* ptr)
{
return GRefPtr<GstTranscoderSignalAdapter>(ptr, GRefPtrAdopt);
}

template<>
GstTranscoderSignalAdapter* refGPtr<GstTranscoderSignalAdapter>(GstTranscoderSignalAdapter* ptr)
{
if (ptr)
g_object_ref(G_OBJECT(ptr));

return ptr;
}

template<>
void derefGPtr<GstTranscoderSignalAdapter>(GstTranscoderSignalAdapter* ptr)
{
if (ptr)
g_object_unref(ptr);
}

#endif // USE(GSTREAMER_TRANSCODER)

} // namespace WTF

#endif // USE(GSTREAMER)
15 changes: 15 additions & 0 deletions Source/WebCore/platform/graphics/gstreamer/GRefPtrGStreamer.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,11 @@ typedef struct _GstRTPHeaderExtension GstRTPHeaderExtension;
typedef struct _GstWebRTCICE GstWebRTCICE;
#endif

#if USE(GSTREAMER_TRANSCODER)
typedef struct _GstTranscoder GstTranscoder;
typedef struct _GstTranscoderSignalAdapter GstTranscoderSignalAdapter;
#endif

namespace WTF {

template<> GRefPtr<GstPlugin> adoptGRef(GstPlugin* ptr);
Expand Down Expand Up @@ -222,6 +227,16 @@ template<> void derefGPtr<GstWebRTCICE>(GstWebRTCICE*);

#endif

#if USE(GSTREAMER_TRANSCODER)
template<> GRefPtr<GstTranscoder> adoptGRef(GstTranscoder*);
template<> GstTranscoder* refGPtr<GstTranscoder>(GstTranscoder*);
template<> void derefGPtr<GstTranscoder>(GstTranscoder*);

template<> GRefPtr<GstTranscoderSignalAdapter> adoptGRef(GstTranscoderSignalAdapter*);
template<> GstTranscoderSignalAdapter* refGPtr<GstTranscoderSignalAdapter>(GstTranscoderSignalAdapter*);
template<> void derefGPtr<GstTranscoderSignalAdapter>(GstTranscoderSignalAdapter*);
#endif // USE(GSTREAMER_TRANSCODER)

} // namespace WTF

#endif // USE(GSTREAMER)

0 comments on commit 37bc742

Please sign in to comment.