<?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>267348</bug_id>
          
          <creation_ts>2024-01-10 09:16:39 -0800</creation_ts>
          <short_desc>AX: ASSERTION FAILED: m_table inside of AXIsolatedTree::create</short_desc>
          <delta_ts>2024-01-11 21:45:24 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Accessibility</component>
          <version>Safari Technology Preview</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>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Dominic Mazzoni">dm_mazzoni</reporter>
          <assigned_to name="Joshua Hoffman">jhoffman23</assigned_to>
          <cc>aboxhall</cc>
    
    <cc>andresg_22</cc>
    
    <cc>apinheiro</cc>
    
    <cc>cfleizach</cc>
    
    <cc>dmazzoni</cc>
    
    <cc>ews-watchlist</cc>
    
    <cc>jcraig</cc>
    
    <cc>jhoffman23</cc>
    
    <cc>samuel_white</cc>
    
    <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>2004123</commentid>
    <comment_count>0</comment_count>
    <who name="Dominic Mazzoni">dm_mazzoni</who>
    <bug_when>2024-01-10 09:16:39 -0800</bug_when>
    <thetext>When I build WebKit on tip-of-tree in debug mode, then visit any webpage (even a simple Hello, world html page) with VoiceOver running, I get an assertion failure:

ASSERTION FAILED: m_table
/Volumes/Code/safari/OpenSource/WebKitBuild/Debug/usr/local/include/wtf/HashTable.h(231)

The crash is happening inside of AXIsolatedTree::create at the top of this for loop:

    for (auto&amp; relatedObjectID : axObjectCache.relations().keys()) {

That loop was added here, so I think it&apos;s likely a recent regression from that change:

    AX: Move objectsForIds off of the main thread
    https://bugs.webkit.org/show_bug.cgi?id=266608
    rdar://116133586</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>2004124</commentid>
    <comment_count>1</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2024-01-10 09:16:49 -0800</bug_when>
    <thetext>&lt;rdar://problem/120788145&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>2004334</commentid>
    <comment_count>2</comment_count>
      <attachid>469369</attachid>
    <who name="Joshua Hoffman">jhoffman23</who>
    <bug_when>2024-01-10 22:18:45 -0800</bug_when>
    <thetext>Created attachment 469369
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>2004335</commentid>
    <comment_count>3</comment_count>
      <attachid>469370</attachid>
    <who name="Joshua Hoffman">jhoffman23</who>
    <bug_when>2024-01-10 22:20:14 -0800</bug_when>
    <thetext>Created attachment 469370
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>2004342</commentid>
    <comment_count>4</comment_count>
      <attachid>469370</attachid>
    <who name="chris fleizach">cfleizach</who>
    <bug_when>2024-01-10 22:28:31 -0800</bug_when>
    <thetext>Comment on attachment 469370
Patch

How does this work? Won&apos;t getting a reference to the real thing still reference the underlying thing that can be modified?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>2004343</commentid>
    <comment_count>5</comment_count>
    <who name="Joshua Hoffman">jhoffman23</who>
    <bug_when>2024-01-10 22:32:31 -0800</bug_when>
    <thetext>(In reply to chris fleizach from comment #4)
&gt; Comment on attachment 469370 [details]
&gt; Patch
&gt; 
&gt; How does this work? Won&apos;t getting a reference to the real thing still
&gt; reference the underlying thing that can be modified?

When we would call axObjectCache.relations(), we always had the chance of modifying m_relations since updateRelationsIsNeeded is part of that method. Now we prevent that possibility. We can hold a value if we want to be extra safe, but there is some space/time complexity added there—do you have a preference?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>2004350</commentid>
    <comment_count>6</comment_count>
    <who name="chris fleizach">cfleizach</who>
    <bug_when>2024-01-10 22:48:15 -0800</bug_when>
    <thetext>(In reply to Joshua Hoffman from comment #5)
&gt; (In reply to chris fleizach from comment #4)
&gt; &gt; Comment on attachment 469370 [details]
&gt; &gt; Patch
&gt; &gt; 
&gt; &gt; How does this work? Won&apos;t getting a reference to the real thing still
&gt; &gt; reference the underlying thing that can be modified?
&gt; 
&gt; When we would call axObjectCache.relations(), we always had the chance of
&gt; modifying m_relations since updateRelationsIsNeeded is part of that method.
&gt; Now we prevent that possibility. We can hold a value if we want to be extra
&gt; safe, but there is some space/time complexity added there—do you have a
&gt; preference?

I&apos;m just saying isn&apos;t this a reference, so it can still be modified during iteration?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>2004352</commentid>
    <comment_count>7</comment_count>
    <who name="Joshua Hoffman">jhoffman23</who>
    <bug_when>2024-01-10 22:56:26 -0800</bug_when>
    <thetext>(In reply to chris fleizach from comment #6)
&gt; (In reply to Joshua Hoffman from comment #5)
&gt; &gt; (In reply to chris fleizach from comment #4)
&gt; &gt; &gt; Comment on attachment 469370 [details]
&gt; &gt; &gt; Patch
&gt; &gt; &gt; 
&gt; &gt; &gt; How does this work? Won&apos;t getting a reference to the real thing still
&gt; &gt; &gt; reference the underlying thing that can be modified?
&gt; &gt; 
&gt; &gt; When we would call axObjectCache.relations(), we always had the chance of
&gt; &gt; modifying m_relations since updateRelationsIsNeeded is part of that method.
&gt; &gt; Now we prevent that possibility. We can hold a value if we want to be extra
&gt; &gt; safe, but there is some space/time complexity added there—do you have a
&gt; &gt; preference?
&gt; 
&gt; I&apos;m just saying isn&apos;t this a reference, so it can still be modified during
&gt; iteration?

Yeah, that is true. I&apos;ll update it to `const auto relations =` so we use a copy instead.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>2004353</commentid>
    <comment_count>8</comment_count>
      <attachid>469372</attachid>
    <who name="Joshua Hoffman">jhoffman23</who>
    <bug_when>2024-01-10 23:00:27 -0800</bug_when>
    <thetext>Created attachment 469372
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>2004420</commentid>
    <comment_count>9</comment_count>
    <who name="Andres Gonzalez">andresg_22</who>
    <bug_when>2024-01-11 06:26:34 -0800</bug_when>
    <thetext>(In reply to Joshua Hoffman from comment #8)
&gt; Created attachment 469372 [details]
&gt; Patch

diff --git a/Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.cpp b/Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.cpp
index f6f0622abe93..c003ae7462a9 100644
--- a/Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.cpp
+++ b/Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.cpp
@@ -160,9 +160,10 @@ Ref&lt;AXIsolatedTree&gt; AXIsolatedTree::create(AXObjectCache&amp; axObjectCache)

     tree-&gt;updateLoadingProgress(axObjectCache.loadingProgress());

-    tree-&gt;updateRelations(axObjectCache.relations());
+    const auto relations = axObjectCache.relations();
+    tree-&gt;updateRelations(relations);

-    for (auto&amp; relatedObjectID : axObjectCache.relations().keys()) {
+    for (auto&amp; relatedObjectID : relations.keys()) {
         RefPtr axObject = axObjectCache.objectForID(relatedObjectID);
         if (axObject &amp;&amp; axObject-&gt;accessibilityIsIgnored())
             tree-&gt;addUnconnectedNode(axObject.releaseNonNull());

AG: I don&apos;t think we need this for loop at all since the unconnected iso objects are added in AXObjectCache::addRelation when relations are updated. I think this is another left over from a previous change that wasn&apos;t necessary. But I may be missing something...</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>2004434</commentid>
    <comment_count>10</comment_count>
    <who name="Joshua Hoffman">jhoffman23</who>
    <bug_when>2024-01-11 07:50:38 -0800</bug_when>
    <thetext>(In reply to Andres Gonzalez from comment #9)
&gt; (In reply to Joshua Hoffman from comment #8)
&gt; &gt; Created attachment 469372 [details]
&gt; &gt; Patch
&gt; 
&gt; diff --git a/Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.cpp
&gt; b/Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.cpp
&gt; index f6f0622abe93..c003ae7462a9 100644
&gt; --- a/Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.cpp
&gt; +++ b/Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.cpp
&gt; @@ -160,9 +160,10 @@ Ref&lt;AXIsolatedTree&gt;
&gt; AXIsolatedTree::create(AXObjectCache&amp; axObjectCache)
&gt; 
&gt;      tree-&gt;updateLoadingProgress(axObjectCache.loadingProgress());
&gt; 
&gt; -    tree-&gt;updateRelations(axObjectCache.relations());
&gt; +    const auto relations = axObjectCache.relations();
&gt; +    tree-&gt;updateRelations(relations);
&gt; 
&gt; -    for (auto&amp; relatedObjectID : axObjectCache.relations().keys()) {
&gt; +    for (auto&amp; relatedObjectID : relations.keys()) {
&gt;          RefPtr axObject = axObjectCache.objectForID(relatedObjectID);
&gt;          if (axObject &amp;&amp; axObject-&gt;accessibilityIsIgnored())
&gt;              tree-&gt;addUnconnectedNode(axObject.releaseNonNull());
&gt; 
&gt; AG: I don&apos;t think we need this for loop at all since the unconnected iso
&gt; objects are added in AXObjectCache::addRelation when relations are updated.
&gt; I think this is another left over from a previous change that wasn&apos;t
&gt; necessary. But I may be missing something...

We need this loop in addition to the code in addRelations so that if the isolated tree is enabled/initialized after relations have been added, we still create unconnected objects for the existing relations on the tree.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>2004435</commentid>
    <comment_count>11</comment_count>
    <who name="Andres Gonzalez">andresg_22</who>
    <bug_when>2024-01-11 07:58:40 -0800</bug_when>
    <thetext>(In reply to Joshua Hoffman from comment #10)
&gt; (In reply to Andres Gonzalez from comment #9)
&gt; &gt; (In reply to Joshua Hoffman from comment #8)
&gt; &gt; &gt; Created attachment 469372 [details]
&gt; &gt; &gt; Patch
&gt; &gt; 
&gt; &gt; diff --git a/Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.cpp
&gt; &gt; b/Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.cpp
&gt; &gt; index f6f0622abe93..c003ae7462a9 100644
&gt; &gt; --- a/Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.cpp
&gt; &gt; +++ b/Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.cpp
&gt; &gt; @@ -160,9 +160,10 @@ Ref&lt;AXIsolatedTree&gt;
&gt; &gt; AXIsolatedTree::create(AXObjectCache&amp; axObjectCache)
&gt; &gt; 
&gt; &gt;      tree-&gt;updateLoadingProgress(axObjectCache.loadingProgress());
&gt; &gt; 
&gt; &gt; -    tree-&gt;updateRelations(axObjectCache.relations());
&gt; &gt; +    const auto relations = axObjectCache.relations();
&gt; &gt; +    tree-&gt;updateRelations(relations);
&gt; &gt; 
&gt; &gt; -    for (auto&amp; relatedObjectID : axObjectCache.relations().keys()) {
&gt; &gt; +    for (auto&amp; relatedObjectID : relations.keys()) {
&gt; &gt;          RefPtr axObject = axObjectCache.objectForID(relatedObjectID);
&gt; &gt;          if (axObject &amp;&amp; axObject-&gt;accessibilityIsIgnored())
&gt; &gt;              tree-&gt;addUnconnectedNode(axObject.releaseNonNull());
&gt; &gt; 
&gt; &gt; AG: I don&apos;t think we need this for loop at all since the unconnected iso
&gt; &gt; objects are added in AXObjectCache::addRelation when relations are updated.
&gt; &gt; I think this is another left over from a previous change that wasn&apos;t
&gt; &gt; necessary. But I may be missing something...
&gt; 
&gt; We need this loop in addition to the code in addRelations so that if the
&gt; isolated tree is enabled/initialized after relations have been added, we
&gt; still create unconnected objects for the existing relations on the tree.

Wouldn&apos;t it make more sense to dirty the relations in that scenario?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>2004485</commentid>
    <comment_count>12</comment_count>
    <who name="Joshua Hoffman">jhoffman23</who>
    <bug_when>2024-01-11 10:26:40 -0800</bug_when>
    <thetext>(In reply to Andres Gonzalez from comment #11)
&gt; (In reply to Joshua Hoffman from comment #10)
&gt; &gt; (In reply to Andres Gonzalez from comment #9)
&gt; &gt; &gt; (In reply to Joshua Hoffman from comment #8)
&gt; &gt; &gt; &gt; Created attachment 469372 [details]
&gt; &gt; &gt; &gt; Patch
&gt; &gt; &gt; 
&gt; &gt; &gt; diff --git a/Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.cpp
&gt; &gt; &gt; b/Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.cpp
&gt; &gt; &gt; index f6f0622abe93..c003ae7462a9 100644
&gt; &gt; &gt; --- a/Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.cpp
&gt; &gt; &gt; +++ b/Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.cpp
&gt; &gt; &gt; @@ -160,9 +160,10 @@ Ref&lt;AXIsolatedTree&gt;
&gt; &gt; &gt; AXIsolatedTree::create(AXObjectCache&amp; axObjectCache)
&gt; &gt; &gt; 
&gt; &gt; &gt;      tree-&gt;updateLoadingProgress(axObjectCache.loadingProgress());
&gt; &gt; &gt; 
&gt; &gt; &gt; -    tree-&gt;updateRelations(axObjectCache.relations());
&gt; &gt; &gt; +    const auto relations = axObjectCache.relations();
&gt; &gt; &gt; +    tree-&gt;updateRelations(relations);
&gt; &gt; &gt; 
&gt; &gt; &gt; -    for (auto&amp; relatedObjectID : axObjectCache.relations().keys()) {
&gt; &gt; &gt; +    for (auto&amp; relatedObjectID : relations.keys()) {
&gt; &gt; &gt;          RefPtr axObject = axObjectCache.objectForID(relatedObjectID);
&gt; &gt; &gt;          if (axObject &amp;&amp; axObject-&gt;accessibilityIsIgnored())
&gt; &gt; &gt;              tree-&gt;addUnconnectedNode(axObject.releaseNonNull());
&gt; &gt; &gt; 
&gt; &gt; &gt; AG: I don&apos;t think we need this for loop at all since the unconnected iso
&gt; &gt; &gt; objects are added in AXObjectCache::addRelation when relations are updated.
&gt; &gt; &gt; I think this is another left over from a previous change that wasn&apos;t
&gt; &gt; &gt; necessary. But I may be missing something...
&gt; &gt; 
&gt; &gt; We need this loop in addition to the code in addRelations so that if the
&gt; &gt; isolated tree is enabled/initialized after relations have been added, we
&gt; &gt; still create unconnected objects for the existing relations on the tree.
&gt; 
&gt; Wouldn&apos;t it make more sense to dirty the relations in that scenario?

I worry that dirtying relations if they have already been created could add some time complexity issues, but definitely open to discussing that.

In terms of why adding the unconnected nodes here would be needed if ITM is already on, I added logging in both AXObjectCache::addRelation and AXIsolatedTree::createEmpty, and because of timing, we begin to add relations while the isolated tree is also being created, meaning we would miss out on some relations:

LOG: AXObjectCache::addRelation
LOG: AXObjectCache::addRelation
LOG: AXObjectCache::addRelation
LOG: AXObjectCache::addRelation
LOG: AXObjectCache::addRelation
LOG: AXIsolatedTree::createEmpty
LOG: AXIsolatedTree::create
LOG: AXObjectCache::addRelation
LOG: AXObjectCache::addRelation</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>2004534</commentid>
    <comment_count>13</comment_count>
    <who name="Andres Gonzalez">andresg_22</who>
    <bug_when>2024-01-11 13:30:18 -0800</bug_when>
    <thetext>(In reply to Joshua Hoffman from comment #12)
&gt; (In reply to Andres Gonzalez from comment #11)
&gt; &gt; (In reply to Joshua Hoffman from comment #10)
&gt; &gt; &gt; (In reply to Andres Gonzalez from comment #9)
&gt; &gt; &gt; &gt; (In reply to Joshua Hoffman from comment #8)
&gt; &gt; &gt; &gt; &gt; Created attachment 469372 [details]
&gt; &gt; &gt; &gt; &gt; Patch
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; diff --git a/Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.cpp
&gt; &gt; &gt; &gt; b/Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.cpp
&gt; &gt; &gt; &gt; index f6f0622abe93..c003ae7462a9 100644
&gt; &gt; &gt; &gt; --- a/Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.cpp
&gt; &gt; &gt; &gt; +++ b/Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.cpp
&gt; &gt; &gt; &gt; @@ -160,9 +160,10 @@ Ref&lt;AXIsolatedTree&gt;
&gt; &gt; &gt; &gt; AXIsolatedTree::create(AXObjectCache&amp; axObjectCache)
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt;      tree-&gt;updateLoadingProgress(axObjectCache.loadingProgress());
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; -    tree-&gt;updateRelations(axObjectCache.relations());
&gt; &gt; &gt; &gt; +    const auto relations = axObjectCache.relations();
&gt; &gt; &gt; &gt; +    tree-&gt;updateRelations(relations);
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; -    for (auto&amp; relatedObjectID : axObjectCache.relations().keys()) {
&gt; &gt; &gt; &gt; +    for (auto&amp; relatedObjectID : relations.keys()) {
&gt; &gt; &gt; &gt;          RefPtr axObject = axObjectCache.objectForID(relatedObjectID);
&gt; &gt; &gt; &gt;          if (axObject &amp;&amp; axObject-&gt;accessibilityIsIgnored())
&gt; &gt; &gt; &gt;              tree-&gt;addUnconnectedNode(axObject.releaseNonNull());
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; AG: I don&apos;t think we need this for loop at all since the unconnected iso
&gt; &gt; &gt; &gt; objects are added in AXObjectCache::addRelation when relations are updated.
&gt; &gt; &gt; &gt; I think this is another left over from a previous change that wasn&apos;t
&gt; &gt; &gt; &gt; necessary. But I may be missing something...
&gt; &gt; &gt; 
&gt; &gt; &gt; We need this loop in addition to the code in addRelations so that if the
&gt; &gt; &gt; isolated tree is enabled/initialized after relations have been added, we
&gt; &gt; &gt; still create unconnected objects for the existing relations on the tree.
&gt; &gt; 
&gt; &gt; Wouldn&apos;t it make more sense to dirty the relations in that scenario?
&gt; 
&gt; I worry that dirtying relations if they have already been created could add
&gt; some time complexity issues, but definitely open to discussing that.
&gt; 
&gt; In terms of why adding the unconnected nodes here would be needed if ITM is
&gt; already on, I added logging in both AXObjectCache::addRelation and
&gt; AXIsolatedTree::createEmpty, and because of timing, we begin to add
&gt; relations while the isolated tree is also being created, meaning we would
&gt; miss out on some relations:
&gt; 
&gt; LOG: AXObjectCache::addRelation
&gt; LOG: AXObjectCache::addRelation
&gt; LOG: AXObjectCache::addRelation
&gt; LOG: AXObjectCache::addRelation
&gt; LOG: AXObjectCache::addRelation
&gt; LOG: AXIsolatedTree::createEmpty
&gt; LOG: AXIsolatedTree::create
&gt; LOG: AXObjectCache::addRelation
&gt; LOG: AXObjectCache::addRelation

Thanks for the additional confirmation.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>2004616</commentid>
    <comment_count>14</comment_count>
    <who name="EWS">ews-feeder</who>
    <bug_when>2024-01-11 21:45:21 -0800</bug_when>
    <thetext>Committed 272958@main (0c339289de37): &lt;https://commits.webkit.org/272958@main&gt;

All reviewed patches have been landed. Closing bug and clearing flags on attachment 469372.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>469369</attachid>
            <date>2024-01-10 22:18:45 -0800</date>
            <delta_ts>2024-01-10 22:20:12 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-267348-20240110221844.patch</filename>
            <type>text/plain</type>
            <size>2021</size>
            <attacher name="Joshua Hoffman">jhoffman23</attacher>
            
              <data encoding="base64">RnJvbSA1MzA4N2VhM2FlNzA4OTkzZjAxM2EyNjExMGExODExMzBlNGMyZGRlIE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBKb3NodWEgSG9mZm1hbiA8amhvZmZtYW4yM0BhcHBsZS5jb20+
CkRhdGU6IFdlZCwgMTAgSmFuIDIwMjQgMjI6MDQ6MTEgLTA4MDAKU3ViamVjdDogW1BBVENIXSBB
WDogQVNTRVJUSU9OIEZBSUxFRDogbV90YWJsZSBpbnNpZGUgb2YKIEFYSXNvbGF0ZWRUcmVlOjpj
cmVhdGUgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI2NzM0OAogcmRh
cjovLzEyMDc4ODE0NQpNSU1FLVZlcnNpb246IDEuMApDb250ZW50LVR5cGU6IHRleHQvcGxhaW47
IGNoYXJzZXQ9VVRGLTgKQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdAoKUmV2aWV3ZWQg
YnkgTk9CT0RZIChPT1BTISkuCgpXZSBjYW5ub3QgcmVseSBvbiB1c2luZyBheE9iamVjdENhY2hl
LnJlbGF0aW9ucygpIHRvIGl0ZXJhdGUgdGhlIG5ldyByZWxhdGlvbnMgZHVyaW5nIHRoZSBjcmVh
dGlvbiBvZiB0aGUKaXNvbGF0ZWQgdHJlZSwgYXMgdGhhdCBIYXNoTWFwIG1heSBiZSBtb2RpZmll
ZCBvciBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyB1cGRhdGVkLiBUaGlzIHBhdGNoIHNhdmVzIHRo
ZQpyZWxhdGlvbnMgZnJvbSB0aGUgY2FjaGUgdG8gYSBjb25zdCB2YXJpYWJsZSwgdG8gcHJldmVu
dCB0aGlzIGlzc3VlLgoKVGhpcyBjaGFuZ2UgYWxzbyBwcmV2ZW50cyB0aGUgbmVlZCB0byBjYWxs
IEFYT2JqZWN0Q2FjaGU6OnJlbGF0aW9ucygpIHR3aWNl4oCUd2hpY2ggY291bGQgc3Vic2VxdWVu
dGx5IGNhbGwKdXBkYXRlUmVsYXRpb25zSWZOZWVkZWQoKSBkb3duc3RyZWFtLgoKKiBTb3VyY2Uv
V2ViQ29yZS9hY2Nlc3NpYmlsaXR5L2lzb2xhdGVkdHJlZS9BWElzb2xhdGVkVHJlZS5jcHA6CihX
ZWJDb3JlOjpBWElzb2xhdGVkVHJlZTo6Y3JlYXRlKToKLS0tCiBTb3VyY2UvV2ViQ29yZS9hY2Nl
c3NpYmlsaXR5L2lzb2xhdGVkdHJlZS9BWElzb2xhdGVkVHJlZS5jcHAgfCA1ICsrKy0tCiAxIGZp
bGUgY2hhbmdlZCwgMyBpbnNlcnRpb25zKCspLCAyIGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBh
L1NvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvaXNvbGF0ZWR0cmVlL0FYSXNvbGF0ZWRUcmVl
LmNwcCBiL1NvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvaXNvbGF0ZWR0cmVlL0FYSXNvbGF0
ZWRUcmVlLmNwcAppbmRleCBmNmYwNjIyYWJlOTMuLjE4YWM5NjNhYTRlMiAxMDA2NDQKLS0tIGEv
U291cmNlL1dlYkNvcmUvYWNjZXNzaWJpbGl0eS9pc29sYXRlZHRyZWUvQVhJc29sYXRlZFRyZWUu
Y3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvaXNvbGF0ZWR0cmVlL0FYSXNv
bGF0ZWRUcmVlLmNwcApAQCAtMTYwLDkgKzE2MCwxMCBAQCBSZWY8QVhJc29sYXRlZFRyZWU+IEFY
SXNvbGF0ZWRUcmVlOjpjcmVhdGUoQVhPYmplY3RDYWNoZSYgYXhPYmplY3RDYWNoZSkKIAogICAg
IHRyZWUtPnVwZGF0ZUxvYWRpbmdQcm9ncmVzcyhheE9iamVjdENhY2hlLmxvYWRpbmdQcm9ncmVz
cygpKTsKIAotICAgIHRyZWUtPnVwZGF0ZVJlbGF0aW9ucyhheE9iamVjdENhY2hlLnJlbGF0aW9u
cygpKTsKKyAgICBjb25zdCBhdXRvJiByZWxhdGlvbnMgPSBheE9iamVjdENhY2hlLnJlbGF0aW9u
cygpOworICAgIHRyZWUtPnVwZGF0ZVJlbGF0aW9ucyhyZWxhdGlvbnMpOwogCi0gICAgZm9yIChh
dXRvJiByZWxhdGVkT2JqZWN0SUQgOiBheE9iamVjdENhY2hlLnJlbGF0aW9ucygpLmtleXMoKSkg
eworICAgIGZvciAoYXV0byYgcmVsYXRlZE9iamVjdElEIDogcmVsYXRpb25zLmtleXMoKSkgewog
ICAgICAgICBSZWZQdHIgYXhPYmplY3QgPSBheE9iamVjdENhY2hlLm9iamVjdEZvcklEKHJlbGF0
ZWRPYmplY3RJRCk7CiAgICAgICAgIGlmIChheE9iamVjdCAmJiBheE9iamVjdC0+YWNjZXNzaWJp
bGl0eUlzSWdub3JlZCgpKQogICAgICAgICAgICAgdHJlZS0+YWRkVW5jb25uZWN0ZWROb2RlKGF4
T2JqZWN0LnJlbGVhc2VOb25OdWxsKCkpOwo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>469370</attachid>
            <date>2024-01-10 22:20:14 -0800</date>
            <delta_ts>2024-01-10 23:00:25 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-267348-20240110222013.patch</filename>
            <type>text/plain</type>
            <size>2018</size>
            <attacher name="Joshua Hoffman">jhoffman23</attacher>
            
              <data encoding="base64">RnJvbSAzYTA3MDE2Y2UzZTkyOTlkYmEwMGY1YmNhMGMzNWQzMGYwNWY3ODlkIE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBKb3NodWEgSG9mZm1hbiA8amhvZmZtYW4yM0BhcHBsZS5jb20+
CkRhdGU6IFdlZCwgMTAgSmFuIDIwMjQgMjI6MDQ6MTEgLTA4MDAKU3ViamVjdDogW1BBVENIXSBB
WDogQVNTRVJUSU9OIEZBSUxFRDogbV90YWJsZSBpbnNpZGUgb2YKIEFYSXNvbGF0ZWRUcmVlOjpj
cmVhdGUgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI2NzM0OAogcmRh
cjovLzEyMDc4ODE0NQpNSU1FLVZlcnNpb246IDEuMApDb250ZW50LVR5cGU6IHRleHQvcGxhaW47
IGNoYXJzZXQ9VVRGLTgKQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdAoKUmV2aWV3ZWQg
YnkgTk9CT0RZIChPT1BTISkuCgpXZSBjYW5ub3QgcmVseSBvbiB1c2luZyBheE9iamVjdENhY2hl
LnJlbGF0aW9ucygpIHRvIGl0ZXJhdGUgdGhlIG5ldyByZWxhdGlvbnMgZHVyaW5nIHRoZSBjcmVh
dGlvbiBvZiB0aGUKaXNvbGF0ZWQgdHJlZSwgYXMgdGhhdCBIYXNoTWFwIG1heSBiZSBtb2RpZmll
ZCBvciBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyB1cGRhdGVkLiBUaGlzIHBhdGNoIGNyZWF0ZXMg
YQpjb25zdCByZWZlcmVuY2UgdmFyaWFibGUgdG8gdGhlIHJlbGF0aW9ucywgdG8gcHJldmVudCB0
aGlzIGlzc3VlLgoKVGhpcyBjaGFuZ2UgYWxzbyBwcmV2ZW50cyB0aGUgbmVlZCB0byBjYWxsIEFY
T2JqZWN0Q2FjaGU6OnJlbGF0aW9ucygpIHR3aWNl4oCUd2hpY2ggY291bGQgc3Vic2VxdWVudGx5
IGNhbGwKdXBkYXRlUmVsYXRpb25zSWZOZWVkZWQoKSBkb3duc3RyZWFtLgoKKiBTb3VyY2UvV2Vi
Q29yZS9hY2Nlc3NpYmlsaXR5L2lzb2xhdGVkdHJlZS9BWElzb2xhdGVkVHJlZS5jcHA6CihXZWJD
b3JlOjpBWElzb2xhdGVkVHJlZTo6Y3JlYXRlKToKLS0tCiBTb3VyY2UvV2ViQ29yZS9hY2Nlc3Np
YmlsaXR5L2lzb2xhdGVkdHJlZS9BWElzb2xhdGVkVHJlZS5jcHAgfCA1ICsrKy0tCiAxIGZpbGUg
Y2hhbmdlZCwgMyBpbnNlcnRpb25zKCspLCAyIGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvaXNvbGF0ZWR0cmVlL0FYSXNvbGF0ZWRUcmVlLmNw
cCBiL1NvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvaXNvbGF0ZWR0cmVlL0FYSXNvbGF0ZWRU
cmVlLmNwcAppbmRleCBmNmYwNjIyYWJlOTMuLjE4YWM5NjNhYTRlMiAxMDA2NDQKLS0tIGEvU291
cmNlL1dlYkNvcmUvYWNjZXNzaWJpbGl0eS9pc29sYXRlZHRyZWUvQVhJc29sYXRlZFRyZWUuY3Bw
CisrKyBiL1NvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvaXNvbGF0ZWR0cmVlL0FYSXNvbGF0
ZWRUcmVlLmNwcApAQCAtMTYwLDkgKzE2MCwxMCBAQCBSZWY8QVhJc29sYXRlZFRyZWU+IEFYSXNv
bGF0ZWRUcmVlOjpjcmVhdGUoQVhPYmplY3RDYWNoZSYgYXhPYmplY3RDYWNoZSkKIAogICAgIHRy
ZWUtPnVwZGF0ZUxvYWRpbmdQcm9ncmVzcyhheE9iamVjdENhY2hlLmxvYWRpbmdQcm9ncmVzcygp
KTsKIAotICAgIHRyZWUtPnVwZGF0ZVJlbGF0aW9ucyhheE9iamVjdENhY2hlLnJlbGF0aW9ucygp
KTsKKyAgICBjb25zdCBhdXRvJiByZWxhdGlvbnMgPSBheE9iamVjdENhY2hlLnJlbGF0aW9ucygp
OworICAgIHRyZWUtPnVwZGF0ZVJlbGF0aW9ucyhyZWxhdGlvbnMpOwogCi0gICAgZm9yIChhdXRv
JiByZWxhdGVkT2JqZWN0SUQgOiBheE9iamVjdENhY2hlLnJlbGF0aW9ucygpLmtleXMoKSkgewor
ICAgIGZvciAoYXV0byYgcmVsYXRlZE9iamVjdElEIDogcmVsYXRpb25zLmtleXMoKSkgewogICAg
ICAgICBSZWZQdHIgYXhPYmplY3QgPSBheE9iamVjdENhY2hlLm9iamVjdEZvcklEKHJlbGF0ZWRP
YmplY3RJRCk7CiAgICAgICAgIGlmIChheE9iamVjdCAmJiBheE9iamVjdC0+YWNjZXNzaWJpbGl0
eUlzSWdub3JlZCgpKQogICAgICAgICAgICAgdHJlZS0+YWRkVW5jb25uZWN0ZWROb2RlKGF4T2Jq
ZWN0LnJlbGVhc2VOb25OdWxsKCkpOwo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>469372</attachid>
            <date>2024-01-10 23:00:27 -0800</date>
            <delta_ts>2024-01-11 21:45:22 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-267348-20240110230027.patch</filename>
            <type>text/plain</type>
            <size>2007</size>
            <attacher name="Joshua Hoffman">jhoffman23</attacher>
            
              <data encoding="base64">RnJvbSA0ZjY0YTc1MWY5ZWQ3YmNlYmRhMzhmYTU3YTZlMjJjYzk5NzIwODY3IE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBKb3NodWEgSG9mZm1hbiA8amhvZmZtYW4yM0BhcHBsZS5jb20+
CkRhdGU6IFdlZCwgMTAgSmFuIDIwMjQgMjI6MDQ6MTEgLTA4MDAKU3ViamVjdDogW1BBVENIXSBB
WDogQVNTRVJUSU9OIEZBSUxFRDogbV90YWJsZSBpbnNpZGUgb2YKIEFYSXNvbGF0ZWRUcmVlOjpj
cmVhdGUgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI2NzM0OAogcmRh
cjovLzEyMDc4ODE0NQpNSU1FLVZlcnNpb246IDEuMApDb250ZW50LVR5cGU6IHRleHQvcGxhaW47
IGNoYXJzZXQ9VVRGLTgKQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdAoKUmV2aWV3ZWQg
YnkgTk9CT0RZIChPT1BTISkuCgpXZSBjYW5ub3QgcmVseSBvbiB1c2luZyBheE9iamVjdENhY2hl
LnJlbGF0aW9ucygpIHRvIGl0ZXJhdGUgdGhlIG5ldyByZWxhdGlvbnMgZHVyaW5nIHRoZSBjcmVh
dGlvbiBvZiB0aGUKaXNvbGF0ZWQgdHJlZSwgYXMgdGhhdCBIYXNoTWFwIG1heSBiZSBtb2RpZmll
ZCBvciBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyB1cGRhdGVkLiBUaGlzIHBhdGNoIGNyZWF0ZXMg
YQpjb3B5IG9mIHRoZXNlIHJlbGF0aW9ucyBpbnN0ZWFkLCB0byBwcmV2ZW50IHRoaXMgaXNzdWUu
CgpUaGlzIGNoYW5nZSBhbHNvIHByZXZlbnRzIHRoZSBuZWVkIHRvIGNhbGwgQVhPYmplY3RDYWNo
ZTo6cmVsYXRpb25zKCkgdHdpY2XigJR3aGljaCBjb3VsZCBzdWJzZXF1ZW50bHkgY2FsbAp1cGRh
dGVSZWxhdGlvbnNJZk5lZWRlZCgpIGRvd25zdHJlYW0uCgoqIFNvdXJjZS9XZWJDb3JlL2FjY2Vz
c2liaWxpdHkvaXNvbGF0ZWR0cmVlL0FYSXNvbGF0ZWRUcmVlLmNwcDoKKFdlYkNvcmU6OkFYSXNv
bGF0ZWRUcmVlOjpjcmVhdGUpOgotLS0KIFNvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvaXNv
bGF0ZWR0cmVlL0FYSXNvbGF0ZWRUcmVlLmNwcCB8IDUgKysrLS0KIDEgZmlsZSBjaGFuZ2VkLCAz
IGluc2VydGlvbnMoKyksIDIgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNv
cmUvYWNjZXNzaWJpbGl0eS9pc29sYXRlZHRyZWUvQVhJc29sYXRlZFRyZWUuY3BwIGIvU291cmNl
L1dlYkNvcmUvYWNjZXNzaWJpbGl0eS9pc29sYXRlZHRyZWUvQVhJc29sYXRlZFRyZWUuY3BwCmlu
ZGV4IGY2ZjA2MjJhYmU5My4uYzAwM2FlNzQ2MmE5IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9hY2Nlc3NpYmlsaXR5L2lzb2xhdGVkdHJlZS9BWElzb2xhdGVkVHJlZS5jcHAKKysrIGIvU291
cmNlL1dlYkNvcmUvYWNjZXNzaWJpbGl0eS9pc29sYXRlZHRyZWUvQVhJc29sYXRlZFRyZWUuY3Bw
CkBAIC0xNjAsOSArMTYwLDEwIEBAIFJlZjxBWElzb2xhdGVkVHJlZT4gQVhJc29sYXRlZFRyZWU6
OmNyZWF0ZShBWE9iamVjdENhY2hlJiBheE9iamVjdENhY2hlKQogCiAgICAgdHJlZS0+dXBkYXRl
TG9hZGluZ1Byb2dyZXNzKGF4T2JqZWN0Q2FjaGUubG9hZGluZ1Byb2dyZXNzKCkpOwogCi0gICAg
dHJlZS0+dXBkYXRlUmVsYXRpb25zKGF4T2JqZWN0Q2FjaGUucmVsYXRpb25zKCkpOworICAgIGNv
bnN0IGF1dG8gcmVsYXRpb25zID0gYXhPYmplY3RDYWNoZS5yZWxhdGlvbnMoKTsKKyAgICB0cmVl
LT51cGRhdGVSZWxhdGlvbnMocmVsYXRpb25zKTsKIAotICAgIGZvciAoYXV0byYgcmVsYXRlZE9i
amVjdElEIDogYXhPYmplY3RDYWNoZS5yZWxhdGlvbnMoKS5rZXlzKCkpIHsKKyAgICBmb3IgKGF1
dG8mIHJlbGF0ZWRPYmplY3RJRCA6IHJlbGF0aW9ucy5rZXlzKCkpIHsKICAgICAgICAgUmVmUHRy
IGF4T2JqZWN0ID0gYXhPYmplY3RDYWNoZS5vYmplY3RGb3JJRChyZWxhdGVkT2JqZWN0SUQpOwog
ICAgICAgICBpZiAoYXhPYmplY3QgJiYgYXhPYmplY3QtPmFjY2Vzc2liaWxpdHlJc0lnbm9yZWQo
KSkKICAgICAgICAgICAgIHRyZWUtPmFkZFVuY29ubmVjdGVkTm9kZShheE9iamVjdC5yZWxlYXNl
Tm9uTnVsbCgpKTsK
</data>

          </attachment>
      

    </bug>

</bugzilla>