diff options
author | Thomas Hellstrom <thellstrom@vmware.com> | 2014-07-03 02:07:36 -0700 |
---|---|---|
committer | Carl Worth <cworth@cworth.org> | 2014-07-03 18:42:46 -0700 |
commit | ff02e7995c09278be06c34d596d3d8ca11e26ded (patch) | |
tree | bf87e6ae346e559cf2aea2026773f6ce6c465bb2 /src/gallium/state_trackers | |
parent | ee4274c393632e44cafa7392f4e89425f104bbba (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>
(cherry picked from commit 35cf3831d71770211f29da6608313dc1f6213d7b)
Conflicts:
src/gallium/state_trackers/xa/xa_tracker.c
Diffstat (limited to 'src/gallium/state_trackers')
-rw-r--r-- | src/gallium/state_trackers/xa/xa_tracker.c | 7 |
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 9add5843c73..be16964c1f6 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,11 +141,15 @@ 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; - 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); if (!xa->screen) goto out_no_screen; |