<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE bugzilla SYSTEM "https://bugs.webkit.org/page.cgi?id=bugzilla.dtd">

<bugzilla version="5.0.4.1"
          urlbase="https://bugs.webkit.org/"
          
          maintainer="admin@webkit.org"
>

    <bug>
          <bug_id>145978</bug_id>
          
          <creation_ts>2015-06-15 10:08:57 -0700</creation_ts>
          <short_desc>Media Session: Active participating elements can change while being iterated</short_desc>
          <delta_ts>2015-06-15 14:07:35 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Media</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>145411</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Matt Rajca">mrajca</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>commit-queue</cc>
    
    <cc>conrad_shultz</cc>
    
    <cc>eric.carlson</cc>
    
    <cc>jer.noble</cc>
    
    <cc>mrajca</cc>
    
    <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1101950</commentid>
    <comment_count>0</comment_count>
    <who name="Matt Rajca">mrajca</who>
    <bug_when>2015-06-15 10:08:57 -0700</bug_when>
    <thetext>While enumerating m_activeParticipatingElements, we play/pause media elements. This in turn can cause changes to m_activeParticipatingElements while it&apos;s being enumerated.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1101951</commentid>
    <comment_count>1</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2015-06-15 10:10:06 -0700</bug_when>
    <thetext>&lt;rdar://problem/21384140&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1101953</commentid>
    <comment_count>2</comment_count>
      <attachid>254881</attachid>
    <who name="Matt Rajca">mrajca</who>
    <bug_when>2015-06-15 10:13:23 -0700</bug_when>
    <thetext>Created attachment 254881
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1101961</commentid>
    <comment_count>3</comment_count>
      <attachid>254881</attachid>
    <who name="Alex Christensen">achristensen</who>
    <bug_when>2015-06-15 10:39:46 -0700</bug_when>
    <thetext>Comment on attachment 254881
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=254881&amp;action=review

Needs rebasing and some minor changes, but looks good to me.

&gt; Source/WebCore/ChangeLog:3
&gt; +        Media Session: Active participating elements can change while being enumerated 

enumerated -&gt; iterated

&gt; Source/WebCore/Modules/mediasession/MediaSession.cpp:97
&gt; +    HashSet&lt;HTMLMediaElement*&gt; activeParticipatingElements = m_activeParticipatingElements;

activeParticipatingElementsCopy to make it clear what is going on here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1101963</commentid>
    <comment_count>4</comment_count>
      <attachid>254883</attachid>
    <who name="Matt Rajca">mrajca</who>
    <bug_when>2015-06-15 10:46:41 -0700</bug_when>
    <thetext>Created attachment 254883
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1101988</commentid>
    <comment_count>5</comment_count>
      <attachid>254883</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2015-06-15 11:56:19 -0700</bug_when>
    <thetext>Comment on attachment 254883
Patch

Clearing flags on attachment: 254883

Committed r185560: &lt;http://trac.webkit.org/changeset/185560&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1101989</commentid>
    <comment_count>6</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2015-06-15 11:56:23 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1102000</commentid>
    <comment_count>7</comment_count>
      <attachid>254883</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2015-06-15 12:29:38 -0700</bug_when>
    <thetext>Comment on attachment 254883
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=254883&amp;action=review

&gt; Source/WebCore/Modules/mediasession/MediaSession.cpp:99
&gt; +    HashSet&lt;HTMLMediaElement*&gt; activeParticipatingElementsCopy = m_activeParticipatingElements;
&gt; +
&gt; +    for (auto* element : activeParticipatingElementsCopy) {

This pattern almost always leads to serious bugs. Once you have copied the HTMLMediaElement set, elements from the set could be deleted as a side effect of the operations below, and then you could use an element pointer of a deleted object.

One technique is removing each element from the set as we iterate instead of using a for loop, using the HashSet::takeAny function. Then also making sure that when an element is removed from the “real” set it’s also removed from the set currently being iterated. That pattern is used in DisplayRefreshMonitor::displayDidRefresh.

Another technique is to use Vector&lt;RefPtr&lt;HTMLMediaElement&gt;&gt; instead of HashSet&lt;MediaElement*&gt; for the elements we are iterating. That guarantees the elements are not deallocated, but we might not want to toggle the state of an element that has been removed from the document tree, for example.

I know we have run into the same problem elsewhere and solved it multiple ways. But this code is not safe.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1102021</commentid>
    <comment_count>8</comment_count>
      <attachid>254890</attachid>
    <who name="Alex Christensen">achristensen</who>
    <bug_when>2015-06-15 13:25:30 -0700</bug_when>
    <thetext>Created attachment 254890
followup patch

This should address Darin&apos;s concern.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1102025</commentid>
    <comment_count>9</comment_count>
    <who name="Matt Rajca">mrajca</who>
    <bug_when>2015-06-15 13:39:50 -0700</bug_when>
    <thetext>(In reply to comment #8)
&gt; Created attachment 254890 [details]
&gt; followup patch
&gt; 
&gt; This should address Darin&apos;s concern.

I already filed a follow-up Bug 145986.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1102030</commentid>
    <comment_count>10</comment_count>
      <attachid>254890</attachid>
    <who name="Alex Christensen">achristensen</who>
    <bug_when>2015-06-15 14:07:35 -0700</bug_when>
    <thetext>Comment on attachment 254890
followup patch

My followup patch doesn&apos;t actually change anything.  Matt&apos;s patch adds a pointer to the set being iterated, but I think that&apos;s also unnecessary until it is actually used.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>254881</attachid>
            <date>2015-06-15 10:13:23 -0700</date>
            <delta_ts>2015-06-15 10:46:37 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-145978-20150615101248.patch</filename>
            <type>text/plain</type>
            <size>1544</size>
            <attacher name="Matt Rajca">mrajca</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTg1NDc4CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggMjY2ZWVmMDkxNjZlN2Y5
NjQyZjBjNzcyZmVmODQwMmNkYmY0ZjE0ZS4uMWIzMWE3YzQ1NDNkNzRmYzA1OWE0NjcyNjk2MmVm
MGFlNGNkMzRmMiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDE0IEBACisyMDE1LTA2LTE1ICBNYXR0
IFJhamNhICA8bXJhamNhQGFwcGxlLmNvbT4KKworICAgICAgICBNZWRpYSBTZXNzaW9uOiBBY3Rp
dmUgcGFydGljaXBhdGluZyBlbGVtZW50cyBjYW4gY2hhbmdlIHdoaWxlIGJlaW5nIGVudW1lcmF0
ZWQgCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNDU5
NzgKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICAqIE1v
ZHVsZXMvbWVkaWFzZXNzaW9uL01lZGlhU2Vzc2lvbi5jcHA6CisgICAgICAgIChXZWJDb3JlOjpN
ZWRpYVNlc3Npb246OnRvZ2dsZVBsYXliYWNrKTogRW51bWVyYXRlIGEgY29weSBvZiBtX2FjdGl2
ZVBhcnRpY2lwYXRpbmdFbGVtZW50cyBzaW5jZSBpdHMgY29udGVudHMKKyAgICAgICAgICBjYW4g
YmUgbW9kaWZpZWQgaW4gdGhlIGxvb3AuCisKIDIwMTUtMDYtMTAgIE1hdHQgUmFqY2EgIDxtcmFq
Y2FAYXBwbGUuY29tPgogCiAgICAgICAgIEFkZCBiYXJlYm9uZXMgaW1wbGVtZW50YXRpb24gb2Yg
bWVkaWEgc2Vzc2lvbiBpbnZvY2F0aW9uIGFsZ29yaXRobS4KZGlmZiAtLWdpdCBhL1NvdXJjZS9X
ZWJDb3JlL01vZHVsZXMvbWVkaWFzZXNzaW9uL01lZGlhU2Vzc2lvbi5jcHAgYi9Tb3VyY2UvV2Vi
Q29yZS9Nb2R1bGVzL21lZGlhc2Vzc2lvbi9NZWRpYVNlc3Npb24uY3BwCmluZGV4IGZmMzA1ZjQ1
N2ZlMjU0YjkyZThmNGM2Y2RjZmJjNDQ0NjFkY2FkMDUuLjU4NTY0NmZjMmZkOWI4Y2EzNGRmZjI1
NjE4MTcwNzQ2ZDlkYmZmMTcgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvbWVk
aWFzZXNzaW9uL01lZGlhU2Vzc2lvbi5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvTW9kdWxlcy9t
ZWRpYXNlc3Npb24vTWVkaWFTZXNzaW9uLmNwcApAQCAtOTQsNyArOTQsOSBAQCBib29sIE1lZGlh
U2Vzc2lvbjo6aW52b2tlKCkKIAogdm9pZCBNZWRpYVNlc3Npb246OnRvZ2dsZVBsYXliYWNrKCkK
IHsKLSAgICBmb3IgKGF1dG8qIGVsZW1lbnQgOiBtX2FjdGl2ZVBhcnRpY2lwYXRpbmdFbGVtZW50
cykgeworICAgIEhhc2hTZXQ8SFRNTE1lZGlhRWxlbWVudCo+IGFjdGl2ZVBhcnRpY2lwYXRpbmdF
bGVtZW50cyA9IG1fYWN0aXZlUGFydGljaXBhdGluZ0VsZW1lbnRzOworCisgICAgZm9yIChhdXRv
KiBlbGVtZW50IDogYWN0aXZlUGFydGljaXBhdGluZ0VsZW1lbnRzKSB7CiAgICAgICAgIGlmIChl
bGVtZW50LT5wYXVzZWQoKSkKICAgICAgICAgICAgIGVsZW1lbnQtPnBsYXkoKTsKICAgICAgICAg
ZWxzZQo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>254883</attachid>
            <date>2015-06-15 10:46:41 -0700</date>
            <delta_ts>2015-06-15 11:56:19 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-145978-20150615104606.patch</filename>
            <type>text/plain</type>
            <size>1545</size>
            <attacher name="Matt Rajca">mrajca</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTg1NTU1CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggZGM1NDhhNGQwOTNjMGRj
ZWE3N2U2NGU4NmJjODY5YzEwNjI4MWQzMi4uZGY1NTU1ZDEzYTU2NWZlZWQxZjdmZmY0ZWU0OTBi
ZDg3ZDJlMzU0OCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDE0IEBACisyMDE1LTA2LTE1ICBNYXR0
IFJhamNhICA8bXJhamNhQGFwcGxlLmNvbT4KKworICAgICAgICBNZWRpYSBTZXNzaW9uOiBBY3Rp
dmUgcGFydGljaXBhdGluZyBlbGVtZW50cyBjYW4gY2hhbmdlIHdoaWxlIGJlaW5nIGl0ZXJhdGVk
IAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTQ1OTc4
CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgKiBNb2R1
bGVzL21lZGlhc2Vzc2lvbi9NZWRpYVNlc3Npb24uY3BwOgorICAgICAgICAoV2ViQ29yZTo6TWVk
aWFTZXNzaW9uOjp0b2dnbGVQbGF5YmFjayk6IEl0ZXJhdGUgdGhyb3VnaCBhIGNvcHkgb2YgbV9h
Y3RpdmVQYXJ0aWNpcGF0aW5nRWxlbWVudHMgc2luY2UgaXRzIGNvbnRlbnRzCisgICAgICAgICAg
Y2FuIGJlIG1vZGlmaWVkIGluIHRoZSBsb29wLgorCiAyMDE1LTA2LTE1ICBBbGV4IENocmlzdGVu
c2VuICA8YWNocmlzdGVuc2VuQHdlYmtpdC5vcmc+CiAKICAgICAgICAgW0NvbnRlbnQgRXh0ZW5z
aW9uc10gTGltaXQgbnVtYmVyIG9mIHJ1bGVzLgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUv
TW9kdWxlcy9tZWRpYXNlc3Npb24vTWVkaWFTZXNzaW9uLmNwcCBiL1NvdXJjZS9XZWJDb3JlL01v
ZHVsZXMvbWVkaWFzZXNzaW9uL01lZGlhU2Vzc2lvbi5jcHAKaW5kZXggZmYzMDVmNDU3ZmUyNTRi
OTJlOGY0YzZjZGNmYmM0NDQ2MWRjYWQwNS4uNDI5OGIyNjhiODI1NzU2ZTkyNjhiZjk5MzhlNzhk
ZDE1MDRiZWQ2ZiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvTW9kdWxlcy9tZWRpYXNlc3Np
b24vTWVkaWFTZXNzaW9uLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL21lZGlhc2Vz
c2lvbi9NZWRpYVNlc3Npb24uY3BwCkBAIC05NCw3ICs5NCw5IEBAIGJvb2wgTWVkaWFTZXNzaW9u
OjppbnZva2UoKQogCiB2b2lkIE1lZGlhU2Vzc2lvbjo6dG9nZ2xlUGxheWJhY2soKQogewotICAg
IGZvciAoYXV0byogZWxlbWVudCA6IG1fYWN0aXZlUGFydGljaXBhdGluZ0VsZW1lbnRzKSB7Cisg
ICAgSGFzaFNldDxIVE1MTWVkaWFFbGVtZW50Kj4gYWN0aXZlUGFydGljaXBhdGluZ0VsZW1lbnRz
Q29weSA9IG1fYWN0aXZlUGFydGljaXBhdGluZ0VsZW1lbnRzOworCisgICAgZm9yIChhdXRvKiBl
bGVtZW50IDogYWN0aXZlUGFydGljaXBhdGluZ0VsZW1lbnRzQ29weSkgewogICAgICAgICBpZiAo
ZWxlbWVudC0+cGF1c2VkKCkpCiAgICAgICAgICAgICBlbGVtZW50LT5wbGF5KCk7CiAgICAgICAg
IGVsc2UK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>254890</attachid>
            <date>2015-06-15 13:25:30 -0700</date>
            <delta_ts>2015-06-15 14:07:35 -0700</delta_ts>
            <desc>followup patch</desc>
            <filename>followup_patch</filename>
            <type>text/plain</type>
            <size>1508</size>
            <attacher name="Alex Christensen">achristensen</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDE4NTU2NSkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDE0IEBACisyMDE1LTA2LTE1ICBBbGV4IENo
cmlzdGVuc2VuICA8YWNocmlzdGVuc2VuQHdlYmtpdC5vcmc+CisKKyAgICAgICAgW01lZGlhIFNl
c3Npb25dIE1ha2UgY29kZSBzYWZlciBhZnRlciByMTg1NTYwLgorICAgICAgICBodHRwczovL2J1
Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTQ1OTc4CisKKyAgICAgICAgUmV2aWV3ZWQg
YnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgKiBNb2R1bGVzL21lZGlhc2Vzc2lvbi9NZWRp
YVNlc3Npb24uY3BwOgorICAgICAgICAoV2ViQ29yZTo6TWVkaWFTZXNzaW9uOjp0b2dnbGVQbGF5
YmFjayk6CisgICAgICAgIFVzZSBIYXNoU2V0Ojp0YWtlQW55IHdoaWxlIHRoZSBzZXQgaXMgbm90
IGVtcHR5IGluc3RlYWQgb2YgYSBmb3IgbG9vcCB0byBwcmV2ZW50IGZ1dHVyZSBidWdzLgorCiAy
MDE1LTA2LTE1ICBNYXR0IFJhamNhICA8bXJhamNhQGFwcGxlLmNvbT4KIAogICAgICAgICBNZWRp
YSBTZXNzaW9uOiBBY3RpdmUgcGFydGljaXBhdGluZyBlbGVtZW50cyBjYW4gY2hhbmdlIHdoaWxl
IGJlaW5nIGl0ZXJhdGVkIApJbmRleDogU291cmNlL1dlYkNvcmUvTW9kdWxlcy9tZWRpYXNlc3Np
b24vTWVkaWFTZXNzaW9uLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9Nb2R1bGVz
L21lZGlhc2Vzc2lvbi9NZWRpYVNlc3Npb24uY3BwCShyZXZpc2lvbiAxODU1NjUpCisrKyBTb3Vy
Y2UvV2ViQ29yZS9Nb2R1bGVzL21lZGlhc2Vzc2lvbi9NZWRpYVNlc3Npb24uY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC05NCw5ICs5NCwxMCBAQAogCiB2b2lkIE1lZGlhU2Vzc2lvbjo6dG9nZ2xlUGxh
eWJhY2soKQogewotICAgIEhhc2hTZXQ8SFRNTE1lZGlhRWxlbWVudCo+IGFjdGl2ZVBhcnRpY2lw
YXRpbmdFbGVtZW50c0NvcHkgPSBtX2FjdGl2ZVBhcnRpY2lwYXRpbmdFbGVtZW50czsKKyAgICBI
YXNoU2V0PEhUTUxNZWRpYUVsZW1lbnQqPiBlbGVtZW50c1RvVG9nZ2xlID0gbV9hY3RpdmVQYXJ0
aWNpcGF0aW5nRWxlbWVudHM7CiAKLSAgICBmb3IgKGF1dG8qIGVsZW1lbnQgOiBhY3RpdmVQYXJ0
aWNpcGF0aW5nRWxlbWVudHNDb3B5KSB7CisgICAgd2hpbGUgKCFlbGVtZW50c1RvVG9nZ2xlLmlz
RW1wdHkoKSkgeworICAgICAgICBhdXRvKiBlbGVtZW50ID0gZWxlbWVudHNUb1RvZ2dsZS50YWtl
QW55KCk7CiAgICAgICAgIGlmIChlbGVtZW50LT5wYXVzZWQoKSkKICAgICAgICAgICAgIGVsZW1l
bnQtPnBsYXkoKTsKICAgICAgICAgZWxzZQo=
</data>
<flag name="review"
          id="279908"
          type_id="1"
          status="-"
          setter="achristensen"
    />
          </attachment>
      

    </bug>

</bugzilla>