aboutsummaryrefslogtreecommitdiffstats
path: root/src/egl/main
diff options
context:
space:
mode:
authorKyle Brenneman <[email protected]>2018-06-06 09:08:47 -0600
committerEric Engestrom <[email protected]>2018-06-11 12:17:07 +0100
commit41642bdbca007035772fbfdc311f14daa5510d5d (patch)
tree287042074c5b35edb0fefbd49853e9151e61bdfa /src/egl/main
parente266b320590ebbeadf7c98b0b493d89886534ccb (diff)
egl/glvnd: Fix a segfault in eglGetProcAddress.
If FindProcIndex in egldispatchstubs.c is called with a name that's less than the first entry in the array, it would end up trying to store an index of -1 in an unsigned integer, wrap around to 2^32, and then crash when it tries to look that up. Change FindProcIndex so that it uses bsearch(3) instead of implementing its own binary search, like the GLX equivalent FindGLXFunction does. Reviewed-by: Eric Engestrom <[email protected]>
Diffstat (limited to 'src/egl/main')
-rw-r--r--src/egl/main/egldispatchstubs.c30
1 files changed, 13 insertions, 17 deletions
diff --git a/src/egl/main/egldispatchstubs.c b/src/egl/main/egldispatchstubs.c
index e02abd7a9e0..bfc3195c779 100644
--- a/src/egl/main/egldispatchstubs.c
+++ b/src/egl/main/egldispatchstubs.c
@@ -2,6 +2,7 @@
#include "g_egldispatchstubs.h"
#include <string.h>
+#include <stdlib.h>
#include "eglcurrent.h"
@@ -10,26 +11,21 @@ static const __EGLapiExports *exports;
const int __EGL_DISPATCH_FUNC_COUNT = __EGL_DISPATCH_COUNT;
int __EGL_DISPATCH_FUNC_INDICES[__EGL_DISPATCH_COUNT + 1];
+static int Compare(const void *l, const void *r)
+{
+ const char *s = *(const char **)r;
+ return strcmp(l, s);
+}
+
static int FindProcIndex(const char *name)
{
- unsigned first = 0;
- unsigned last = __EGL_DISPATCH_COUNT - 1;
-
- while (first <= last) {
- unsigned middle = (first + last) / 2;
- int comp = strcmp(name,
- __EGL_DISPATCH_FUNC_NAMES[middle]);
-
- if (comp > 0)
- first = middle + 1;
- else if (comp < 0)
- last = middle - 1;
- else
- return middle;
- }
+ const char **match = bsearch(name, __EGL_DISPATCH_FUNC_NAMES,
+ __EGL_DISPATCH_COUNT, sizeof(const char *), Compare);
+
+ if (match == NULL)
+ return __EGL_DISPATCH_COUNT;
- /* Just point to the dummy entry at the end of the respective table */
- return __EGL_DISPATCH_COUNT;
+ return match - __EGL_DISPATCH_FUNC_NAMES;
}
void __eglInitDispatchStubs(const __EGLapiExports *exportsTable)