summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorThomas Hellstrom <thellstrom@vmware.com>2014-07-03 02:07:36 -0700
committerThomas Hellstrom <thellstrom@vmware.com>2014-07-03 02:55:00 -0700
commit35cf3831d71770211f29da6608313dc1f6213d7b (patch)
tree2c73b28bfbdc96025038ca6c31d264fd03095d49 /src
parent370184e813b25b463ad3dc9ca814231c98b95864 (diff)
st/xa: Don't close the drm fd on failure v2
If XA fails to initialize with pipe_loader enabled, the pipe_loader's cleanup function will close the drm file descriptor. That's pretty bad because the file descriptor will probably be the X server driver's only connection to drm. Temporarily solve this by dup()'ing the file descriptor before handing it over to the pipe loader. This fixes freedesktop.org bugzilla bug #80645. v2: Fix CC addresses. Cc: "10.2" <mesa-stable@lists.freedesktop.org> Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com> Reviewed-by: Jakob Bornecrantz <jakob@vmware.com>
Diffstat (limited to 'src')
-rw-r--r--src/gallium/state_trackers/xa/xa_tracker.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/src/gallium/state_trackers/xa/xa_tracker.c b/src/gallium/state_trackers/xa/xa_tracker.c
index 6e4312e0079..268d56b0a16 100644
--- a/src/gallium/state_trackers/xa/xa_tracker.c
+++ b/src/gallium/state_trackers/xa/xa_tracker.c
@@ -26,6 +26,7 @@
* Thomas Hellstrom <thellstrom-at-vmware-dot-com>
*/
+#include <unistd.h>
#include "xa_tracker.h"
#include "xa_priv.h"
#include "pipe/p_state.h"
@@ -140,6 +141,7 @@ xa_tracker_create(int drm_fd)
struct xa_tracker *xa = calloc(1, sizeof(struct xa_tracker));
enum xa_surface_type stype;
unsigned int num_formats;
+ int loader_fd;
if (!xa)
return NULL;
@@ -147,7 +149,10 @@ xa_tracker_create(int drm_fd)
#if GALLIUM_STATIC_TARGETS
xa->screen = dd_create_screen(drm_fd);
#else
- if (pipe_loader_drm_probe_fd(&xa->dev, drm_fd, false))
+ loader_fd = dup(drm_fd);
+ if (loader_fd == -1)
+ return NULL;
+ if (pipe_loader_drm_probe_fd(&xa->dev, loader_fd, false))
xa->screen = pipe_loader_create_screen(xa->dev, PIPE_SEARCH_DIR);
#endif
if (!xa->screen)