freedreno: reject imports with bogus pitch

Signed-off-by: Rob Clark <robdclark@gmail.com>
This commit is contained in:
Rob Clark 2016-09-03 12:57:50 -04:00
parent b4e88b500c
commit 32c061b110
3 changed files with 7 additions and 8 deletions

View File

@ -898,15 +898,18 @@ fd_resource_from_handle(struct pipe_screen *pscreen,
util_range_init(&rsc->valid_buffer_range); util_range_init(&rsc->valid_buffer_range);
rsc->bo = fd_screen_bo_from_handle(pscreen, handle, &slice->pitch); rsc->bo = fd_screen_bo_from_handle(pscreen, handle);
if (!rsc->bo) if (!rsc->bo)
goto fail; goto fail;
rsc->base.vtbl = &fd_resource_vtbl; rsc->base.vtbl = &fd_resource_vtbl;
rsc->cpp = util_format_get_blocksize(tmpl->format); rsc->cpp = util_format_get_blocksize(tmpl->format);
slice->pitch /= rsc->cpp; slice->pitch = handle->stride / rsc->cpp;
slice->offset = handle->offset; slice->offset = handle->offset;
if ((slice->pitch < align(prsc->width0, 32)) || (slice->pitch % 32))
goto fail;
assert(rsc->cpp); assert(rsc->cpp);
return prsc; return prsc;

View File

@ -536,8 +536,7 @@ fd_screen_bo_get_handle(struct pipe_screen *pscreen,
struct fd_bo * struct fd_bo *
fd_screen_bo_from_handle(struct pipe_screen *pscreen, fd_screen_bo_from_handle(struct pipe_screen *pscreen,
struct winsys_handle *whandle, struct winsys_handle *whandle)
unsigned *out_stride)
{ {
struct fd_screen *screen = fd_screen(pscreen); struct fd_screen *screen = fd_screen(pscreen);
struct fd_bo *bo; struct fd_bo *bo;
@ -558,8 +557,6 @@ fd_screen_bo_from_handle(struct pipe_screen *pscreen,
return NULL; return NULL;
} }
*out_stride = whandle->stride;
return bo; return bo;
} }

View File

@ -86,8 +86,7 @@ boolean fd_screen_bo_get_handle(struct pipe_screen *pscreen,
unsigned stride, unsigned stride,
struct winsys_handle *whandle); struct winsys_handle *whandle);
struct fd_bo * fd_screen_bo_from_handle(struct pipe_screen *pscreen, struct fd_bo * fd_screen_bo_from_handle(struct pipe_screen *pscreen,
struct winsys_handle *whandle, struct winsys_handle *whandle);
unsigned *out_stride);
struct pipe_screen * fd_screen_create(struct fd_device *dev); struct pipe_screen * fd_screen_create(struct fd_device *dev);