Bug 214812 - [GStreamer] UI process crash during user media permission request calling gst_v4l2_open() in UI process
Summary: [GStreamer] UI process crash during user media permission request calling gst...
Status: NEW
Alias: None
Product: WebKit
Classification: Unclassified
Component: WebRTC (show other bugs)
Version: WebKit Nightly Build
Hardware: PC Linux
: P2 Normal
Assignee: Nobody
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2020-07-26 13:42 PDT by Michael Catanzaro
Modified: 2021-02-04 10:37 PST (History)
6 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Michael Catanzaro 2020-07-26 13:42:22 PDT
This looks identical to bug #214811, except it occurs in the UI process.

We should ideally not link to GStreamer at all in the unsandboxed UI process. :/ I wonder, is it possible to avoid gst_v4l2_open() in the UI process?

Again, note frame 5 of the backtrace:

#5  0x00007f45f305fb09 in gst_v4l2_open (v4l2object=v4l2object@entry=0x44e15a0) at v4l2_calls.c:621
        __txt = 0x3fd9ee0 "Could not open device '/dev/video0' for reading and writing."
        __dbg = 0x3e40dd0 "system error: Permission denied"
        st = 
            {st_dev = 5, st_ino = 594457, st_nlink = 1, st_mode = 8576, st_uid = 0, st_gid = 0, __pad0 = 0, st_rdev = 20736, st_size = 0, st_blksize = 4096, st_blocks = 0, st_atim = {tv_sec = 1595793659, tv_nsec = 652724677}, st_mtim = {tv_sec = 1595793659, tv_nsec = 652724677}, st_ctim = {tv_sec = 1595793659, tv_nsec = 652724677}, __glibc_reserved = {0, 0, 0}}
        libv4l2_fd = -1
        __func__ = "gst_v4l2_open"

(gdb) bt full
#0  g_logv
    (log_domain=0x7f4601eca960 <g_log_domain_gstreamer> "GStreamer", log_level=G_LOG_LEVEL_CRITICAL, format=<optimized out>, args=<optimized out>) at ../glib/gmessages.c:1377
        domain = 0x0
        data = 0x0
        depth = 0
        log_func = 0x7f4601e1a5e0 <debug_log_handler>
        domain_fatal_mask = <optimized out>
        masquerade_fatal = <optimized out>
        test_level = <optimized out>
        was_fatal = <optimized out>
        was_recursion = <optimized out>
        msg = 0x41fd800 "gst_element_message_full_with_details: assertion 'GST_IS_ELEMENT (element)' failed"
        msg_alloc = 0x41fd800 "gst_element_message_full_with_details: assertion 'GST_IS_ELEMENT (element)' failed"
        i = 3
#1  0x00007f460caec233 in g_log
    (log_domain=<optimized out>, log_level=log_level@entry=G_LOG_LEVEL_CRITICAL, format=format@entry=0x7f460cb3e6ff "%s: assertion '%s' failed") at ../glib/gmessages.c:1415
        args = {{gp_offset = 40, fp_offset = 48, overflow_arg_area = 0x7ffd99045250, reg_save_area = 0x7ffd99045190}}
#2  0x00007f460caeca2d in g_return_if_fail_warning
    (log_domain=<optimized out>, pretty_function=pretty_function@entry=0x7f4601ed5ac0 <__func__.24665> "gst_element_message_full_with_details", expression=<optimized out>) at ../glib/gmessages.c:2771
#3  0x00007f4601e4bc08 in gst_element_message_full_with_details
    (element=<optimized out>, type=type@entry=GST_MESSAGE_ERROR, domain=4354, code=code@entry=7, text=text@entry=0x3fd9ee0 "Could not open device '/dev/video0' for reading and writing.", debug=debug@entry=0x3e40dd0 "system error: Permission denied", file=0x7f45f306d4e9 "v4l2_calls.c", function=0x7f45f306e360 <__func__.29605> "gst_v4l2_open", line=621, structure=0x0) at gstelement.c:2112
        gerror = 0x0
        name = <optimized out>
        sent_text = <optimized out>
        sent_debug = <optimized out>
        has_debug = 1
        message = 0x0
        __PRETTY_FUNCTION__ = "gst_element_message_full_with_details"
        __func__ = "gst_element_message_full_with_details"
#4  0x00007f4601e4bc4c in gst_element_message_full
    (element=<optimized out>, type=type@entry=GST_MESSAGE_ERROR, domain=<optimized out>, code=code@entry=7, text=text@entry=0x3fd9ee0 "Could not open device '/dev/video0' for reading and writing.", debug=debug@entry=0x3e40dd0 "system error: Permission denied", file=0x7f45f306d4e9 "v4l2_calls.c", function=0x7f45f306e360 <__func__.29605> "gst_v4l2_open", line=621) at gstelement.c:2204
#5  0x00007f45f305fb09 in gst_v4l2_open (v4l2object=v4l2object@entry=0x44e15a0) at v4l2_calls.c:621
        __txt = 0x3fd9ee0 "Could not open device '/dev/video0' for reading and writing."
        __dbg = 0x3e40dd0 "system error: Permission denied"
        st = 
            {st_dev = 5, st_ino = 594457, st_nlink = 1, st_mode = 8576, st_uid = 0, st_gid = 0, __pad0 = 0, st_rdev = 20736, st_size = 0, st_blksize = 4096, st_blocks = 0, st_atim = {tv_sec = 1595793659, tv_nsec = 652724677}, st_mtim = {tv_sec = 1595793659, tv_nsec = 652724677}, st_ctim = {tv_sec = 1595793659, tv_nsec = 652724677}, __glibc_reserved = {0, 0, 0}}
        libv4l2_fd = -1
        __func__ = "gst_v4l2_open"
#6  0x00007f45f303bdfb in gst_v4l2_device_provider_probe_device
    (device_name=0x0, props=0x257a2c0, device_path=0x4207bd0 "/dev/video0", provider=0x30e6830 [GstV4l2DeviceProvider]--Type <RET> for more, q to quit, c to continue without paging--c
) at gstv4l2deviceprovider.c:119
        v4l2obj = 0x44e15a0
        device = 0x0
        type = GST_V4L2_DEVICE_TYPE_INVALID
        caps = <optimized out>
        st = {st_dev = 5, st_ino = 594457, st_nlink = 1, st_mode = 8576, st_uid = 0, st_gid = 0, __pad0 = 0, st_rdev = 20736, st_size = 0, st_blksize = 4096, st_blocks = 0, st_atim = {tv_sec = 1595793659, tv_nsec = 652724677}, st_mtim = {tv_sec = 1595793659, tv_nsec = 652724677}, st_ctim = {tv_sec = 1595793659, tv_nsec = 652724677}, __glibc_reserved = {0, 0, 0}}
        __func__ = "gst_v4l2_device_provider_probe_device"
        props = 0x257a2c0
        device = <optimized out>
        self = 0x30e6830 [GstV4l2DeviceProvider]
        it = 0x30a8d60
        devices = 0x0
#7  gst_v4l2_device_provider_probe (provider=0x30e6830 [GstV4l2DeviceProvider]) at gstv4l2deviceprovider.c:213
        props = 0x257a2c0
        device = <optimized out>
        self = 0x30e6830 [GstV4l2DeviceProvider]
        it = 0x30a8d60
        devices = 0x0
#8  0x00007f4601e44c0d in gst_device_provider_get_devices (provider=provider@entry=0x30e6830 [GstV4l2DeviceProvider]) at gstdeviceprovider.c:420
        klass = 0x3315070
        devices = 0x0
        started = <optimized out>
        item = <optimized out>
        __func__ = "gst_device_provider_get_devices"
#9  0x00007f4601e4340d in gst_device_monitor_get_devices (monitor=0x23da5b0 [GstDeviceMonitor]) at gstdevicemonitor.c:393
        tmpdev = <optimized out>
        provider = 0x30e6830 [GstV4l2DeviceProvider]
        item = <optimized out>
        devices = 0x0
        hidden = 0x0
        i = 0
        cookie = 1
        __func__ = "gst_device_monitor_get_devices"
        __PRETTY_FUNCTION__ = "gst_device_monitor_get_devices"
#10 0x00007f460aaec7b5 in WebCore::GStreamerCaptureDeviceManager::refreshCaptureDevices() (this=0x7f460c0a9740 <WebCore::GStreamerVideoCaptureDeviceManager::singleton()::manager>) at DerivedSources/ForwardingHeaders/wtf/glib/GRefPtr.h:105
        __FUNCTION__ = "refreshCaptureDevices"
        devices = <optimized out>
#11 0x00007f460aaec96a in WebCore::GStreamerCaptureDeviceManager::captureDevices() (this=0x7f460c0a9740 <WebCore::GStreamerVideoCaptureDeviceManager::singleton()::manager>) at ../../Source/WebCore/platform/mediastream/gstreamer/GStreamerCaptureDeviceManager.cpp:84
#12 0x00007f460a3319b1 in WebCore::RealtimeMediaSourceCenter::getMediaStreamDevices() (this=0x7f460c0a04c0 <WebCore::RealtimeMediaSourceCenter::singleton()::center>) at ../../Source/WebCore/platform/mediastream/RealtimeMediaSourceCenter.cpp:122
        device = <optimized out>
        __for_range = <optimized out>
        __for_begin = <optimized out>
        __for_end = <optimized out>
        result = {<WTF::VectorBuffer<WebCore::CaptureDevice, 0, WTF::FastMalloc>> = {<WTF::VectorBufferBase<WebCore::CaptureDevice, WTF::FastMalloc>> = {m_buffer = 0x7f45f2e13500, m_capacity = 16, m_size = 1}, <No data fields>}, <No data fields>}
#13 0x00007f4608c1912e in WebKit::UserMediaPermissionRequestManagerProxy::computeFilteredDeviceList(bool, WTF::String const&) (this=0x7f45f081e930, revealIdsAndLabels=true, deviceIDHashSalt=...) at ../../Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.cpp:606
        devices = {<WTF::VectorBuffer<WebCore::CaptureDevice, 0, WTF::FastMalloc>> = {<WTF::VectorBufferBase<WebCore::CaptureDevice, WTF::FastMalloc>> = {m_buffer = 0x7f45f2e13500, m_capacity = 16, m_size = 1}, <No data fields>}, <No data fields>}
        cameraCount = <optimized out>
        microphoneCount = <optimized out>
        filteredDevices = {<WTF::VectorBuffer<WebCore::CaptureDevice, 0, WTF::FastMalloc>> = {<WTF::VectorBufferBase<WebCore::CaptureDevice, WTF::FastMalloc>> = {m_buffer = 0x91bf0def, m_capacity = 1055669231, m_size = 1104660344}, <No data fields>}, <No data fields>}
        __func__ = "computeFilteredDeviceList"
#14 0x00007f4608c1abea in operator() (deviceIDHashSalt=..., __closure=0x7f45f2e16440) at ../../Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.cpp:689
        originHasPersistentAccess = false
        topLevelDocumentOrigin = {static isRef = <optimized out>, m_ptr = 0x7f45f0875f80}
        weakThis = {m_impl = {static isRefPtr = <optimized out>, m_ptr = 0x7f45f2eaa480}}
        this = 0x7f45f081e930
        completionHandler = {m_function = {m_callableWrapper = std::unique_ptr<class WTF::Detail::CallableWrapperBase<void, WTF::Vector<WebCore::CaptureDevice, 0, WTF::CrashOnOverflow, 16, WTF::FastMalloc> const&, WTF::String const&>> = {get() = 0x7f458bbec870}}}
        userMediaDocumentOrigin = {static isRef = <optimized out>, m_ptr = 0x7f45f0875fc0}
        frameID = {<WTF::ObjectIdentifierBase> = {<No data fields>}, m_identifier = 14, static m_generationProtected = false}
        requestID = 34
#15 WTF::Detail::CallableWrapper<WebKit::UserMediaPermissionRequestManagerProxy::enumerateMediaDevicesForFrame(WebCore::FrameIdentifier, WTF::Ref<WebCore::SecurityOrigin>&&, WTF::Ref<WebCore::SecurityOrigin>&&, WTF::CompletionHandler<void(const WTF::Vector<WebCore::CaptureDevice>&, const WTF::String&)>&&)::<lambda(WebKit::UserMediaPermissionRequestManagerProxy::PermissionInfo)> mutable::<lambda(WTF::String&&)>, void, WTF::String&&>::call(WTF::String &&) (this=0x7f45f2e16438, in#0=...) at DerivedSources/ForwardingHeaders/wtf/Function.h:52
#16 0x00007f4608c01869 in WTF::Function<void (WTF::String&&)>::operator()(WTF::String&&) const (in#0=..., this=<optimized out>) at DerivedSources/ForwardingHeaders/wtf/Function.h:80
        origins = {static MaxLength = 2147483647, m_impl = {static isRefPtr = <optimized out>, m_ptr = 0x7f45f2eca5f0}}
        deviceIdHashSalt = <optimized out>
#17 WTF::CompletionHandler<void (WTF::String&&)>::operator()(WTF::String&&) (in#0=..., this=0x7f45f08e00a0) at DerivedSources/ForwardingHeaders/wtf/CompletionHandler.h:62
        origins = {static MaxLength = 2147483647, m_impl = {static isRefPtr = <optimized out>, m_ptr = 0x7f45f2eca5f0}}
        deviceIdHashSalt = <optimized out>
#18 WebKit::DeviceIdHashSaltStorage::completeDeviceIdHashSaltForOriginCall(WebCore::SecurityOriginData&&, WebCore::SecurityOriginData&&, WTF::CompletionHandler<void (WTF::String&&)>&&) (this=this@entry=0x7f45f08f23f0, documentOrigin=..., parentOrigin=..., completionHandler=...) at ../../Source/WebKit/UIProcess/DeviceIdHashSaltStorage.cpp:226
        origins = {static MaxLength = 2147483647, m_impl = {static isRefPtr = <optimized out>, m_ptr = 0x7f45f2eca5f0}}
        deviceIdHashSalt = <optimized out>
#19 0x00007f4608c01e25 in WebKit::DeviceIdHashSaltStorage::deviceIdHashSaltForOrigin(WebCore::SecurityOrigin const&, WebCore::SecurityOrigin const&, WTF::CompletionHandler<void (WTF::String&&)>&&) (this=this@entry=0x7f45f08f23f0, documentOrigin=..., parentOrigin=..., completionHandler=...) at DerivedSources/ForwardingHeaders/wtf/Optional.h:373
#20 0x00007f4608c1a9ba in operator() (permissionInfo=<optimized out>, __closure=0x7f45f2e05578) at /usr/include/c++/10/bits/unique_ptr.h:354
        originHasPersistentAccess = false
        requestOrigin = @0x7f45f0875fc0: {<WTF::ThreadSafeRefCounted<WebCore::SecurityOrigin, (WTF::DestructionThread)0>> = {<WTF::ThreadSafeRefCountedBase> = {m_refCount = {<std::__atomic_base<unsigned int>> = {static _S_alignment = 4, _M_i = 2}, static is_always_lock_free = true}}, <No data fields>}, m_data = {protocol = {static MaxLength = 2147483647, m_impl = {static isRefPtr = <optimized out>, m_ptr = 0x7f45f2efa3c0}}, host = {static MaxLength = 2147483647, m_impl = {static isRefPtr = <optimized out>, m_ptr = 0x7f45f2e69028}}, port = {<WTF::constexpr_Optional_base<unsigned short>> = {init_ = false, storage_ = {dummy_ = 0 '\000', value_ = 0}}, <No data fields>}}, m_domain = {static MaxLength = 2147483647, m_impl = {static isRefPtr = <optimized out>, m_ptr = 0x7f45f2e69028}}, m_filePath = {static MaxLength = 2147483647, m_impl = {static isRefPtr = <optimized out>, m_ptr = 0x0}}, m_isUnique = false, m_universalAccess = false, m_domainWasSetInDOM = false, m_canLoadLocalResources = false, m_storageBlockingPolicy = WebCore::SecurityOrigin::AllowAllStorage, m_enforcesFilePathSeparation = false, m_needsStorageAccessFromFileURLsQuirk = false, m_isPotentiallyTrustworthy = true, m_isLocal = false}
        topOrigin = @0x7f45f0875f80: {<WTF::ThreadSafeRefCounted<WebCore::SecurityOrigin, (WTF::DestructionThread)0>> = {<WTF::ThreadSafeRefCountedBase> = {m_refCount = {<std::__atomic_base<unsigned int>> = {static _S_alignment = 4, _M_i = 2}, static is_always_lock_free = true}}, <No data fields>}, m_data = {protocol = {static MaxLength = 2147483647, m_impl = {static isRefPtr = <optimized out>, m_ptr = 0x7f45f2efa380}}, host = {static MaxLength = 2147483647, m_impl = {static isRefPtr = <optimized out>, m_ptr = 0x7f45f08827d0}}, port = {<WTF::constexpr_Optional_base<unsigned short>> = {init_ = false, storage_ = {dummy_ = 0 '\000', value_ = 0}}, <No data fields>}}, m_domain = {static MaxLength = 2147483647, m_impl = {static isRefPtr = <optimized out>, m_ptr = 0x7f45f08827d0}}, m_filePath = {static MaxLength = 2147483647, m_impl = {static isRefPtr = <optimized out>, m_ptr = 0x0}}, m_isUnique = false, m_universalAccess = false, m_domainWasSetInDOM = false, m_canLoadLocalResources = false, m_storageBlockingPolicy = WebCore::SecurityOrigin::AllowAllStorage, m_enforcesFilePathSeparation = false, m_needsStorageAccessFromFileURLsQuirk = false, m_isPotentiallyTrustworthy = true, m_isLocal = false}
        requestID = 34
        topLevelDocumentOrigin = {static isRef = <optimized out>, m_ptr = 0x0}
        this = 0x7f45f081e930
        completionHandler = {m_function = {m_callableWrapper = std::unique_ptr<class WTF::Detail::CallableWrapperBase<void, WTF::Vector<WebCore::CaptureDevice, 0, WTF::CrashOnOverflow, 16, WTF::FastMalloc> const&, WTF::String const&>> = {get() = 0x0}}}
        userMediaDocumentOrigin = {static isRef = <optimized out>, m_ptr = 0x0}
        frameID = {<WTF::ObjectIdentifierBase> = {<No data fields>}, m_identifier = 14, static m_generationProtected = false}
#21 WTF::Detail::CallableWrapper<WebKit::UserMediaPermissionRequestManagerProxy::enumerateMediaDevicesForFrame(WebCore::FrameIdentifier, WTF::Ref<WebCore::SecurityOrigin>&&, WTF::Ref<WebCore::SecurityOrigin>&&, WTF::CompletionHandler<void(const WTF::Vector<WebCore::CaptureDevice>&, const WTF::String&)>&&)::<lambda(WebKit::UserMediaPermissionRequestManagerProxy::PermissionInfo)>, void, WebKit::UserMediaPermissionCheckProxy::PermissionInfo>::call(WebKit::UserMediaPermissionCheckProxy::PermissionInfo) (this=0x7f45f2e05570, in#0=<optimized out>) at DerivedSources/ForwardingHeaders/wtf/Function.h:52
#22 0x00007f4608c1ad22 in WTF::Function<void (WebKit::UserMediaPermissionCheckProxy::PermissionInfo)>::operator()(WebKit::UserMediaPermissionCheckProxy::PermissionInfo) const (in#0=<optimized out>, this=<optimized out>) at DerivedSources/ForwardingHeaders/wtf/Function.h:80
        handler = {m_function = {m_callableWrapper = std::unique_ptr<class WTF::Detail::CallableWrapperBase<void, WebKit::UserMediaPermissionCheckProxy::PermissionInfo>> = {get() = 0x0}}}
        requestID = 33
        weakThis = {m_impl = {static isRefPtr = <optimized out>, m_ptr = 0x7f45f2eaa480}}
        this = 0x7f45f081e930
#23 WTF::CompletionHandler<void (WebKit::UserMediaPermissionCheckProxy::PermissionInfo)>::operator()(WebKit::UserMediaPermissionCheckProxy::PermissionInfo) (in#0=<optimized out>, this=0x7f45f0887020) at DerivedSources/ForwardingHeaders/wtf/CompletionHandler.h:62
        handler = {m_function = {m_callableWrapper = std::unique_ptr<class WTF::Detail::CallableWrapperBase<void, WebKit::UserMediaPermissionCheckProxy::PermissionInfo>> = {get() = 0x0}}}
        requestID = 33
        weakThis = {m_impl = {static isRefPtr = <optimized out>, m_ptr = 0x7f45f2eaa480}}
        this = 0x7f45f081e930
#24 operator()<WebKit::UserMediaPermissionCheckProxy::PermissionInfo> (permissionInfo=<optimized out>, __closure=0x7f45f0887008) at ../../Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.cpp:575
        handler = {m_function = {m_callableWrapper = std::unique_ptr<class WTF::Detail::CallableWrapperBase<void, WebKit::UserMediaPermissionCheckProxy::PermissionInfo>> = {get() = 0x0}}}
        requestID = 33
        weakThis = {m_impl = {static isRefPtr = <optimized out>, m_ptr = 0x7f45f2eaa480}}
        this = 0x7f45f081e930
#25 WTF::Detail::CallableWrapper<WebKit::UserMediaPermissionRequestManagerProxy::getUserMediaPermissionInfo(WebCore::FrameIdentifier, WTF::Ref<WebCore::SecurityOrigin>&&, WTF::Ref<WebCore::SecurityOrigin>&&, WTF::CompletionHandler<void(WebKit::UserMediaPermissionCheckProxy::PermissionInfo)>&&)::<lambda(auto:26)>, void, WebKit::UserMediaPermissionCheckProxy::PermissionInfo>::call(WebKit::UserMediaPermissionCheckProxy::PermissionInfo) (this=0x7f45f0887000, in#0=<optimized out>) at DerivedSources/ForwardingHeaders/wtf/Function.h:52
#26 0x00007f4608c165dc in WTF::Function<void (WebKit::UserMediaPermissionCheckProxy::PermissionInfo)>::operator()(WebKit::UserMediaPermissionCheckProxy::PermissionInfo) const (in#0=<optimized out>, this=<optimized out>) at DerivedSources/ForwardingHeaders/wtf/Function.h:80
#27 WTF::CompletionHandler<void (WebKit::UserMediaPermissionCheckProxy::PermissionInfo)>::operator()(WebKit::UserMediaPermissionCheckProxy::PermissionInfo) (in#0=<optimized out>, this=<synthetic pointer>) at DerivedSources/ForwardingHeaders/wtf/CompletionHandler.h:62
#28 WebKit::UserMediaPermissionCheckProxy::complete(WebKit::UserMediaPermissionCheckProxy::PermissionInfo) (this=<optimized out>, info=<optimized out>) at ../../Source/WebKit/UIProcess/UserMediaPermissionCheckProxy.cpp:61
#29 0x00007f4608d1ebc3 in webkitWebViewPermissionRequest(WebKitWebView*, WebKitPermissionRequest*) (request=0x449cda0) at ../../Source/WebKit/UIProcess/API/glib/WebKitWebView.cpp:526
#30 0x00007f4604aa0af0 in ffi_call_unix64 () at ../src/x86/unix64.S:76
#31 0x00007f4604aa02ab in ffi_call (cif=cif@entry=0x7ffd99045cc0, fn=fn@entry=0x7f4608d1eb90 <webkitWebViewPermissionRequest(WebKitWebView*, WebKitPermissionRequest*)>, rvalue=<optimized out>, avalue=avalue@entry=0x7ffd99045c10) at ../src/x86/ffi64.c:525
        classes = {X86_64_INTEGER_CLASS, 32765, 2567199840, 32765}
        stack = <optimized out>
        argp = 0x7ffd99045b10 "\n"
        arg_types = <optimized out>
        gprcount = 3
        ssecount = <optimized out>
        ngpr = 1
        nsse = 0
        i = <optimized out>
        avn = <optimized out>
        ret_in_memory = <optimized out>
        reg_args = <optimized out>
#36 0x00007f460cbe8c63 in <emit signal ??? on instance 0x4319550 [EphyWebView]> (instance=<optimized out>, signal_id=<optimized out>, detail=detail@entry=0) at ../gobject/gsignal.c:3554
        var_args = {{gp_offset = 32, fp_offset = 48, overflow_arg_area = 0x7ffd99046140, reg_save_area = 0x7ffd99046080}}
    #32 0x00007f460cbd038d in g_cclosure_marshal_generic (closure=<optimized out>, return_gvalue=<optimized out>, n_param_values=<optimized out>, param_values=<optimized out>, invocation_hint=<optimized out>, marshal_data=<optimized out>) at ../gobject/gclosure.c:1500
                rtype = <optimized out>
                rvalue = 0x7ffd99045c50
                n_args = <optimized out>
                atypes = <optimized out>
                args = <optimized out>
                i = <optimized out>
                cif = {abi = FFI_UNIX64, nargs = 3, arg_types = 0x7ffd99045c30, rtype = 0x7f4604aa10c0 <ffi_type_sint32>, bytes = 0, flags = 10}
                cc = <optimized out>
                enum_tmpval = <optimized out>
                tmpval_used = 0
    #33 0x00007f460cbcf88a in g_closure_invoke (closure=<optimized out>, return_value=<optimized out>, n_param_values=<optimized out>, param_values=<optimized out>, invocation_hint=<optimized out>) at ../gobject/gclosure.c:810
                real_closure = <optimized out>
                __func__ = "g_closure_invoke"
    #34 0x00007f460cbe1e7e in signal_emit_unlocked_R (node=<optimized out>, detail=detail@entry=0, instance=instance@entry=0x4319550, emission_return=emission_return@entry=0x7ffd99045fb0, instance_and_params=instance_and_params@entry=0x7ffd99045ec0) at ../gobject/gsignal.c:3780
                accumulator = 0x2876150
                emission = {next = 0x0, instance = 0x4319550, ihint = {signal_id = 365, detail = 0, run_type = G_SIGNAL_RUN_LAST}, state = EMISSION_RUN, chain_type = 0x23ccf60 [EphyWebView/WebKitWebView/WebKitWebViewBase/GtkContainer/GtkWidget/GInitiallyUnowned]}
                hlist = <optimized out>
                handler_list = <optimized out>
                return_accu = 0x7ffd99045e60
                accu = {g_type = 0x14 [gboolean], data = {{v_int = 0, v_uint = 0, v_long = 0, v_ulong = 0, v_int64 = 0, v_uint64 = 0, v_float = 0, v_double = 0, v_pointer = 0x0}, {v_int = 0, v_uint = 0, v_long = 0, v_ulong = 0, v_int64 = 0, v_uint64 = 0, v_float = 0, v_double = 0, v_pointer = 0x0}}}
                signal_id = 365
                max_sequential_handler_number = 23194
                return_value_altered = <optimized out>
    #35 0x00007f460cbe83be in g_signal_emit_valist (instance=<optimized out>, signal_id=<optimized out>, detail=<optimized out>, var_args=var_args@entry=0x7ffd99046060) at ../gobject/gsignal.c:3508
                return_value = {g_type = 0x14 [gboolean], data = {{v_int = 0, v_uint = 0, v_long = 0, v_ulong = 0, v_int64 = 0, v_uint64 = 0, v_float = 0, v_double = 0, v_pointer = 0x0}, {v_int = 0, v_uint = 0, v_long = 0, v_ulong = 0, v_int64 = 0, v_uint64 = 0, v_float = 0, v_double = 0, v_pointer = 0x0}}}
                error = 0x0
                rtype = 0x14 [gboolean]
                static_scope = 0
                instance_and_params = 0x7ffd99045ec0
                signal_return_type = <optimized out>
                param_values = 0x7ffd99045ed8
                node = <optimized out>
                i = <optimized out>
                n_params = <optimized out>
                __func__ = "g_signal_emit_valist"
#37 0x00007f4608d218eb in webkitWebViewMakePermissionRequest(_WebKitWebView*, _WebKitPermissionRequest*) (webView=<optimized out>, request=<optimized out>) at ../../Source/WebKit/UIProcess/API/glib/WebKitWebView.cpp:2561
        returnValue = 32581
#38 0x00007f4608d0f7eb in UIClient::checkUserMediaPermissionForOrigin(WebKit::WebPageProxy&, WebKit::WebFrameProxy&, API::SecurityOrigin&, API::SecurityOrigin&, WebKit::UserMediaPermissionCheckProxy&) (this=0x7f45f2e1e2a0, page=..., userMediaDocumentOrigin=..., topLevelDocumentOrigin=..., permissionRequest=...) at ../../Source/WebKit/UIProcess/API/glib/WebKitUIClient.cpp:295
        deviceInfoPermissionRequest = {m_ptr = 0x449cda0 [WebKitDeviceInfoPermissionRequest]}
#39 0x00007f4608c198e8 in WebKit::UserMediaPermissionRequestManagerProxy::getUserMediaPermissionInfo(WTF::ObjectIdentifier<WebCore::FrameIdentifierType>, WTF::Ref<WebCore::SecurityOrigin, WTF::DumbPtrTraits<WebCore::SecurityOrigin> >&&, WTF::Ref<WebCore::SecurityOrigin, WTF::DumbPtrTraits<WebCore::SecurityOrigin> >&&, WTF::CompletionHandler<void (WebKit::UserMediaPermissionCheckProxy::PermissionInfo)>&&) (this=this@entry=0x7f45f081e930, frameID=frameID@entry=..., userMediaDocumentOrigin=..., topLevelDocumentOrigin=..., handler=...) at /usr/include/c++/10/bits/unique_ptr.h:78
        webFrame = <optimized out>
        requestID = 33
#40 0x00007f4608c1a788 in WebKit::UserMediaPermissionRequestManagerProxy::enumerateMediaDevicesForFrame(WTF::ObjectIdentifier<WebCore::FrameIdentifierType>, WTF::Ref<WebCore::SecurityOrigin, WTF::DumbPtrTraits<WebCore::SecurityOrigin> >&&, WTF::Ref<WebCore::SecurityOrigin, WTF::DumbPtrTraits<WebCore::SecurityOrigin> >&&, WTF::CompletionHandler<void (WTF::Vector<WebCore::CaptureDevice, 0ul, WTF::CrashOnOverflow, 16ul, WTF::FastMalloc> const&, WTF::String const&)>&&) (this=this@entry=0x7f45f081e930, frameID=..., userMediaDocumentOrigin=..., topLevelDocumentOrigin=..., completionHandler=...) at /usr/include/c++/10/bits/unique_ptr.h:354
        __func__ = "enumerateMediaDevicesForFrame"
        callback = {__this = <optimized out>, __frameID = {<WTF::ObjectIdentifierBase> = {<No data fields>}, m_identifier = 14, static m_generationProtected = false}, __userMediaDocumentOrigin = {static isRef = <optimized out>, m_ptr = <optimized out>}, __topLevelDocumentOrigin = {static isRef = <optimized out>, m_ptr = <optimized out>}, __completionHandler = {m_function = {m_callableWrapper = std::unique_ptr<class WTF::Detail::CallableWrapperBase<void, WTF::Vector<WebCore::CaptureDevice, 0, WTF::CrashOnOverflow, 16, WTF::FastMalloc> const&, WTF::String const&>> = {get() = <optimized out>}}}}
#41 0x00007f4608c4da8f in WebKit::WebPageProxy::enumerateMediaDevicesForFrame(WTF::ObjectIdentifier<WebCore::FrameIdentifierType>, WebCore::SecurityOriginData const&, WebCore::SecurityOriginData const&, WTF::CompletionHandler<void (WTF::Vector<WebCore::CaptureDevice, 0ul, WTF::CrashOnOverflow, 16ul, WTF::FastMalloc> const&, WTF::String const&)>&&) (this=<optimized out>, frameID=..., userMediaDocumentOriginData=..., topLevelDocumentOriginData=..., completionHandler=...) at ../../Source/WebKit/UIProcess/WebPageProxy.cpp:8106
        frame = <optimized out>
#42 0x00007f4608961c99 in IPC::callMemberFunctionImpl<WebKit::WebPageProxy, void (WebKit::WebPageProxy::*)(WTF::ObjectIdentifier<WebCore::FrameIdentifierType>, WebCore::SecurityOriginData const&, WebCore::SecurityOriginData const&, WTF::CompletionHandler<void (WTF::Vector<WebCore::CaptureDevice, 0ul, WTF::CrashOnOverflow, 16ul, WTF::FastMalloc> const&, WTF::String const&)>&&), void (WTF::Vector<WebCore::CaptureDevice, 0ul, WTF::CrashOnOverflow, 16ul, WTF::FastMalloc> const&, WTF::String const&), std::tuple<WTF::ObjectIdentifier<WebCore::FrameIdentifierType>, WebCore::SecurityOriginData, WebCore::SecurityOriginData>, 0ul, 1ul, 2ul>(WebKit::WebPageProxy*, void (WebKit::WebPageProxy::*)(WTF::ObjectIdentifier<WebCore::FrameIdentifierType>, WebCore::SecurityOriginData const&, WebCore::SecurityOriginData const&, WTF::CompletionHandler<void (WTF::Vector<WebCore::CaptureDevice, 0ul, WTF::CrashOnOverflow, 16ul, WTF::FastMalloc> const&, WTF::String const&)>&&), WTF::CompletionHandler<void (WTF::Vector<WebCore::CaptureDevice, 0ul, WTF::CrashOnOverflow, 16ul, WTF::FastMalloc> const&, WTF::String const&)>&&, std::tuple<WTF::ObjectIdentifier<WebCore::FrameIdentifierType>, WebCore::SecurityOriginData, WebCore::SecurityOriginData>&&, std::integer_sequence<unsigned long, 0ul, 1ul, 2ul>) (args=..., completionHandler=..., function=<optimized out>, object=0x7f45939f9000) at /usr/include/c++/10/tuple:1306
        listenerID = {<WTF::constexpr_Optional_base<unsigned long>> = {init_ = true, storage_ = {dummy_ = 123 '{', value_ = 123}}, <No data fields>}
        arguments = {<WTF::Optional_base<std::tuple<WTF::ObjectIdentifier<WebCore::FrameIdentifierType>, WebCore::SecurityOriginData, WebCore::SecurityOriginData> >> = {init_ = true, storage_ = {dummy_ = 64 '@', value_ = std::tuple containing = {[1] = {<WTF::ObjectIdentifierBase> = {<No data fields>}, m_identifier = 14, static m_generationProtected = false}, [2] = {protocol = {static MaxLength = 2147483647, m_impl = {static isRefPtr = <optimized out>, m_ptr = 0x7f45f2efa320}}, host = {static MaxLength = 2147483647, m_impl = {static isRefPtr = <optimized out>, m_ptr = 0x7f45f0882730}}, port = {<WTF::constexpr_Optional_base<unsigned short>> = {init_ = false, storage_ = {dummy_ = 0 '\000', value_ = 0}}, <No data fields>}}, [3] = {protocol = {static MaxLength = 2147483647, m_impl = {static isRefPtr = <optimized out>, m_ptr = 0x7f45f2efa340}}, host = {static MaxLength = 2147483647, m_impl = {static isRefPtr = <optimized out>, m_ptr = 0x7f45f0882758}}, port = {<WTF::constexpr_Optional_base<unsigned short>> = {init_ = false, storage_ = {dummy_ = 0 '\000', value_ = 0}}, <No data fields>}}}}}, <No data fields>}
        completionHandler = {m_function = {m_callableWrapper = std::unique_ptr<class WTF::Detail::CallableWrapperBase<void, WTF::Vector<WebCore::CaptureDevice, 0, WTF::CrashOnOverflow, 16, WTF::FastMalloc> const&, WTF::String const&>> = {get() = 0x0}}}
warning: (Internal error: pc 0x7f46066df478 in read in psymtab, but not in symtab.)

warning: (Internal error: pc 0x7f46066df478 in read in psymtab, but not in symtab.)

warning: (Internal error: pc 0x7f46066df478 in read in psymtab, but not in symtab.)

warning: (Internal error: pc 0x7f46066df470 in read in psymtab, but not in symtab.)

warning: (Internal error: pc 0x7f46066df478 in read in psymtab, but not in symtab.)

warning: (Internal error: pc 0x7f46066df478 in read in psymtab, but not in symtab.)

#43 IPC::callMemberFunction<WebKit::WebPageProxy, void (WebKit::WebPageProxy::*)(WTF::ObjectIdentifier<WebCore::FrameIdentifierType>, WebCore::SecurityOriginData const&, WebCore::SecurityOriginData const&, WTF::CompletionHandler<void (WTF::Vector<WebCore::CaptureDevice, 0ul, WTF::CrashOnOverflow, 16ul, WTF::FastMalloc> const&, WTF::String const&)>&&), void (WTF::Vector<WebCore::CaptureDevice, 0ul, WTF::CrashOnOverflow, 16ul, WTF::FastMalloc> const&, WTF::String const&), std::tuple<WTF::ObjectIdentifier<WebCore::FrameIdentifierType>, WebCore::SecurityOriginData, WebCore::SecurityOriginData>, std::integer_sequence<unsigned long, 0ul, 1ul, 2ul> >(std::tuple<WTF::ObjectIdentifier<WebCore::FrameIdentifierType>, WebCore::SecurityOriginData, WebCore::SecurityOriginData>&&, WTF::CompletionHandler<void (WTF::Vector<WebCore::CaptureDevice, 0ul, WTF::CrashOnOverflow, 16ul, WTF::FastMalloc> const&, WTF::String const&)>&&, WebKit::WebPageProxy*, void (WebKit::WebPageProxy::*)(WTF::ObjectIdentifier<WebCore::FrameIdentifierType>, WebCore::SecurityOriginData const&, WebCore::SecurityOriginData const&, WTF::CompletionHandler<void (WTF::Vector<WebCore::CaptureDevice, 0ul, WTF::CrashOnOverflow, 16ul, WTF::FastMalloc> const&, WTF::String const&)>&&)) (function=<optimized out>, object=0x7f45939f9000, completionHandler=..., args=...) at ../../Source/WebKit/Platform/IPC/HandleMessage.h:61
        listenerID = {<WTF::constexpr_Optional_base<unsigned long>> = {init_ = true, storage_ = {dummy_ = 123 '{', value_ = 123}}, <No data fields>}
        arguments = {<WTF::Optional_base<std::tuple<WTF::ObjectIdentifier<WebCore::FrameIdentifierType>, WebCore::SecurityOriginData, WebCore::SecurityOriginData> >> = {init_ = true, storage_ = {dummy_ = 64 '@', value_ = std::tuple containing = {[1] = {<WTF::ObjectIdentifierBase> = {<No data fields>}, m_identifier = 14, static m_generationProtected = false}, [2] = {protocol = {static MaxLength = 2147483647, m_impl = {static isRefPtr = <optimized out>, m_ptr = 0x7f45f2efa320}}, host = {static MaxLength = 2147483647, m_impl = {static isRefPtr = <optimized out>, m_ptr = 0x7f45f0882730}}, port = {<WTF::constexpr_Optional_base<unsigned short>> = {init_ = false, storage_ = {dummy_ = 0 '\000', value_ = 0}}, <No data fields>}}, [3] = {protocol = {static MaxLength = 2147483647, m_impl = {static isRefPtr = <optimized out>, m_ptr = 0x7f45f2efa340}}, host = {static MaxLength = 2147483647, m_impl = {static isRefPtr = <optimized out>, m_ptr = 0x7f45f0882758}}, port = {<WTF::constexpr_Optional_base<unsigned short>> = {init_ = false, storage_ = {dummy_ = 0 '\000', value_ = 0}}, <No data fields>}}}}}, <No data fields>}
        completionHandler = {m_function = {m_callableWrapper = std::unique_ptr<class WTF::Detail::CallableWrapperBase<void, WTF::Vector<WebCore::CaptureDevice, 0, WTF::CrashOnOverflow, 16, WTF::FastMalloc> const&, WTF::String const&>> = {get() = 0x0}}}
#44 IPC::handleMessageAsync<Messages::WebPageProxy::EnumerateMediaDevicesForFrame, WebKit::WebPageProxy, void (WebKit::WebPageProxy::*)(WTF::ObjectIdentifier<WebCore::FrameIdentifierType>, WebCore::SecurityOriginData const&, WebCore::SecurityOriginData const&, WTF::CompletionHandler<void (WTF::Vector<WebCore::CaptureDevice, 0ul, WTF::CrashOnOverflow, 16ul, WTF::FastMalloc> const&, WTF::String const&)>&&)>(IPC::Connection&, IPC::Decoder&, WebKit::WebPageProxy*, void (WebKit::WebPageProxy::*)(WTF::ObjectIdentifier<WebCore::FrameIdentifierType>, WebCore::SecurityOriginData const&, WebCore::SecurityOriginData const&, WTF::CompletionHandler<void (WTF::Vector<WebCore::CaptureDevice, 0ul, WTF::CrashOnOverflow, 16ul, WTF::FastMalloc> const&, WTF::String const&)>&&)) (connection=..., decoder=..., object=object@entry=0x7f45939f9000, function=(void (WebKit::WebPageProxy::*)(class WebKit::WebPageProxy * const, class WTF::ObjectIdentifier<WebCore::FrameIdentifierType>, const struct WebCore::SecurityOriginData &, const struct WebCore::SecurityOriginData &, class WTF::CompletionHandler<void(const WTF::Vector<WebCore::CaptureDevice, 0, WTF::CrashOnOverflow, 16, WTF::FastMalloc>&, const WTF::String&)> &&)) 0x7f4608c4da20 <WebKit::WebPageProxy::enumerateMediaDevicesForFrame(WTF::ObjectIdentifier<WebCore::FrameIdentifierType>, WebCore::SecurityOriginData const&, WebCore::SecurityOriginData const&, WTF::CompletionHandler<void (WTF::Vector<WebCore::CaptureDevice, 0ul, WTF::CrashOnOverflow, 16ul, WTF::FastMalloc> const&, WTF::String const&)>&&)>) at ../../Source/WebKit/Platform/IPC/HandleMessage.h:183
        listenerID = {<WTF::constexpr_Optional_base<unsigned long>> = {init_ = true, storage_ = {dummy_ = 123 '{', value_ = 123}}, <No data fields>}
        arguments = {<WTF::Optional_base<std::tuple<WTF::ObjectIdentifier<WebCore::FrameIdentifierType>, WebCore::SecurityOriginData, WebCore::SecurityOriginData> >> = {init_ = true, storage_ = {dummy_ = 64 '@', value_ = std::tuple containing = {[1] = {<WTF::ObjectIdentifierBase> = {<No data fields>}, m_identifier = 14, static m_generationProtected = false}, [2] = {protocol = {static MaxLength = 2147483647, m_impl = {static isRefPtr = <optimized out>, m_ptr = 0x7f45f2efa320}}, host = {static MaxLength = 2147483647, m_impl = {static isRefPtr = <optimized out>, m_ptr = 0x7f45f0882730}}, port = {<WTF::constexpr_Optional_base<unsigned short>> = {init_ = false, storage_ = {dummy_ = 0 '\000', value_ = 0}}, <No data fields>}}, [3] = {protocol = {static MaxLength = 2147483647, m_impl = {static isRefPtr = <optimized out>, m_ptr = 0x7f45f2efa340}}, host = {static MaxLength = 2147483647, m_impl = {static isRefPtr = <optimized out>, m_ptr = 0x7f45f0882758}}, port = {<WTF::constexpr_Optional_base<unsigned short>> = {init_ = false, storage_ = {dummy_ = 0 '\000', value_ = 0}}, <No data fields>}}}}}, <No data fields>}
        completionHandler = {m_function = {m_callableWrapper = std::unique_ptr<class WTF::Detail::CallableWrapperBase<void, WTF::Vector<WebCore::CaptureDevice, 0, WTF::CrashOnOverflow, 16, WTF::FastMalloc> const&, WTF::String const&>> = {get() = 0x0}}}
warning: (Internal error: pc 0x7f46066df478 in read in psymtab, but not in symtab.)

#45 0x00007f460893cbf8 in WebKit::WebPageProxy::didReceiveMessage(IPC::Connection&, IPC::Decoder&) (this=0x7f45939f9000, connection=..., decoder=...) at DerivedSources/WebKit/WebPageProxyMessageReceiver.cpp:1496
        protectedThis = {static isRef = <optimized out>, m_ptr = 0x7f45939f9000}
#46 0x00007f4608b6e2f9 in IPC::MessageReceiverMap::dispatchMessage(IPC::Connection&, IPC::Decoder&) (this=this@entry=0x7f4593bfc9f0, connection=..., decoder=...) at ../../Source/WebKit/Platform/IPC/MessageReceiverMap.cpp:123
        messageReceiver = <optimized out>
#47 0x00007f4608bfc2b9 in WebKit::AuxiliaryProcessProxy::dispatchMessage(IPC::Connection&, IPC::Decoder&) (this=this@entry=0x7f4593bfc9c0, connection=..., decoder=...) at ../../Source/WebKit/UIProcess/AuxiliaryProcessProxy.cpp:209
#48 0x00007f4608c4b223 in WebKit::WebProcessProxy::didReceiveMessage(IPC::Connection&, IPC::Decoder&) (this=0x7f4593bfc9c0, connection=..., decoder=...) at ../../Source/WebKit/UIProcess/WebProcessProxy.cpp:770
#49 0x00007f4608b68fcd in IPC::Connection::dispatchMessage(std::unique_ptr<IPC::Decoder, std::default_delete<IPC::Decoder> >) (this=0x7f45f08a5480, message=std::unique_ptr<class IPC::Decoder> = {...}) at /usr/include/c++/10/bits/unique_ptr.h:420
        isDispatchingMessageWhileWaitingForSyncReply = <optimized out>
        oldDidReceiveInvalidMessage = false
#50 0x00007f4608b69727 in IPC::Connection::dispatchIncomingMessages() (this=0x7f45f08a5480) at /usr/include/c++/10/bits/unique_ptr.h:171
        message = std::unique_ptr<class IPC::Decoder> = {get() = 0x0}
        messagesToProcess = 0
        __func__ = "dispatchIncomingMessages"
warning: (Internal error: pc 0x7f46066df478 in read in psymtab, but not in symtab.)

#51 0x00007f46066951d3 in WTF::Function<void ()>::operator()() const (this=<synthetic pointer>) at ../../Source/WTF/wtf/Function.h:80
        didSuspendFunctions = false
warning: (Internal error: pc 0x7f46066df478 in read in psymtab, but not in symtab.)

warning: (Internal error: pc 0x7f46066df478 in read in psymtab, but not in symtab.)

#52 WTF::RunLoop::performWork() (warning: (Internal error: pc 0x7f46066df478 in read in psymtab, but not in symtab.)

this=0x7f45f08f8000) at ../../Source/WTF/wtf/RunLoop.cpp:119
        didSuspendFunctions = false
warning: (Internal error: pc 0x7f46066df478 in read in psymtab, but not in symtab.)

warning: (Internal error: pc 0x7f46066df478 in read in psymtab, but not in symtab.)

warning: (Internal error: pc 0x7f46066df478 in read in psymtab, but not in symtab.)

#53 0x00007f46066df479 in warning: (Internal error: pc 0x7f46066df478 in read in psymtab, but not in symtab.)

operator()warning: (Internal error: pc 0x7f46066df478 in read in psymtab, but not in symtab.)

warning: (Internal error: pc 0x7f46066df478 in read in psymtab, but not in symtab.)

 (warning: (Internal error: pc 0x7f46066df478 in read in psymtab, but not in symtab.)

userData=<optimized out>, __closure=0x0)warning: (Internal error: pc 0x7f46066df478 in read in psymtab, but not in symtab.)

 at ../../Source/WTF/wtf/glib/RunLoopGLib.cppwarning: (Internal error: pc 0x7f46066df478 in read in psymtab, but not in symtab.)

warning: (Internal error: pc 0x7f46066df478 in read in psymtab, but not in symtab.)

:68
warning: (Internal error: pc 0x7f46066df478 in read in psymtab, but not in symtab.)

warning: (Internal error: pc 0x7f46066df478 in read in psymtab, but not in symtab.)

warning: (Internal error: pc 0x7f46066df478 in read in psymtab, but not in symtab.)

warning: (Internal error: pc 0x7f46066df478 in read in psymtab, but not in symtab.)

#54 warning: (Internal error: pc 0x7f46066df478 in read in psymtab, but not in symtab.)

_FUN(gpointer)warning: (Internal error: pc 0x7f46066df478 in read in psymtab, but not in symtab.)

warning: (Internal error: pc 0x7f46066df478 in read in psymtab, but not in symtab.)

 ()warning: (Internal error: pc 0x7f46066df478 in read in psymtab, but not in symtab.)

 at ../../Source/WTF/wtf/glib/RunLoopGLib.cppwarning: (Internal error: pc 0x7f46066df478 in read in psymtab, but not in symtab.)

warning: (Internal error: pc 0x7f46066df478 in read in psymtab, but not in symtab.)

:70
warning: (Internal error: pc 0x7f46066df478 in read in psymtab, but not in symtab.)

warning: (Internal error: pc 0x7f46066df478 in read in psymtab, but not in symtab.)

#55 0x00007f460cae478f in g_main_dispatch (context=0x23c0400) at ../glib/gmain.c:3309
        dispatch = <optimized out>
        prev_source = 0x0
        was_in_call = <optimized out>
        user_data = 0x7f45f08f8000
        callback = warning: (Internal error: pc 0x7f46066df470 in read in psymtab, but not in symtab.)

0x7f46066df470 <_FUN(gpointer)>
        cb_funcs = 0x7f460cbba280 <g_source_callback_funcs>
        cb_data = 0x24b0df0
        need_destroy = <optimized out>
        source = 0x2486b90
        current = 0x23bfbd0
        i = 0
        __func__ = "g_main_dispatch"
#56 g_main_context_dispatch (context=0x23c0400) at ../glib/gmain.c:3974
#57 0x00007f460cae4b18 in g_main_context_iterate (context=context@entry=0x23c0400, block=block@entry=1, dispatch=dispatch@entry=1, self=<optimized out>) at ../glib/gmain.c:4047
        max_priority = 2147483647
        timeout = 13
        some_ready = 1
        nfds = <optimized out>
        allocated_nfds = <optimized out>
        fds = 0x429df00
#58 0x00007f460cae4be3 in g_main_context_iteration (context=context@entry=0x23c0400, may_block=may_block@entry=1) at ../glib/gmain.c:4108
        retval = <optimized out>
#59 0x00007f460ccfa72d in g_application_run (application=0x23b8770 [EphyShell], argc=-1727764652, argv=<optimized out>) at ../gio/gapplication.c:2559
        arguments = 0x2459800
        status = 0
        context = 0x23c0400
        acquired_context = <optimized out>
        __func__ = "g_application_run"
#60 0x0000000000404c37 in main (argc=1, argv=0x7ffd99046968) at ../../../../Projects/epiphany/src/ephy-main.c:432
        option_context = 0x23a2000
        option_group = 0x23a2090
        error = 0x0
        user_time = 0
        arbitrary_url = 0
        ctx = 0x27bd7e0
        mode = EPHY_EMBED_SHELL_MODE_BROWSER
        status = 124
        flags = EPHY_FILE_HELPERS_ENSURE_EXISTS
        desktop_info = 0x0
Comment 1 Michael Catanzaro 2020-07-26 13:51:47 PDT
OK, I have a reproducer for this one: visit my permanent BlueJeans meeting (link available privately on request) with webcam unplugged, then plug in the webcam. Crash is guaranteed.
Comment 2 Víctor M. Jáquez L. 2020-08-05 08:09:58 PDT
As far as I understand, the UIProcess request for the Media Capture permission, afterwards it queries for the available capture devices and which of them handle the constrains.

In the case of GStreamer, querying the available capture devices requires the launch of gstreamer environment in the UIProcess and queries the Video4Linux devices available and their capabilities.

If we want to move GStreamer/V4L2 operation out of UIProcess, we would need to add an IPC mechanism, iiuc, which I guess is what Mac does but with their platform API, not a WebKit IPC.
Comment 3 Philippe Normand 2020-08-05 09:09:10 PDT
In Source/WebKit/UIProcess/WebPageProxy.messages.in look for MEDIA_STREAM
Comment 4 Philippe Normand 2021-01-11 09:16:19 PST
Hopefully when https://bugs.webkit.org/show_bug.cgi?id=209332 lands we can close this!

The UI process still needs GStreamer though, for the can_show_mime_type public API.
Comment 5 Philippe Normand 2021-01-12 02:56:41 PST
Is this still happening as of r271396 ?
Comment 6 Michael Catanzaro 2021-01-13 14:01:40 PST
(In reply to Philippe Normand from comment #5)
> Is this still happening as of r271396 ?

For reasons I don't understand, -DENABLE_MEDIA_STREAM=ON causes *both* gtk-doc and gobject-introspection to crash. Both work fine if I use only -DENABLE_WEB_RTC=ON, but that alone doesn't seem to be enable to enable WebRTC. Needs further investigation.
Comment 7 Michael Catanzaro 2021-01-13 14:17:02 PST
Ah I figured it out, there is a symbol conflict between boringssl and openssl:

(gdb) bt
#0  __pthread_rwlock_wrlock_full (abstime=0x0, clockid=0, rwlock=0x0) at pthread_rwlock_common.c:604
#1  __GI___pthread_rwlock_wrlock (rwlock=rwlock@entry=0x0) at pthread_rwlock_wrlock.c:27
#2  0x00007ffa4f842cd9 in CRYPTO_STATIC_MUTEX_lock_write (lock=lock@entry=0x0)
    at ../../Source/ThirdParty/libwebrtc/Source/third_party/boringssl/src/crypto/thread_pthread.c:75
#3  0x00007ffa4f893236 in CRYPTO_get_ex_new_index (ex_data_class=ex_data_class@entry=0x0, 
    out_index=out_index@entry=0x0, argl=argl@entry=0, argp=argp@entry=0x0, free_func=free_func@entry=0x0)
    at ../../Source/ThirdParty/libwebrtc/Source/third_party/boringssl/src/crypto/ex_data.c:146
#4  0x00007ffa46202b1b in ossl_get_ssl_conn_index () at ../../lib/vtls/openssl.c:353
#5  Curl_ossl_init () at ../../lib/vtls/openssl.c:1136
#6  0x00007ffa461a9c19 in Curl_ssl_init () at ../../lib/vtls/vtls.c:216
#7  Curl_ssl_init () at ../../lib/vtls/vtls.c:209
#8  global_init (flags=<optimized out>, memoryfuncs=<optimized out>) at ../../lib/easy.c:158
#9  0x00007ffa529df8ee in call_init (l=<optimized out>, argc=argc@entry=1, argv=argv@entry=0x7ffc951e9508, 
    env=env@entry=0x7ffc951e9518) at dl-init.c:74
#10 0x00007ffa529df9d8 in call_init (env=0x7ffc951e9518, argv=0x7ffc951e9508, argc=1, l=<optimized out>)
    at dl-init.c:37
#11 _dl_init (main_map=0x7f9e60, argc=1, argv=0x7ffc951e9508, env=0x7ffc951e9518) at dl-init.c:121
#12 0x00007ffa4aa94095 in __GI__dl_catch_exception (exception=<optimized out>, operate=<optimized out>, 
    args=<optimized out>) at dl-error-skeleton.c:182
#13 0x00007ffa529e3e35 in dl_open_worker (a=0x7ffc951e91f0) at dl-open.c:783
#14 0x00007ffa4aa94038 in __GI__dl_catch_exception (exception=0x7ffc951e91d0, 
    operate=0x7ffa529e3a50 <dl_open_worker>, args=0x7ffc951e91f0) at dl-error-skeleton.c:208
#15 0x00007ffa529e366e in _dl_open (file=0x7ffc951e91d0 "", mode=-2147483647, 
    caller_dlopen=0x7ffa468cfdbb <__libdwfl_debuginfod_init+27>, nsid=-2, argc=1, argv=0x7ffc951e9508, 
    env=0x7ffc951e9518) at dl-open.c:864
#16 0x00007ffa475a339c in dlopen_doit (a=a@entry=0x7ffc951e9420) at dlopen.c:66
#17 0x00007ffa4aa94038 in __GI__dl_catch_exception (exception=exception@entry=0x7ffc951e93c0, 
    operate=0x7ffa475a3340 <dlopen_doit>, args=0x7ffc951e9420) at dl-error-skeleton.c:208
#18 0x00007ffa4aa94103 in __GI__dl_catch_error (objname=0x7eff60, errstring=0x7eff68, mallocedp=0x7eff58, 
    operate=<optimized out>, args=<optimized out>) at dl-error-skeleton.c:227
#19 0x00007ffa475a3bd9 in _dlerror_run (operate=0x7ffa475a3340 <dlopen_doit>, args=0x7ffc951e9420) at dlerror.c:170
#20 0x00007ffa475a3428 in __dlopen (file=<optimized out>, mode=<optimized out>) at dlopen.c:87
#21 0x00007ffa468cfdbb in __libdwfl_debuginfod_init () from /lib64/libdw.so.1
#22 0x00007ffa529df8ee in call_init (l=<optimized out>, argc=argc@entry=1, argv=argv@entry=0x7ffc951e9508, 
    env=env@entry=0x7ffc951e9518) at dl-init.c:74
#23 0x00007ffa529df9d8 in call_init (env=0x7ffc951e9518, argv=0x7ffc951e9508, argc=1, l=<optimized out>)
    at dl-init.c:37
#24 _dl_init (main_map=0x7ffa529fc1a0, argc=1, argv=0x7ffc951e9508, env=0x7ffc951e9518) at dl-init.c:121
#25 0x00007ffa529d00ca in _dl_start_user () from /lib64/ld-linux-x86-64.so.2
#26 0x0000000000000001 in ?? ()
#27 0x00007ffc951eb058 in ?? ()
#28 0x0000000000000000 in ?? ()

Looks like an unintended consequence of debuginfod. Wow that's pretty wild. Looks like the dynamic linker now depends on curl and openssl? Wow.
Comment 8 Michael Catanzaro 2021-01-13 14:26:31 PST
(In reply to Michael Catanzaro from comment #7)
> Looks like the dynamic linker now depends on curl and openssl? Wow.

Well, elfutils certainly does, and it seems that gets initialized prior to main() by the dynamic linker. OK....
Comment 9 Michael Catanzaro 2021-01-13 15:12:03 PST
https://lists.fedoraproject.org/archives/list/devel@lists.fedoraproject.org/thread/FGGB7EZI7OGTLOJI45VNNX5LM6RQPKCD/

I failed to figure out what exactly pulls in libelf, but it certainly can no longer be combined with boringssl....
Comment 10 Michael Catanzaro 2021-02-04 10:37:04 PST
(In reply to Michael Catanzaro from comment #7)
> Ah I figured it out, there is a symbol conflict between boringssl and
> openssl:

Fixed in bug #221333.

With that fixed, I tested my reproducer for this issue again:

(In reply to Michael Catanzaro from comment #1)
> OK, I have a reproducer for this one: visit my permanent BlueJeans meeting
> (link available privately on request) with webcam unplugged, then plug in
> the webcam. Crash is guaranteed.

However, this time the web process crashes even sooner:

Video capture was requested but no device was found amongst 0 devices
IntConstraint 1, min -1, max -1, exact -1, ideal 640
IntConstraint 2, min -1, max -1, exact -1, ideal 480
DoubleConstraint 4, min -1.000000, max -1.000000, exact -1.000000, ideal 30.000000
MediaConstraint 5 of type 4
malloc_consolidate(): unaligned fastbin chunk detected

The last line looks bad. Looking at the backtrace, it's clearly memory corruption:

(gdb) bt
#0  0x00007f17f44169d5 in raise () from /lib64/libc.so.6
#1  0x00007f17f43ff8a4 in abort () from /lib64/libc.so.6
#2  0x00007f17f4458f27 in __libc_message () from /lib64/libc.so.6
#3  0x00007f17f4460c1c in malloc_printerr () from /lib64/libc.so.6
#4  0x00007f17f4461cc4 in malloc_consolidate () from /lib64/libc.so.6
#5  0x00007f17f4463b73 in _int_malloc () from /lib64/libc.so.6
#6  0x00007f17f44648f7 in malloc_check () from /lib64/libc.so.6
#7  0x00007f17f47af959 in operator new (sz=sz@entry=1024) at ../../../../libstdc++-v3/libsupc++/new_op.cc:50
#8  0x00007f17f81bef3f in __gnu_cxx::new_allocator<std::pair<char*, unsigned long> >::allocate (__n=<optimized out>, 
    this=<optimized out>) at /usr/include/c++/10/ext/new_allocator.h:103
#9  std::allocator_traits<std::allocator<std::pair<char*, unsigned long> > >::allocate (__a=..., __n=<optimized out>)
    at /usr/include/c++/10/bits/alloc_traits.h:460
#10 std::_Vector_base<std::pair<char*, unsigned long>, std::allocator<std::pair<char*, unsigned long> > >::_M_allocate (__n=<optimized out>, this=<optimized out>) at /usr/include/c++/10/bits/stl_vector.h:346
#11 std::vector<std::pair<char*, unsigned long>, std::allocator<std::pair<char*, unsigned long> > >::_M_realloc_insert<std::pair<char*, unsigned long> > (this=this@entry=0x7f17e39ff9d8, __position=
  {first = 0x1a <error: Cannot access memory at address 0x1a>, second = 0})
    at /usr/include/c++/10/bits/vector.tcc:440
#12 0x00007f17f81bb70e in std::vector<std::pair<char*, unsigned long>, std::allocator<std::pair<char*, unsigned long> > >::emplace_back<std::pair<char*, unsigned long> > (this=0x7f17e39ff9d8) at /usr/include/c++/10/bits/vector.tcc:121
#13 std::vector<std::pair<char*, unsigned long>, std::allocator<std::pair<char*, unsigned long> > >::push_back (
    __x=..., this=0x7f17e39ff9d8) at /usr/include/c++/10/bits/stl_vector.h:1204
#14 bmalloc::BulkDecommit::add (this=0x7f17e39ff9c0, size=<optimized out>, ptr=<optimized out>, 
    data=std::vector of length 32, capacity 32 = {...}) at ../../Source/bmalloc/bmalloc/BulkDecommit.h:61
#15 bmalloc::BulkDecommit::addLazy (size=<optimized out>, ptr=<optimized out>, this=0x7f17e39ff9c0)
    at ../../Source/bmalloc/bmalloc/BulkDecommit.h:43
#16 bmalloc::Heap::decommitLargeRange (this=this@entry=0x7f17f9633000, range=..., decommitter=...)
    at ../../Source/bmalloc/bmalloc/Heap.cpp:111
#17 0x00007f17f81bbf77 in bmalloc::Heap::scavenge (this=0x7f17f9633000, lock=..., decommitter=..., 
    deferredDecommits=@0x7f17e39ff988: 4) at ../../Source/bmalloc/bmalloc/Heap.cpp:169
#18 0x00007f17f81c1529 in bmalloc::Scavenger::scavenge (
    this=0x7f17f8538aa0 <bmalloc::StaticPerProcessStorageTraits<bmalloc::Scavenger>::Storage::s_memory>)
    at ../../Source/bmalloc/bmalloc/Scavenger.cpp:233
#19 bmalloc::Scavenger::scavenge (
    this=0x7f17f8538aa0 <bmalloc::StaticPerProcessStorageTraits<bmalloc::Scavenger>::Storage::s_memory>)
    at ../../Source/bmalloc/bmalloc/Scavenger.cpp:205
#20 0x00007f17f81c18e9 in bmalloc::Scavenger::threadRunLoop (
    this=0x7f17f8538aa0 <bmalloc::StaticPerProcessStorageTraits<bmalloc::Scavenger>::Storage::s_memory>)
    at ../../Source/bmalloc/bmalloc/Scavenger.cpp:500
#21 0x00007f17f81c1ce9 in bmalloc::Scavenger::threadEntryPoint (scavenger=<optimized out>)
    at ../../Source/bmalloc/bmalloc/Scavenger.cpp:395
#22 0x00007f17f47db5f4 in std::execute_native_thread_routine (__p=0xf533a0)
    at ../../../../../libstdc++-v3/src/c++11/thread.cc:80
#23 0x00007f17f49b63f9 in start_thread () from /lib64/libpthread.so.0
#24 0x00007f17f44da903 in clone () from /lib64/libc.so.6

I tried again with G_SLICE=always-malloc Malloc=1 and found something a bit nicer:

#0  0x00007f19159999d5 in raise () from /lib64/libc.so.6
#1  0x00007f19159828a4 in abort () from /lib64/libc.so.6
#2  0x00007f19159dbf27 in __libc_message () from /lib64/libc.so.6
#3  0x00007f19159e3c1c in malloc_printerr () from /lib64/libc.so.6
#4  0x00007f19159e4cc4 in malloc_consolidate () from /lib64/libc.so.6
#5  0x00007f19159e6b73 in _int_malloc () from /lib64/libc.so.6
#6  0x00007f19159e78f7 in malloc_check () from /lib64/libc.so.6
#7  0x00007f1915fbabe6 in g_malloc (n_bytes=3991) at ../../../../Projects/glib/glib/gmem.c:106
#8  0x00007f1915fd5f3b in g_slice_alloc (mem_size=3991) at ../../../../Projects/glib/glib/gslice.c:1069
#9  0x00007f19151b870f in _sysmem_new_block (flags=0, maxsize=3847, align=7, offset=0, size=3840)
    at ../gst/gstallocator.c:413
#10 0x00007f19151c59ae in gst_buffer_new_allocate (allocator=0x0 [GstAllocator], size=3840, 
    params=params@entry=0xa444878) at ../gst/gstbuffer.c:891
#11 0x00007f19153016bb in default_prepare_output_buffer (trans=0xa4448c0 [GstAudioConvert|audioconvert], 
    inbuf=0x8c4d590 [GstBuffer], outbuf=0x7f185e32b7a0) at ../libs/gst/base/gstbasetransform.c:1704
#12 0x00007f1894523ddb in gst_audio_convert_prepare_output_buffer (base=0xa4448c0 [GstAudioConvert|audioconvert], 
    inbuf=0x8c4d590 [GstBuffer], outbuf=0x7f185e32b7a0) at ../gst/audioconvert/gstaudioconvert.c:938
#13 0x00007f19153097d8 in default_generate_output (trans=0xa4448c0 [GstAudioConvert|audioconvert], 
    outbuf=0x7f185e32b7a0) at ../libs/gst/base/gstbasetransform.c:2159
#14 0x00007f1915309f54 in gst_base_transform_chain (pad=<optimized out>, 
    parent=0xa4448c0 [GstAudioConvert|audioconvert], buffer=0x7f185e32b7a0 [None])
    at ../libs/gst/base/gstbasetransform.c:2341
#15 0x00007f19152038ad in gst_pad_chain_data_unchecked (pad=pad@entry=0xa444e00 [GstPad|sink], type=type@entry=4112, 
    data=data@entry=0x8c4d590) at ../gst/gstpad.c:4399
#16 0x00007f1915206de9 in gst_pad_push_data (pad=pad@entry=0xa4443d0 [GstPad|src], type=type@entry=4112, 
    data=data@entry=0x8c4d590) at ../gst/gstpad.c:4655
#17 0x00007f19152071fe in gst_pad_push (pad=0xa4443d0 [GstPad|src], buffer=buffer@entry=0x8c4d590 [GstBuffer])
    at ../gst/gstpad.c:4774
#18 0x00007f18935a23eb in gst_queue_push_one (queue=0xa443940 [GstQueue|queue])
    at ../plugins/elements/gstqueue.c:1386
#19 gst_queue_loop (pad=<optimized out>) at ../plugins/elements/gstqueue.c:1539
#20 0x00007f191522d487 in gst_task_func (task=0xa44af20 [GstTask|queue:src]) at ../gst/gsttask.c:328
#21 0x00007f1915fe5611 in g_thread_pool_thread_proxy (data=0x9fe9060)
    at ../../../../Projects/glib/glib/gthreadpool.c:354
#22 0x00007f1915fe4ee4 in g_thread_proxy (data=0xa44b000) at ../../../../Projects/glib/glib/gthread.c:826
#23 0x00007f1916016259 in linux_pthread_proxy (data=0xa44b000) at ../../../../Projects/glib/glib/gthread-posix.c:1259
#24 0x00007f1915f393f9 in start_thread () from /lib64/libpthread.so.0
#25 0x00007f1915a5d903 in clone () from /lib64/libc.so.6

There might be a problem in that code? But since it's memory corruption, that could be pointing to innocent unlucky code rather than the real source of the bug. I tried running the web process under valgrind:

$ jhbuild run env WEB_PROCESS_CMD_PREFIX="valgrind --track-origins=yes" G_SLICE=always-malloc Malloc=1 WEBKIT_FORCE_SANDBOX=0 GIGACAGE_ENABLED=0 epiphany

But it's so slow that I eventually gave up.