From 847ef8ee4f0889be651f12ad5bbc7e43a177431a Mon Sep 17 00:00:00 2001 From: Kenneth Graunke Date: Thu, 27 Jun 2019 17:16:20 -0700 Subject: [PATCH] iris: Don't leak resources in iris_create_surface for incomplete FBOs We were failing to pipe_resource_unreference on the failure path due to a non-renderable format. Instead of fixing this, just move the checks earlier, before we even bother with refcounting or calloc. --- src/gallium/drivers/iris/iris_state.c | 38 +++++++++++++++++------------------ 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/src/gallium/drivers/iris/iris_state.c b/src/gallium/drivers/iris/iris_state.c index e09a3dd..cc59fda 100644 --- a/src/gallium/drivers/iris/iris_state.c +++ b/src/gallium/drivers/iris/iris_state.c @@ -1874,23 +1874,6 @@ iris_create_surface(struct pipe_context *ctx, struct iris_context *ice = (struct iris_context *) ctx; struct iris_screen *screen = (struct iris_screen *)ctx->screen; const struct gen_device_info *devinfo = &screen->devinfo; - struct iris_surface *surf = calloc(1, sizeof(struct iris_surface)); - struct pipe_surface *psurf = &surf->base; - struct iris_resource *res = (struct iris_resource *) tex; - - if (!surf) - return NULL; - - pipe_reference_init(&psurf->reference, 1); - pipe_resource_reference(&psurf->texture, tex); - psurf->context = ctx; - psurf->format = tmpl->format; - psurf->width = tex->width0; - psurf->height = tex->height0; - psurf->texture = tex; - psurf->u.tex.first_layer = tmpl->u.tex.first_layer; - psurf->u.tex.last_layer = tmpl->u.tex.last_layer; - psurf->u.tex.level = tmpl->u.tex.level; isl_surf_usage_flags_t usage = 0; if (tmpl->writable) @@ -1901,7 +1884,7 @@ iris_create_surface(struct pipe_context *ctx, usage = ISL_SURF_USAGE_RENDER_TARGET_BIT; const struct iris_format_info fmt = - iris_format_for_usage(devinfo, psurf->format, usage); + iris_format_for_usage(devinfo, tmpl->format, usage); if ((usage & ISL_SURF_USAGE_RENDER_TARGET_BIT) && !isl_format_supports_rendering(devinfo, fmt.fmt)) { @@ -1909,10 +1892,27 @@ iris_create_surface(struct pipe_context *ctx, * hasn't had the opportunity yet. In the meantime, we need to * avoid hitting ISL asserts about unsupported formats below. */ - free(surf); return NULL; } + struct iris_surface *surf = calloc(1, sizeof(struct iris_surface)); + struct pipe_surface *psurf = &surf->base; + struct iris_resource *res = (struct iris_resource *) tex; + + if (!surf) + return NULL; + + pipe_reference_init(&psurf->reference, 1); + pipe_resource_reference(&psurf->texture, tex); + psurf->context = ctx; + psurf->format = tmpl->format; + psurf->width = tex->width0; + psurf->height = tex->height0; + psurf->texture = tex; + psurf->u.tex.first_layer = tmpl->u.tex.first_layer; + psurf->u.tex.last_layer = tmpl->u.tex.last_layer; + psurf->u.tex.level = tmpl->u.tex.level; + struct isl_view *view = &surf->view; *view = (struct isl_view) { .format = fmt.fmt, -- 2.7.4