summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDeepak Rawat <drawat@vmware.com>2017-04-03 08:12:43 -0700
committerBrian Paul <brianp@vmware.com>2017-04-26 11:37:59 -0600
commit8de0452ec4d96837846fffc65bc01a56103b9ed5 (patch)
tree8bb0e47203dcd86626b98dc5e49b17a5035fe0e5
parent75be43ed33e7ce01d74bb294c41feec821ecf685 (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 <syeh@vmware.com>
-rw-r--r--src/gallium/winsys/svga/drm/vmw_screen_svga.c33
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;
+ }
}
/*