<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Tue, Apr 24, 2018 at 3:13 AM, Johan Helsing <span dir="ltr"><<a href="mailto:johan.helsing@qt.io" target="_blank">johan.helsing@qt.io</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">




<div dir="ltr">
<div id="m_7228779069046510060m_7308914467492904174divtagdefaultwrapper" style="font-size:12pt;color:#000000;font-family:Calibri,Helvetica,sans-serif" dir="ltr">
<p style="margin-top:0;margin-bottom:0">Emil: Your alternative patch won't work because dri_make_current is not necessarily called with NULL after a buffer has been destroyed.</p>
<p style="margin-top:0;margin-bottom:0"><br>
</p>
<p style="margin-top:0;margin-bottom:0">The problematic sequence is a pattern we use in QtWayland:</p>
<p style="margin-top:0;margin-bottom:0"><br>
</p>
<p style="margin-top:0;margin-bottom:0">//create temporary context</p>
<p style="margin-top:0;margin-bottom:0">surface1 = eglCreateWindowSurface() <-- dri_drawable pointer is malloced</p>
<p style="margin-top:0;margin-bottom:0">eglMakeCurrent(surface1) <-- ctx->dPriv is set</p>
<p style="margin-top:0;margin-bottom:0"><br>
</p>
<p style="margin-top:0;margin-bottom:0">// ... (Get some information about available GL extensions etc)</p>
<p style="margin-top:0;margin-bottom:0"><br>
</p>
<p style="margin-top:0;margin-bottom:0">eglDestroySurface(surface1) <-- pointer is freed, ctx->dPriv is now dangling</p>
<p style="margin-top:0;margin-bottom:0">surface2 = eglCreateWindowSurface() <-- Creating a new surface. Sometimes it's address will be the same as the free'd pointer.</p>
<p style="margin-top:0;margin-bottom:0">eglMakeCurrent(surface2) <-- In dri_make_current, ctx->dPriv == driReadPriv may return true because the pointers may be equal</p>
<p style="margin-top:0;margin-bottom:0">      => The drawable info is not updated. Width and height for the drawable is not set from the wl_egl_window on the first frame.</p>
<p style="margin-top:0;margin-bottom:0"><br>
</p>
<p style="margin-top:0;margin-bottom:0">Marek: How exactly does it crash? Are you sure firefox didn't previously access free'd memory through the dangling pointer and that it was just exposed now that the pointer is NULL?</p></div></div></blockquote><div><br></div></div>ctx was a dangling pointer, which means ctx had been destroyed, and reading ctx->dPriv crashed.<br><br></div><div class="gmail_extra">Marek<br></div></div>