diff options
author | Deepak Rawat <[email protected]> | 2017-04-03 08:12:43 -0700 |
---|---|---|
committer | Brian Paul <[email protected]> | 2017-04-26 11:37:59 -0600 |
commit | 8de0452ec4d96837846fffc65bc01a56103b9ed5 (patch) | |
tree | 8bb0e47203dcd86626b98dc5e49b17a5035fe0e5 | |
parent | 75be43ed33e7ce01d74bb294c41feec821ecf685 (diff) |
winsys/svga: fix error path when kernel is not able to create surface
If for some reason kernel is not able to create surface,
when no buffer was provided the function
vmw_svga_winsys_surface_create should return NULL.
This patch fixes the issue where the code was not following the
clean up path in case of error, which used to cause SIGSEGV.
Reviewed-by: Sinclair Yeh <[email protected]>
-rw-r--r-- | src/gallium/winsys/svga/drm/vmw_screen_svga.c | 33 |
1 files changed, 18 insertions, 15 deletions
diff --git a/src/gallium/winsys/svga/drm/vmw_screen_svga.c b/src/gallium/winsys/svga/drm/vmw_screen_svga.c index 31cbda9af6f..9312f88740c 100644 --- a/src/gallium/winsys/svga/drm/vmw_screen_svga.c +++ b/src/gallium/winsys/svga/drm/vmw_screen_svga.c @@ -200,22 +200,25 @@ vmw_svga_winsys_surface_create(struct svga_winsys_screen *sws, surface->buf ? NULL : &desc.region); - if (surface->sid == SVGA3D_INVALID_ID && surface->buf) { - - /* - * Kernel refused to allocate a surface for us. - * Perhaps something was wrong with our buffer? - * This is really a guard against future new size requirements - * on the backing buffers. - */ - vmw_svga_winsys_buffer_destroy(sws, surface->buf); - surface->buf = NULL; - surface->sid = vmw_ioctl_gb_surface_create(vws, flags, format, usage, - size, numLayers, - numMipLevels, sampleCount, - 0, &desc.region); - if (surface->sid == SVGA3D_INVALID_ID) + if (surface->sid == SVGA3D_INVALID_ID) { + if (surface->buf == NULL) { goto no_sid; + } else { + /* + * Kernel refused to allocate a surface for us. + * Perhaps something was wrong with our buffer? + * This is really a guard against future new size requirements + * on the backing buffers. + */ + vmw_svga_winsys_buffer_destroy(sws, surface->buf); + surface->buf = NULL; + surface->sid = vmw_ioctl_gb_surface_create(vws, flags, format, usage, + size, numLayers, + numMipLevels, sampleCount, + 0, &desc.region); + if (surface->sid == SVGA3D_INVALID_ID) + goto no_sid; + } } /* |