aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEmil Velikov <[email protected]>2016-05-14 16:33:10 +0100
committerEmil Velikov <[email protected]>2016-05-23 12:07:46 +0100
commit6e00a1e6cba7b32e575521c7a92aae18761e0a37 (patch)
treed68ac1fe86c0b71a7a8e41941378105a54b750d1
parent7362bb3e219ec819835799c400cf4215a1b387d0 (diff)
st/dri: don't call close(-1) in dri{2, kms_}_init_screen error path
Add separate labels and jump to the correct one as needed. Signed-off-by: Emil Velikov <[email protected]> Reviewed-by: Leo Liu <[email protected]>
-rw-r--r--src/gallium/state_trackers/dri/dri2.c30
1 files changed, 20 insertions, 10 deletions
diff --git a/src/gallium/state_trackers/dri/dri2.c b/src/gallium/state_trackers/dri/dri2.c
index 6b3acdefb15..b07cfcb3064 100644
--- a/src/gallium/state_trackers/dri/dri2.c
+++ b/src/gallium/state_trackers/dri/dri2.c
@@ -1755,7 +1755,7 @@ dri2_init_screen(__DRIscreen * sPriv)
struct pipe_screen *pscreen = NULL;
const struct drm_conf_ret *throttle_ret;
const struct drm_conf_ret *dmabuf_ret;
- int fd = -1;
+ int fd;
screen = CALLOC_STRUCT(dri_screen);
if (!screen)
@@ -1768,13 +1768,13 @@ dri2_init_screen(__DRIscreen * sPriv)
sPriv->driverPrivate = (void *)screen;
if (screen->fd < 0 || (fd = dup(screen->fd)) < 0)
- goto fail;
+ goto free_screen;
if (pipe_loader_drm_probe_fd(&screen->dev, fd))
pscreen = pipe_loader_create_screen(screen->dev);
if (!pscreen)
- goto fail;
+ goto release_pipe;
throttle_ret = pipe_loader_configuration(screen->dev, DRM_CONF_THROTTLE);
dmabuf_ret = pipe_loader_configuration(screen->dev, DRM_CONF_SHARE_FD);
@@ -1803,7 +1803,7 @@ dri2_init_screen(__DRIscreen * sPriv)
configs = dri_init_screen_helper(screen, pscreen, screen->dev->driver_name);
if (!configs)
- goto fail;
+ goto destroy_screen;
screen->can_share_buffer = true;
screen->auto_fake_front = dri_with_format(sPriv);
@@ -1811,12 +1811,17 @@ dri2_init_screen(__DRIscreen * sPriv)
screen->lookup_egl_image = dri2_lookup_egl_image;
return configs;
-fail:
+
+destroy_screen:
dri_destroy_screen_helper(screen);
+
+release_pipe:
if (screen->dev)
pipe_loader_release(&screen->dev, 1);
else
close(fd);
+
+free_screen:
FREE(screen);
return NULL;
}
@@ -1834,7 +1839,7 @@ dri_kms_init_screen(__DRIscreen * sPriv)
struct dri_screen *screen;
struct pipe_screen *pscreen = NULL;
uint64_t cap;
- int fd = -1;
+ int fd;
screen = CALLOC_STRUCT(dri_screen);
if (!screen)
@@ -1846,13 +1851,13 @@ dri_kms_init_screen(__DRIscreen * sPriv)
sPriv->driverPrivate = (void *)screen;
if (screen->fd < 0 || (fd = dup(screen->fd)) < 0)
- goto fail;
+ goto free_screen;
if (pipe_loader_sw_probe_kms(&screen->dev, fd))
pscreen = pipe_loader_create_screen(screen->dev);
if (!pscreen)
- goto fail;
+ goto release_pipe;
if (drmGetCap(sPriv->fd, DRM_CAP_PRIME, &cap) == 0 &&
(cap & DRM_PRIME_CAP_IMPORT)) {
@@ -1864,7 +1869,7 @@ dri_kms_init_screen(__DRIscreen * sPriv)
configs = dri_init_screen_helper(screen, pscreen, "swrast");
if (!configs)
- goto fail;
+ goto destroy_screen;
screen->can_share_buffer = false;
screen->auto_fake_front = dri_with_format(sPriv);
@@ -1872,12 +1877,17 @@ dri_kms_init_screen(__DRIscreen * sPriv)
screen->lookup_egl_image = dri2_lookup_egl_image;
return configs;
-fail:
+
+destroy_screen:
dri_destroy_screen_helper(screen);
+
+release_pipe:
if (screen->dev)
pipe_loader_release(&screen->dev, 1);
else
close(fd);
+
+free_screen:
FREE(screen);
#endif // GALLIUM_SOFTPIPE
return NULL;