From 8de0452ec4d96837846fffc65bc01a56103b9ed5 Mon Sep 17 00:00:00 2001 From: Deepak Rawat Date: Mon, 3 Apr 2017 08:12:43 -0700 Subject: [PATCH] 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 --- src/gallium/winsys/svga/drm/vmw_screen_svga.c | 33 ++++++++++--------- 1 file 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; + } } /* -- 2.30.2