/* * Reproducer for a Xorg crash with indirect GLX due to incorrect GL dispatch * Written by Michal Schmidt * Copyright 2014 Red Hat, Inc. * * Permission is hereby granted, without written agreement and without * license or royalty fees, to use, copy, modify, and distribute this * software and its documentation for any purpose, provided that the * above copyright notice and the following two paragraphs appear in * all copies of this software. * * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. * * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * * Install build dependencies (on Fedora): * yum install freeglut-devel * Build: * gcc -lGL -lglut -o glxcrash glxcrash.c * Run: * ./glxcrash -indirect */ #include #include #include static void draw(void) { static const unsigned char *msg = (unsigned char*) "If you can see this, it did not crash."; /* crash! (not because of nonsense arguments, but because of * bad GL indirection table in Xorg process) */ glCompressedTexImage2D(0, 0, 0, 0, 0, 0, 5, "Hello"); glClear(GL_COLOR_BUFFER_BIT); glRasterPos2f(-0.9,0); glutBitmapString(GLUT_BITMAP_HELVETICA_18, msg); glutSwapBuffers(); } int main(int argc, char **argv) { int win; glutInitWindowSize(350, 100); glutInit(&argc, argv); win = glutCreateWindow("glxcrash"); if (!win) { fprintf(stderr, "glutCreateWindow failed\n"); return 1; } glutDisplayFunc(draw); glutMainLoop(); return 0; }