Fix a crash on Android with Align2Npot2 (#8070) stable-0.4
authorLoïc Blot <nerzhul@users.noreply.github.com>
Mon, 7 Jan 2019 16:05:18 +0000 (17:05 +0100)
committerLoïc Blot <loic.blot@unix-experience.fr>
Mon, 7 Jan 2019 16:05:54 +0000 (17:05 +0100)
* Fix a crash on Android with Align2Npot2

glGetString can be NULL. If stored in a string it triggers a SIGSEGV.
Instead do a basic strstr and verify the pointer
* Better Align2Npot2 check (+ performance)

src/client/tile.cpp

index cfdff1bb2521ae71b196fa1392443092d34e464e..ba6b3dfff7b99bf8af4905b8581adb54e162dac0 100644 (file)
@@ -1138,13 +1138,14 @@ video::IImage * Align2Npot2(video::IImage * image,
 
        core::dimension2d<u32> dim = image->getDimension();
 
-       std::string extensions = (char*) glGetString(GL_EXTENSIONS);
-
        // Only GLES2 is trusted to correctly report npot support
-       if (get_GL_major_version() > 1 &&
-                       extensions.find("GL_OES_texture_npot") != std::string::npos) {
+       // Note: we cache the boolean result. GL context will never change on Android.
+       static const bool hasNPotSupport = get_GL_major_version() > 1 &&
+               glGetString(GL_EXTENSIONS) && 
+               strstr(glGetString(GL_EXTENSIONS), "GL_OES_texture_npot");
+       
+       if (hasNPotSupport)
                return image;
-       }
 
        unsigned int height = npot2(dim.Height);
        unsigned int width  = npot2(dim.Width);