summaryrefslogtreecommitdiffstats
path: root/src/mesa
diff options
context:
space:
mode:
authorJosh Pieper <[email protected]>2018-09-09 22:03:27 -0400
committerMarek Olšák <[email protected]>2018-09-14 21:05:37 -0400
commit936e0dcd619bc092b9869b4be2e1b20c3631131f (patch)
tree9836ba8c1957992b3325f338c57a8b42df62f0ad /src/mesa
parentc79aad30ae1f89dfb392f7cbe0f971939629c520 (diff)
st/mesa: Validate the result of pipe_transfer_map in make_texture (v2)
When using Freecad, I was getting intermittent segfaults inside of mesa. I traced it down to this path in st_cb_drawpixels.c where the result of pipe_transfer_map wasn't being checked. In my case, it was returning NULL because nouveau_bo_new returned ENOENT. I'm by no means a mesa developer, but this patch solves the problem for me and seems reasonable enough. v2: Marek - also unmap the PBO and release the texture, and call the make_texture function sooner for less cleanup Cc: 18.1 18.2 <[email protected]>
Diffstat (limited to 'src/mesa')
-rw-r--r--src/mesa/state_tracker/st_cb_drawpixels.c20
1 files changed, 12 insertions, 8 deletions
diff --git a/src/mesa/state_tracker/st_cb_drawpixels.c b/src/mesa/state_tracker/st_cb_drawpixels.c
index cb50b7104a0..4f08e751393 100644
--- a/src/mesa/state_tracker/st_cb_drawpixels.c
+++ b/src/mesa/state_tracker/st_cb_drawpixels.c
@@ -566,7 +566,11 @@ make_texture(struct st_context *st,
dest = pipe_transfer_map(pipe, pt, 0, 0,
PIPE_TRANSFER_WRITE, 0, 0,
width, height, &transfer);
-
+ if (!dest) {
+ pipe_resource_reference(&pt, NULL);
+ _mesa_unmap_pbo_source(ctx, unpack);
+ return NULL;
+ }
/* Put image into texture transfer.
* Note that the image is actually going to be upside down in
@@ -1174,6 +1178,13 @@ st_DrawPixels(struct gl_context *ctx, GLint x, GLint y,
return;
}
+ /* Put glDrawPixels image into a texture */
+ pt = make_texture(st, width, height, format, type, unpack, pixels);
+ if (!pt) {
+ _mesa_error(ctx, GL_OUT_OF_MEMORY, "glDrawPixels");
+ return;
+ }
+
/*
* Get vertex/fragment shaders
*/
@@ -1200,13 +1211,6 @@ st_DrawPixels(struct gl_context *ctx, GLint x, GLint y,
st_upload_constants(st, &st->fp->Base);
}
- /* Put glDrawPixels image into a texture */
- pt = make_texture(st, width, height, format, type, unpack, pixels);
- if (!pt) {
- _mesa_error(ctx, GL_OUT_OF_MEMORY, "glDrawPixels");
- return;
- }
-
/* create sampler view for the image */
sv[0] = st_create_texture_sampler_view(st->pipe, pt);
if (!sv[0]) {