summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/egl.html5
-rw-r--r--src/egl/main/egldriver.c65
-rw-r--r--src/egl/main/egllog.c5
3 files changed, 50 insertions, 25 deletions
diff --git a/docs/egl.html b/docs/egl.html
index cc6462d978..c86e543859 100644
--- a/docs/egl.html
+++ b/docs/egl.html
@@ -136,11 +136,6 @@ binaries.</p>
specified EGL driver to be loaded. It comes in handy when one wants to test a
specific driver. This variable is ignored for setuid/setgid binaries.</p>
-<p><code>egl_gallium</code> dynamically loads hardware drivers and client API
-modules found in <code>EGL_DRIVERS_PATH</code>. Thus, specifying this variable
-alone is not sufficient for <code>egl_gallium</code> for an uninstalled
-build.</p>
-
</li>
<li><code>EGL_PLATFORM</code>
diff --git a/src/egl/main/egldriver.c b/src/egl/main/egldriver.c
index 2359253ff1..ff0011c4b1 100644
--- a/src/egl/main/egldriver.c
+++ b/src/egl/main/egldriver.c
@@ -395,35 +395,62 @@ _eglPreloadForEach(const char *search_path,
static const char *
_eglGetSearchPath(void)
{
- static const char *search_path;
+ static char search_path[1024];
#if defined(_EGL_OS_UNIX) || defined(_EGL_OS_WINDOWS)
- if (!search_path) {
- static char buffer[1024];
- const char *p;
+ if (search_path[0] == '\0') {
+ char *buf = search_path;
+ size_t len = sizeof(search_path);
+ EGLBoolean use_env;
+ char dir_sep;
int ret;
- p = getenv("EGL_DRIVERS_PATH");
#if defined(_EGL_OS_UNIX)
- if (p && (geteuid() != getuid() || getegid() != getgid())) {
+ use_env = (geteuid() == getuid() && getegid() == getgid());
+ dir_sep = '/';
+#else
+ use_env = EGL_TRUE;
+ dir_sep = '\\';
+#endif
+
+ if (use_env) {
+ char *p;
+
+ /* extract the dirname from EGL_DRIVER */
+ p = getenv("EGL_DRIVER");
+ if (p && strchr(p, dir_sep)) {
+ ret = _eglsnprintf(buf, len, "%s", p);
+ if (ret > 0 && ret < len) {
+ p = strrchr(buf, dir_sep);
+ *p++ = ':';
+
+ len -= p - buf;
+ buf = p;
+ }
+ }
+
+ /* append EGL_DRIVERS_PATH */
+ p = getenv("EGL_DRIVERS_PATH");
+ if (p) {
+ ret = _eglsnprintf(buf, len, "%s:", p);
+ if (ret > 0 && ret < len) {
+ buf += ret;
+ len -= ret;
+ }
+ }
+ }
+ else {
_eglLog(_EGL_DEBUG,
"ignore EGL_DRIVERS_PATH for setuid/setgid binaries");
- p = NULL;
}
-#endif /* _EGL_OS_UNIX */
- if (p) {
- ret = _eglsnprintf(buffer, sizeof(buffer),
- "%s:%s", p, _EGL_DRIVER_SEARCH_DIR);
- if (ret > 0 && ret < sizeof(buffer))
- search_path = buffer;
- }
+ ret = _eglsnprintf(buf, len, "%s", _EGL_DRIVER_SEARCH_DIR);
+ if (ret < 0 || ret >= len)
+ search_path[0] = '\0';
+
+ _eglLog(_EGL_DEBUG, "EGL search path is %s", search_path);
}
- if (!search_path)
- search_path = _EGL_DRIVER_SEARCH_DIR;
-#else
- search_path = "";
-#endif
+#endif /* defined(_EGL_OS_UNIX) || defined(_EGL_OS_WINDOWS) */
return search_path;
}
diff --git a/src/egl/main/egllog.c b/src/egl/main/egllog.c
index 8f3bae2243..12c55f901a 100644
--- a/src/egl/main/egllog.c
+++ b/src/egl/main/egllog.c
@@ -151,6 +151,7 @@ _eglLog(EGLint level, const char *fmtStr, ...)
{
va_list args;
char msg[MAXSTRING];
+ int ret;
/* one-time initialization; a little race here is fine */
if (!logging.initialized)
@@ -162,7 +163,9 @@ _eglLog(EGLint level, const char *fmtStr, ...)
if (logging.logger) {
va_start(args, fmtStr);
- vsnprintf(msg, MAXSTRING, fmtStr, args);
+ ret = vsnprintf(msg, MAXSTRING, fmtStr, args);
+ if (ret < 0 || ret >= MAXSTRING)
+ strcpy(msg, "<message truncated>");
va_end(args);
logging.logger(level, msg);