<table><tr><td style="">graesslin created this revision.<br />graesslin added reviewers: KWin, Plasma.<br />Restricted Application added a project: KWin.<br />Restricted Application added subscribers: kwin, plasma-devel.<br />graesslin requested review of this revision.<br />Restricted Application edited projects, added Plasma; removed KWin.
</td><a style="text-decoration: none; padding: 4px 8px; margin: 0 8px 8px; float: right; color: #464C5C; font-weight: bold; border-radius: 3px; background-color: #F7F7F9; background-image: linear-gradient(to bottom,#fff,#f1f0f1); display: inline-block; border: 1px solid rgba(71,87,120,.2);" href="https://phabricator.kde.org/D10291" rel="noreferrer">View Revision</a></tr></table><br /><div><strong>REVISION SUMMARY</strong><div><p>It was possible that the update method was called recursively. This<br />
could result in unpredicted behavior and in the worst case a crash.<br />
This was exposed by adding tooltips to the window decoration (master).<br />
There we have the following sequence:</p>

<ol class="remarkup-list">
<li class="remarkup-list-item">pointer above an internal window (m_internalWindow is not null)</li>
<li class="remarkup-list-item">updateDecoration is called</li>
<li class="remarkup-list-item">triggers a hover enter on a decoration button</li>
<li class="remarkup-list-item">this creates a Tooltip</li>
<li class="remarkup-list-item">which means a new internal window is added</li>
<li class="remarkup-list-item">update is called again</li>
<li class="remarkup-list-item">m_internalWindow gets reset</li>
<li class="remarkup-list-item">back to previous update, now m_internalWindow is null although the if before evaluated to not null</li>
</ol>

<p>-> crash</p>

<p>To prevent this a recursion blocker RAII class is introduced which<br />
calls update again if the method got entered a second time.</p>

<p>Thus the update method can finish operation without the assumptions<br />
being changed while executed. The changes which are required due to<br />
the second call will be applied once we leave the method.</p>

<p>Targeting 5.12 as this is a general problem, although the bug is<br />
only in master.</p>

<p>BUG: 389350<br />
FIXED-IN: 5.12.1</p></div></div><br /><div><strong>TEST PLAN</strong><div><p>No more crash when hovering close button on DebugConsole</p></div></div><br /><div><strong>REPOSITORY</strong><div><div>R108 KWin</div></div></div><br /><div><strong>BRANCH</strong><div><div>input-update-blocker-5.12</div></div></div><br /><div><strong>REVISION DETAIL</strong><div><a href="https://phabricator.kde.org/D10291" rel="noreferrer">https://phabricator.kde.org/D10291</a></div></div><br /><div><strong>AFFECTED FILES</strong><div><div>pointer_input.cpp<br />
touch_input.cpp<br />
update_recursion_blocker.h</div></div></div><br /><div><strong>To: </strong>graesslin, KWin, Plasma<br /><strong>Cc: </strong>plasma-devel, kwin, ZrenBot, progwolff, lesliezhai, ali-mohamed, jensreuterberg, abetts, sebas, apol, mart<br /></div>