⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 269030 in webkit


Ignore:
Timestamp:
Oct 27, 2020, 4:24:48 AM (6 years ago)
Author:
calvaris@igalia.com
Message:

[EME][GStreamer][Thunder] Make response parsing message more robust
​https://bugs.webkit.org/show_bug.cgi?id=218172

Reviewed by Philippe Normand.

ParsedResponseMessage checks now for empty buffers and we assert
on that in the code. We also add some other checks that could
trigger crashes if failed.

No new tests needed, just a rework.

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

(WebCore::ParsedResponseMessage::ParsedResponseMessage):
(WebCore::ParsedResponseMessage::isValid const):
(WebCore::ParsedResponseMessage::operator bool const):
(WebCore::ParsedResponseMessage::operator! const):
(WebCore::CDMInstanceSessionThunder::challengeGeneratedCallback):
(WebCore::CDMInstanceSessionThunder::updateLicense):
(WebCore::CDMInstanceSessionThunder::loadSession):
(WebCore::CDMInstanceSessionThunder::removeSessionData):

Location:
trunk/Source/WebCore
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r269027 r269030  
     12020-10-27  Xabier Rodriguez Calvar  <calvaris@igalia.com>
     2
     3        [EME][GStreamer][Thunder] Make response parsing message more robust
     4        https://bugs.webkit.org/show_bug.cgi?id=218172
     5
     6        Reviewed by Philippe Normand.
     7
     8        ParsedResponseMessage checks now for empty buffers and we assert
     9        on that in the code. We also add some other checks that could
     10        trigger crashes if failed.
     11
     12        No new tests needed, just a rework.
     13
     14        * platform/graphics/gstreamer/eme/CDMThunder.cpp:
     15        (WebCore::ParsedResponseMessage::ParsedResponseMessage):
     16        (WebCore::ParsedResponseMessage::isValid const):
     17        (WebCore::ParsedResponseMessage::operator bool const):
     18        (WebCore::ParsedResponseMessage::operator! const):
     19        (WebCore::CDMInstanceSessionThunder::challengeGeneratedCallback):
     20        (WebCore::CDMInstanceSessionThunder::updateLicense):
     21        (WebCore::CDMInstanceSessionThunder::loadSession):
     22        (WebCore::CDMInstanceSessionThunder::removeSessionData):
     23
    1242020-10-27  Tetsuharu Ohzeki  <tetsuharu.ohzeki@gmail.com>
    225
  • trunk/Source/WebCore/platform/graphics/gstreamer/eme/CDMThunder.cpp

    r268975 r269030  
    311311    ParsedResponseMessage(const RefPtr<SharedBuffer>& buffer)
    312312    {
    313         if (!buffer)
     313        if (!buffer || !buffer->size())
    314314            return;
    315315
     316        GST_DEBUG("parsing buffer of size %zu", buffer->size());
     317        GST_MEMDUMP("buffer", buffer->dataAsUInt8Ptr(), buffer->size());
     318
    316319        StringView payload(reinterpret_cast<const LChar*>(buffer->data()), buffer->size());
    317         StringView type(reinterpret_cast<const LChar*>(":Type:"), 6);
     320        static NeverDestroyed<StringView> type(reinterpret_cast<const LChar*>(":Type:"), 6);
    318321        size_t typePosition = payload.find(type, 0);
    319322        StringView requestType(payload.characters8(), typePosition != notFound ? typePosition : 0);
    … …  
    326329
    327330        m_payload = SharedBuffer::create(payload.characters8() + offset, payload.length() - offset);
    328     }
    329 
     331
     332        m_isValid = true;
     333    }
     334
     335    bool isValid() const { return m_isValid; }
    330336    bool hasPayload() const { return static_cast<bool>(m_payload); }
    331337    const Ref<SharedBuffer>& payload() const& { ASSERT(m_payload); return m_payload.value(); }
    … …  
    334340    WebCore::MediaKeyMessageType type() const { ASSERT(m_type); return m_type.value(); }
    335341    WebCore::MediaKeyMessageType typeOr(WebCore::MediaKeyMessageType alternate) const { return m_type ? m_type.value() : alternate; }
     342    explicit operator bool() const { return m_isValid; }
     343    bool operator!() const { return !m_isValid; }
    336344
    337345private:
     346    bool m_isValid { false };
    338347    Optional<Ref<SharedBuffer>> m_payload;
    339348    Optional<WebCore::MediaKeyMessageType> m_type;
    … …  
    343352{
    344353    ParsedResponseMessage parsedResponseMessage(buffer);
     354    ASSERT(parsedResponseMessage);
    345355
    346356    if (!m_challengeCallbacks.isEmpty()) {
    347357        m_message = WTFMove(parsedResponseMessage.payload());
    348         m_needsIndividualization = parsedResponseMessage.type() == CDMInstanceSession::MessageType::IndividualizationRequest;
     358        m_needsIndividualization = parsedResponseMessage.hasType()
     359            && parsedResponseMessage.type() == CDMInstanceSession::MessageType::IndividualizationRequest;
    349360
    350361        for (const auto& challengeCallback : m_challengeCallbacks)
    … …  
    529540                // will even be other parts of the spec where not having structured data will be bad.
    530541                ParsedResponseMessage parsedResponseMessage(responseMessage);
     542                ASSERT(parsedResponseMessage);
    531543                if (parsedResponseMessage.hasPayload()) {
    532544                    Ref<SharedBuffer> message = WTFMove(parsedResponseMessage.payload());
    … …  
    563575                // will even be other parts of the spec where not having structured data will be bad.
    564576                ParsedResponseMessage parsedResponseMessage(responseMessage);
     577                ASSERT(parsedResponseMessage);
    565578                if (parsedResponseMessage.hasPayload()) {
    566579                    Ref<SharedBuffer> message = WTFMove(parsedResponseMessage.payload());
    … …  
    609622            else {
    610623                ParsedResponseMessage parsedResponseMessage(buffer);
     624                ASSERT(parsedResponseMessage);
    611625                if (parsedResponseMessage.hasPayload()) {
    612626                    Ref<SharedBuffer> message = WTFMove(parsedResponseMessage.payload());
Note: See TracChangeset for help on using the changeset viewer.