Changeset 263658 in webkit


Ignore:
Timestamp:
Jun 29, 2020 5:06:44 AM (4 years ago)
Author:
calvaris@igalia.com
Message:

[GStreamer] imported/w3c/web-platform-tests/encrypted-media/clearkey-mp4-playback-temporary-setMediaKeys-immediately.https.html is a flaky crash
https://bugs.webkit.org/show_bug.cgi?id=213385

Reviewed by Philippe Normand.

Source/WebCore:

Add a way to release the decryption resources when the player
private is destroyed. That way we can release the secure memory
allocated by libgcrypt and allow for more tests to get, which
caused the crash.

Tests: imported/w3c/web-platform-tests/encrypted-media/clearkey-mp4-playback-temporary-setMediaKeys-immediately.https.html.

  • platform/encryptedmedia/CDMProxy.h:

(WebCore::CDMProxy::releaseDecryptionResources):
(WebCore::CDMInstanceSessionProxy::releaseDecryptionResources):
(WebCore::CDMInstanceProxy::releaseDecryptionResources):

  • platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp:

(WebCore::MediaPlayerPrivateGStreamer::~MediaPlayerPrivateGStreamer):

  • platform/graphics/gstreamer/eme/CDMProxyClearKey.cpp:

(WebCore::CDMProxyClearKey::~CDMProxyClearKey):
(WebCore::CDMProxyClearKey::releaseDecryptionResources):
(WebCore::CDMProxyClearKey::closeGCryptHandle):

  • platform/graphics/gstreamer/eme/CDMProxyClearKey.h:

LayoutTests:

  • platform/glib/TestExpectations: Removed test from expectations.
Location:
trunk
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r263657 r263658  
     12020-06-29  Xabier Rodriguez Calvar  <calvaris@igalia.com>
     2
     3        [GStreamer] imported/w3c/web-platform-tests/encrypted-media/clearkey-mp4-playback-temporary-setMediaKeys-immediately.https.html is a flaky crash
     4        https://bugs.webkit.org/show_bug.cgi?id=213385
     5
     6        Reviewed by Philippe Normand.
     7
     8        * platform/glib/TestExpectations: Removed test from expectations.
     9
    1102020-06-29  Xabier Rodriguez Calvar  <calvaris@igalia.com>
    211
  • trunk/LayoutTests/platform/glib/TestExpectations

    r263643 r263658  
    387387webkit.org/b/178707 imported/w3c/web-platform-tests/encrypted-media/encrypted-media-default-feature-policy.https.sub.html [ Skip ]
    388388webkit.org/b/213364 imported/w3c/web-platform-tests/encrypted-media/clearkey-mp4-setmediakeys-to-multiple-video-elements.https.html [ Crash Pass ]
    389 webkit.org/b/213385 imported/w3c/web-platform-tests/encrypted-media/clearkey-mp4-playback-temporary-setMediaKeys-immediately.https.html [ Crash Pass ]
    390389
    391390imported/w3c/web-platform-tests/encrypted-media/clearkey-check-encryption-scheme.https.html [ Pass ]
  • trunk/Source/WebCore/ChangeLog

    r263656 r263658  
     12020-06-29  Xabier Rodriguez Calvar  <calvaris@igalia.com>
     2
     3        [GStreamer] imported/w3c/web-platform-tests/encrypted-media/clearkey-mp4-playback-temporary-setMediaKeys-immediately.https.html is a flaky crash
     4        https://bugs.webkit.org/show_bug.cgi?id=213385
     5
     6        Reviewed by Philippe Normand.
     7
     8        Add a way to release the decryption resources when the player
     9        private is destroyed. That way we can release the secure memory
     10        allocated by libgcrypt and allow for more tests to get, which
     11        caused the crash.
     12
     13        Tests: imported/w3c/web-platform-tests/encrypted-media/clearkey-mp4-playback-temporary-setMediaKeys-immediately.https.html.
     14
     15        * platform/encryptedmedia/CDMProxy.h:
     16        (WebCore::CDMProxy::releaseDecryptionResources):
     17        (WebCore::CDMInstanceSessionProxy::releaseDecryptionResources):
     18        (WebCore::CDMInstanceProxy::releaseDecryptionResources):
     19        * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp:
     20        (WebCore::MediaPlayerPrivateGStreamer::~MediaPlayerPrivateGStreamer):
     21        * platform/graphics/gstreamer/eme/CDMProxyClearKey.cpp:
     22        (WebCore::CDMProxyClearKey::~CDMProxyClearKey):
     23        (WebCore::CDMProxyClearKey::releaseDecryptionResources):
     24        (WebCore::CDMProxyClearKey::closeGCryptHandle):
     25        * platform/graphics/gstreamer/eme/CDMProxyClearKey.h:
     26
    1272020-06-29  Alicia Boya García  <aboya@igalia.com>
    228
  • trunk/Source/WebCore/platform/encryptedmedia/CDMProxy.h

    r263087 r263658  
    137137    void setInstance(CDMInstanceProxy*);
    138138
     139    virtual void releaseDecryptionResources()
     140    {
     141        ASSERT(isMainThread());
     142        m_keyStore.removeAllKeys();
     143    }
     144
    139145protected:
    140146    Vector<uint8_t> keyValue(const Vector<uint8_t>& keyID) const;
     
    180186
    181187class CDMInstanceSessionProxy : public CDMInstanceSession, public CanMakeWeakPtr<CDMInstanceSessionProxy, WeakPtrFactoryInitialization::Eager> {
     188public:
     189    virtual void releaseDecryptionResources() { }
    182190};
    183191
     
    207215    void startedWaitingForKey();
    208216    void stoppedWaitingForKey();
     217
     218    virtual void releaseDecryptionResources()
     219    {
     220        ASSERT(isMainThread());
     221        m_keyStore.removeAllKeys();
     222        for (auto& session : m_sessions)
     223            session.releaseDecryptionResources();
     224        m_sessions.clear();
     225        if (m_cdmProxy) {
     226            m_cdmProxy->releaseDecryptionResources();
     227            m_cdmProxy = nullptr;
     228        }
     229    }
    209230
    210231protected:
  • trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp

    r263504 r263658  
    291291    if (m_pipeline)
    292292        gst_element_set_state(m_pipeline.get(), GST_STATE_NULL);
     293
     294#if ENABLE(ENCRYPTED_MEDIA)
     295    {
     296        LockHolder lock(m_cdmAttachmentMutex);
     297        if (m_cdmInstance)
     298            m_cdmInstance->releaseDecryptionResources();
     299    }
     300#endif
    293301
    294302    m_player = nullptr;
  • trunk/Source/WebCore/platform/graphics/gstreamer/eme/CDMProxyClearKey.cpp

    r263087 r263658  
    8585CDMProxyClearKey::~CDMProxyClearKey()
    8686{
    87     if (m_gCryptHandle)
    88         gcry_cipher_close(*m_gCryptHandle);
     87    closeGCryptHandle();
    8988}
    9089
     
    214213}
    215214
     215void CDMProxyClearKey::releaseDecryptionResources()
     216{
     217    closeGCryptHandle();
     218    CDMProxy::releaseDecryptionResources();
     219}
     220
     221void CDMProxyClearKey::closeGCryptHandle()
     222{
     223    if (m_gCryptHandle) {
     224        gcry_cipher_close(*m_gCryptHandle);
     225        m_gCryptHandle.reset();
     226    }
     227}
     228
    216229gcry_cipher_hd_t& CDMProxyClearKey::gCryptHandle()
    217230{
  • trunk/Source/WebCore/platform/graphics/gstreamer/eme/CDMProxyClearKey.h

    r263087 r263658  
    112112    bool cencDecryptSubsampled(cencDecryptContext&);
    113113
     114    void releaseDecryptionResources() final;
     115    void closeGCryptHandle();
     116
    114117    // FIXME: It would be nice to use something in WebCore for crypto...
    115118    Optional<gcry_cipher_hd_t> m_gCryptHandle { WTF::nullopt };
Note: See TracChangeset for help on using the changeset viewer.