st/vdpau: fix bogus error handling in output/bitmap creation
authorIlia Mirkin <imirkin@alum.mit.edu>
Sat, 18 Jan 2014 03:25:34 +0000 (22:25 -0500)
committerIlia Mirkin <imirkin@alum.mit.edu>
Mon, 20 Jan 2014 01:02:10 +0000 (20:02 -0500)
Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
Reviewed-by: Christian König <christian.koenig@amd.com>
src/gallium/state_trackers/vdpau/bitmap.c
src/gallium/state_trackers/vdpau/output.c

index 2d69ead221ac2fc2e6b905e4cf12e2396ddde824..87def5042eb09adcdfbc2c30e932444bd551a281 100644 (file)
@@ -45,6 +45,7 @@ vlVdpBitmapSurfaceCreate(VdpDevice device,
    struct pipe_context *pipe;
    struct pipe_resource res_tmpl, *res;
    struct pipe_sampler_view sv_templ;
+   VdpStatus ret;
 
    vlVdpBitmapSurface *vlsurface = NULL;
 
@@ -81,30 +82,37 @@ vlVdpBitmapSurfaceCreate(VdpDevice device,
    pipe_mutex_lock(dev->mutex);
    res = pipe->screen->resource_create(pipe->screen, &res_tmpl);
    if (!res) {
-      pipe_mutex_unlock(dev->mutex);
-      FREE(dev);
-      FREE(vlsurface);
-      return VDP_STATUS_RESOURCES;
+      ret = VDP_STATUS_RESOURCES;
+      goto err_unlock;
    }
 
    vlVdpDefaultSamplerViewTemplate(&sv_templ, res);
    vlsurface->sampler_view = pipe->create_sampler_view(pipe, res, &sv_templ);
 
    pipe_resource_reference(&res, NULL);
-   pipe_mutex_unlock(dev->mutex);
 
    if (!vlsurface->sampler_view) {
-      FREE(dev);
-      return VDP_STATUS_RESOURCES;
+      ret = VDP_STATUS_RESOURCES;
+      goto err_unlock;
    }
 
+   pipe_mutex_unlock(dev->mutex);
+
    *surface = vlAddDataHTAB(vlsurface);
    if (*surface == 0) {
-      FREE(dev);
-      return VDP_STATUS_ERROR;
+      pipe_mutex_lock(dev->mutex);
+      ret = VDP_STATUS_ERROR;
+      goto err_sampler;
    }
 
    return VDP_STATUS_OK;
+
+err_sampler:
+   pipe_sampler_view_reference(&vlsurface->sampler_view, NULL);
+err_unlock:
+   pipe_mutex_unlock(dev->mutex);
+   FREE(vlsurface);
+   return ret;
 }
 
 /**
index e569c86c50122227df177f62f875c7d9280198a2..ecf15796df513d4a914de95d193c2a1d502cf532 100644 (file)
@@ -84,40 +84,24 @@ vlVdpOutputSurfaceCreate(VdpDevice device,
 
    pipe_mutex_lock(dev->mutex);
    res = pipe->screen->resource_create(pipe->screen, &res_tmpl);
-   if (!res) {
-      pipe_mutex_unlock(dev->mutex);
-      FREE(dev);
-      FREE(vlsurface);
-      return VDP_STATUS_ERROR;
-   }
+   if (!res)
+      goto err_unlock;
 
    vlVdpDefaultSamplerViewTemplate(&sv_templ, res);
    vlsurface->sampler_view = pipe->create_sampler_view(pipe, res, &sv_templ);
-   if (!vlsurface->sampler_view) {
-      pipe_resource_reference(&res, NULL);
-      pipe_mutex_unlock(dev->mutex);
-      FREE(dev);
-      return VDP_STATUS_ERROR;
-   }
+   if (!vlsurface->sampler_view)
+      goto err_resource;
 
    memset(&surf_templ, 0, sizeof(surf_templ));
    surf_templ.format = res->format;
    vlsurface->surface = pipe->create_surface(pipe, res, &surf_templ);
-   if (!vlsurface->surface) {
-      pipe_resource_reference(&res, NULL);
-      pipe_mutex_unlock(dev->mutex);
-      FREE(dev);
-      return VDP_STATUS_ERROR;
-   }
+   if (!vlsurface->surface)
+      goto err_resource;
 
    *surface = vlAddDataHTAB(vlsurface);
-   if (*surface == 0) {
-      pipe_resource_reference(&res, NULL);
-      pipe_mutex_unlock(dev->mutex);
-      FREE(dev);
-      return VDP_STATUS_ERROR;
-   }
-   
+   if (*surface == 0)
+      goto err_resource;
+
    pipe_resource_reference(&res, NULL);
 
    vl_compositor_init_state(&vlsurface->cstate, pipe);
@@ -125,6 +109,15 @@ vlVdpOutputSurfaceCreate(VdpDevice device,
    pipe_mutex_unlock(dev->mutex);
 
    return VDP_STATUS_OK;
+
+err_resource:
+   pipe_sampler_view_reference(&vlsurface->sampler_view, NULL);
+   pipe_surface_reference(&vlsurface->surface, NULL);
+   pipe_surface_reference(&res, NULL);
+err_unlock:
+   pipe_mutex_unlock(dev->mutex);
+   FREE(vlsurface);
+   return VDP_STATUS_ERROR;
 }
 
 /**