diff options
author | Julien Isorce <j.isorce@samsung.com> | 2015-05-19 08:35:10 +0100 |
---|---|---|
committer | Brian Paul <brianp@vmware.com> | 2015-05-25 09:02:32 -0600 |
commit | fca824431608101298ff0735db4c09954dcf64ab (patch) | |
tree | f989e0df3fe9bfe34c055c14a2d34fe062a3b07d | |
parent | 40d4d3b3c6c41f240de994c09e02fae357b42848 (diff) |
glxinfo: fix segfault when core profile is unavailable
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=85199
Signed-off-by: Julien Isorce <j.isorce@samsung.com>
Reviewed-by: Brian Paul <brianp@vmware.com>
-rw-r--r-- | src/xdemos/glinfo_common.c | 6 | ||||
-rw-r--r-- | src/xdemos/glxinfo.c | 22 |
2 files changed, 16 insertions, 12 deletions
diff --git a/src/xdemos/glinfo_common.c b/src/xdemos/glinfo_common.c index 6a360a31..5d865f34 100644 --- a/src/xdemos/glinfo_common.c +++ b/src/xdemos/glinfo_common.c @@ -289,9 +289,13 @@ build_core_profile_extension_list(const struct ext_functions *extfuncs) totalLen = 0; for (i = 0; i < n; i++) { const char *ext = (const char *) extfuncs->GetStringi(GL_EXTENSIONS, i); - totalLen += strlen(ext) + 1; /* plus a space */ + if (ext) + totalLen += strlen(ext) + 1; /* plus a space */ } + if (!totalLen) + return NULL; + buffer = malloc(totalLen + 1); if (buffer) { int pos = 0; diff --git a/src/xdemos/glxinfo.c b/src/xdemos/glxinfo.c index 0f28647d..dc29bd9f 100644 --- a/src/xdemos/glxinfo.c +++ b/src/xdemos/glxinfo.c @@ -468,9 +468,9 @@ print_screen_info(Display *dpy, int scrnum, const char *glVendor = (const char *) glGetString(GL_VENDOR); const char *glRenderer = (const char *) glGetString(GL_RENDERER); const char *glVersion = (const char *) glGetString(GL_VERSION); - char *glExtensions; - int glxVersionMajor; - int glxVersionMinor; + char *glExtensions = NULL; + int glxVersionMajor = 0; + int glxVersionMinor = 0; char *displayName = NULL; char *colon = NULL, *period = NULL; struct ext_functions extfuncs; @@ -485,21 +485,21 @@ print_screen_info(Display *dpy, int scrnum, extfuncs.GetConvolutionParameteriv = (GETCONVOLUTIONPARAMETERIVPROC) glXGetProcAddressARB((GLubyte *) "glGetConvolutionParameteriv"); + if (!glXQueryVersion(dpy, & glxVersionMajor, & glxVersionMinor)) { + fprintf(stderr, "Error: glXQueryVersion failed\n"); + exit(1); + } + /* Get list of GL extensions */ - if (coreProfile) { + if (coreProfile && extfuncs.GetStringi && glxVersionMajor >= 3) glExtensions = build_core_profile_extension_list(&extfuncs); - } - else { + if (!glExtensions) { + coreProfile = False; glExtensions = (char *) glGetString(GL_EXTENSIONS); } CheckError(__LINE__); - if (! glXQueryVersion( dpy, & glxVersionMajor, & glxVersionMinor )) { - fprintf(stderr, "Error: glXQueryVersion failed\n"); - exit(1); - } - if (!coreWorked) { /* Strip the screen number from the display name, if present. */ if (!(displayName = (char *) malloc(strlen(DisplayString(dpy)) + 1))) { |