Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 09fc8f95 authored by Jesse Hall's avatar Jesse Hall
Browse files

Handle glGetString returning NULL

When two contexts are shared, and one is lost/reset, the other can be
lost as well. A lost context can return NULL from glGetString. On the
first eglMakeCurrent to a context, we fetch the extension list, and
weren't checking for NULL, leading to a crash in the rare case where a
context is lost and then another context sharing with it is made
current for the first time.

Bug: 64024627
Test: dEQP-EGL.functional.robustness.reset_context.shaders.infinite_loop.shared_context_status.*
Change-Id: Ib7e1b932490ec587df159e9e461c211d3dac35d4
parent f71878b8
Loading
Loading
Loading
Loading
+16 −10
Original line number Diff line number Diff line
@@ -113,6 +113,11 @@ void egl_context_t::onMakeCurrent(EGLSurface draw, EGLSurface read) {
    if (gl_extensions.empty()) {
        // call the implementation's glGetString(GL_EXTENSIONS)
        const char* exts = (const char *)gEGLImpl.hooks[version]->gl.glGetString(GL_EXTENSIONS);

        // If this context is sharing with another context, and the other context was reset
        // e.g. due to robustness failure, this context might also be reset and glGetString can
        // return NULL.
        if (exts) {
            gl_extensions = exts;
            if (gl_extensions.find("GL_EXT_debug_marker") == std::string::npos) {
                gl_extensions.insert(0, "GL_EXT_debug_marker ");
@@ -127,6 +132,7 @@ void egl_context_t::onMakeCurrent(EGLSurface draw, EGLSurface read) {
            }
        }
    }
}

// ----------------------------------------------------------------------------
}; // namespace android