[Mesa-dev] [PATCH] gallivm: fix out-of-bounds access with mirror_clamp_to_edge address mode
Jose Fonseca
jfonseca at vmware.com
Sat Jun 1 04:27:26 PDT 2013
Looks great to me.
Jose
----- Original Message -----
> From: Roland Scheidegger <sroland at vmware.com>
>
> Surprising this bug survived so long, we were missing a clamp (in the
> linear filtering version).
> (Valgrind complained a lot about invalid reads with piglit texwrap,
> I've also seen spurios failures in this test which might have
> happened due to this. Valgrind probably didn't complain before the
> alignment reduction in llvmpipe to 4x4 since the test is using tiny
> textures so the reads were still always well within allocated area.)
> While here, also do an effective clamp (after half subtraction)
> of [0,length-0.5] instead of [0, length-1] which saves an instruction
> (the filtering weight could be different due to this, but only if
> both texels point to the same max texel so it doesn't matter).
> (Both changes are borrowed from PIPE_TEX_CLAMP_TO_EDGE case.)
>
> Note: This is a candidate for the stable branches.
> ---
> src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c | 13 +++++++------
> 1 file changed, 7 insertions(+), 6 deletions(-)
>
> diff --git a/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c
> b/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c
> index 7ac0029..e0a59d0 100644
> --- a/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c
> +++ b/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c
> @@ -436,7 +436,6 @@ lp_build_sample_wrap_linear(struct
> lp_build_sample_context *bld,
>
> case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_EDGE:
> {
> - LLVMValueRef min, max;
> struct lp_build_context abs_coord_bld = bld->coord_bld;
> abs_coord_bld.type.sign = FALSE;
>
> @@ -450,16 +449,18 @@ lp_build_sample_wrap_linear(struct
> lp_build_sample_context *bld,
> }
> coord = lp_build_abs(coord_bld, coord);
>
> - /* clamp to [0.5, length - 0.5] */
> - min = half;
> - max = lp_build_sub(coord_bld, length_f, min);
> - coord = lp_build_clamp(coord_bld, coord, min, max);
> -
> + /* clamp to length max */
> + coord = lp_build_min(coord_bld, coord, length_f);
> + /* subtract 0.5 */
> coord = lp_build_sub(coord_bld, coord, half);
> + /* clamp to [0, length - 0.5] */
> + coord = lp_build_max(coord_bld, coord, coord_bld->zero);
>
> /* convert to int, compute lerp weight */
> lp_build_ifloor_fract(&abs_coord_bld, coord, &coord0, &weight);
> coord1 = lp_build_add(int_coord_bld, coord0, int_coord_bld->one);
> + /* coord1 = min(coord1, length-1) */
> + coord1 = lp_build_min(int_coord_bld, coord1, length_minus_one);
> }
> break;
>
> --
> 1.7.9.5
>
More information about the mesa-dev
mailing list