Fix a crash on Android with Align2Npot2 (#8070)
authorLoïc Blot <nerzhul@users.noreply.github.com>
Mon, 7 Jan 2019 16:05:18 +0000 (17:05 +0100)
committerGitHub <noreply@github.com>
Mon, 7 Jan 2019 16:05:18 +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 019b6e7fabdb6f0ac3544836d5013c490fe5badf..a65eb5fc8469c412cbf533076ebd68de392cc5cd 100644 (file)
@@ -1012,13 +1012,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);