[Mesa-dev] [PATCH 1/3] draw: account for elem size when computing overflow

Jose Fonseca jfonseca at vmware.com
Wed Jun 26 05:18:59 PDT 2013



----- Original Message -----
> We weren't taking into account the size of element
> that is to be fetched, which meant that it was possible
> to overflow the buffer reads if the stride was very
> close to the end of the buffer, e.g. stride = 3, buffer
> size = 4, and the element to be read = 4. This should
> be properly detected as an overflow.

Looks good.


> Signed-off-by: Zack Rusin <zackr at vmware.com>
> ---
>  src/gallium/auxiliary/draw/draw_llvm.c |   30 +++++++++++++++++++++++-------
>  1 file changed, 23 insertions(+), 7 deletions(-)
> 
> diff --git a/src/gallium/auxiliary/draw/draw_llvm.c
> b/src/gallium/auxiliary/draw/draw_llvm.c
> index 5373d1a..f27776a 100644
> --- a/src/gallium/auxiliary/draw/draw_llvm.c
> +++ b/src/gallium/auxiliary/draw/draw_llvm.c
> @@ -695,6 +695,7 @@ generate_fetch(struct gallivm_state *gallivm,
>     LLVMValueRef buffer_size = draw_jit_dvbuffer_size(gallivm, vbuffer_ptr);
>     LLVMValueRef stride;
>     LLVMValueRef buffer_overflowed;
> +   LLVMValueRef needed_buffer_size;
>     LLVMValueRef temp_ptr =
>        lp_build_alloca(gallivm,
>                        lp_build_vec_type(gallivm, lp_float32_vec4_type()),
>                        "");
> @@ -715,15 +716,30 @@ generate_fetch(struct gallivm_state *gallivm,
>     stride = LLVMBuildAdd(builder, stride,
>                           lp_build_const_int32(gallivm, velem->src_offset),
>                           "");
> -
> -   buffer_overflowed = LLVMBuildICmp(builder, LLVMIntUGE,
> -                                     stride, buffer_size,
> +   needed_buffer_size = LLVMBuildAdd(
> +      builder, stride,
> +      lp_build_const_int32(gallivm,
> +                           util_format_get_blocksize(velem->src_format)),
> +      "");
> +
> +   buffer_overflowed = LLVMBuildICmp(builder, LLVMIntUGT,
> +                                     needed_buffer_size, buffer_size,
>                                       "buffer_overflowed");
> -   /*
> -   lp_build_printf(gallivm, "vbuf index = %u, stride is %u\n", index,
> stride);
> -   lp_build_print_value(gallivm, "   buffer size = ", buffer_size);
> +#if 0

I think it is preferable to use if (0) { ... } for this sort of debugging statements, as it allows compilers to ensure the code doesn't rot, and most editors also tend to highlight this as comment.

> +   lp_build_printf(gallivm, "vbuf index = %u, vb_stride is %u\n",
> +                   index, vb_stride);
> +   lp_build_printf(gallivm, "   vb_buffer_offset = %u, src_offset is %u\n",
> +                   vb_buffer_offset,
> +                   lp_build_const_int32(gallivm, velem->src_offset));
> +   lp_build_print_value(gallivm, "   blocksize = ",
> +                        lp_build_const_int32(
> +                           gallivm,
> +                           util_format_get_blocksize(velem->src_format)));
> +   lp_build_printf(gallivm, "   stride = %u\n", stride);
> +   lp_build_printf(gallivm, "   buffer size = %u\n", buffer_size);
> +   lp_build_printf(gallivm, "   needed_buffer_size = %u\n",
> needed_buffer_size);
>     lp_build_print_value(gallivm, "   buffer overflowed = ",
>     buffer_overflowed);
> -   */
> +#endif
>  
>     lp_build_if(&if_ctx, gallivm, buffer_overflowed);
>     {
> --
> 1.7.10.4


Jose
> 


More information about the mesa-dev mailing list