Browse Source

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 <mesa-stable@lists.freedesktop.org>
tags/18.3-branchpoint
Josh Pieper 7 years ago
parent
commit
936e0dcd61
1 changed files with 12 additions and 8 deletions
  1. 12
    8
      src/mesa/state_tracker/st_cb_drawpixels.c

+ 12
- 8
src/mesa/state_tracker/st_cb_drawpixels.c View File

@@ -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]) {

Loading…
Cancel
Save