[Mesa-dev] [PATCH] mesa: Fix return type of _mesa_get_format_bytes() (#37351)

Ian Romanick idr at freedesktop.org
Thu May 19 23:16:48 PDT 2011


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On 05/19/2011 08:14 PM, Adam Jackson wrote:
> Despite that negative values aren't sensible here, making this unsigned
> is dangerous.  Consider get_pointer_generic, which computes a value of
> the form:
> 
>     void *base + (int x * int stride + int y) * unsigned bpp
> 
> The usual arithmetic conversions will coerce the (x*stride + y)
> subexpression to unsigned.  Since stride can be negative, this is
> disastrous.
> 
> Fixes at least the following piglit tests on Ironlake:
> 
>     fbo/fbo-blit-d24s8
>     spec/ARB_depth_texture/fbo-clear-formats
>     spec/EXT_packed_depth_stencil/fbo-clear-formats
> 
> Signed-off-by: Adam Jackson <ajax at redhat.com>

I don't care which approach we go with.  This will likely fix it
everywhere, but I'd like there to be a comment explaining why the return
type must not be unsigned.  Otherwise someone will come along in the
future and make it unsigned in the name of "code cleanup."

> ---
>  src/mesa/main/formats.c |    2 +-
>  src/mesa/main/formats.h |    2 +-
>  2 files changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/src/mesa/main/formats.c b/src/mesa/main/formats.c
> index 60e8ae3..a46633b 100644
> --- a/src/mesa/main/formats.c
> +++ b/src/mesa/main/formats.c
> @@ -1119,7 +1119,7 @@ _mesa_get_format_name(gl_format format)
>   * Normally, a block is 1x1 (a single pixel).  But for compressed formats
>   * a block may be 4x4 or 8x4, etc.
>   */
> -GLuint
> +GLint
>  _mesa_get_format_bytes(gl_format format)
>  {
>     const struct gl_format_info *info = _mesa_get_format_info(format);
> diff --git a/src/mesa/main/formats.h b/src/mesa/main/formats.h
> index df9ed70..0640bbc 100644
> --- a/src/mesa/main/formats.h
> +++ b/src/mesa/main/formats.h
> @@ -216,7 +216,7 @@ typedef enum
>  extern const char *
>  _mesa_get_format_name(gl_format format);
>  
> -extern GLuint
> +extern GLint
>  _mesa_get_format_bytes(gl_format format);
>  
>  extern GLint
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
Comment: Using GnuPG with Fedora - http://enigmail.mozdev.org/

iEYEARECAAYFAk3WB0YACgkQX1gOwKyEAw/VVwCeM2EGDlT7pf0zImg++KBQMQ0Y
8zEAniTakBqiEAj0mxCFNypyJ86EhGyl
=NP7k
-----END PGP SIGNATURE-----


More information about the mesa-dev mailing list