[PATCH v2 vkd3d] vkd3d-shader/hlsl: Handle over/underflow when parsing integer literals.
Giovanni Mascellani
gmascellani at codeweavers.com
Thu May 12 08:53:53 CDT 2022
Signed-off-by: Giovanni Mascellani <gmascellani at codeweavers.com>
Il 11/05/22 16:39, Matteo Bruni ha scritto:
> Signed-off-by: Matteo Bruni <mbruni at codeweavers.com>
> ---
> v2: Don't duplicate parse_integer().
>
> Supersedes 235242.
>
> This fixes arithmetic-int.shader_test on 32-bit Linux for
> me.
>
> libs/vkd3d-shader/hlsl.l | 6 ++---
> libs/vkd3d-shader/preproc.y | 34 +-----------------------
> libs/vkd3d-shader/vkd3d_shader_main.c | 32 ++++++++++++++++++++++
> libs/vkd3d-shader/vkd3d_shader_private.h | 2 ++
> 4 files changed, 38 insertions(+), 36 deletions(-)
>
> diff --git a/libs/vkd3d-shader/hlsl.l b/libs/vkd3d-shader/hlsl.l
> index 267c8c30..ff7b712f 100644
> --- a/libs/vkd3d-shader/hlsl.l
> +++ b/libs/vkd3d-shader/hlsl.l
> @@ -197,15 +197,15 @@ row_major {return KW_ROW_MAJOR; }
> return C_FLOAT;
> }
> 0x[0-9a-fA-F]+ {
> - sscanf(yytext, "0x%x", &yylval->intval);
> + yylval->intval = vkd3d_parse_integer(yytext);
> return C_INTEGER;
> }
> 0[0-7]+ {
> - sscanf(yytext, "0%o", &yylval->intval);
> + yylval->intval = vkd3d_parse_integer(yytext);
> return C_INTEGER;
> }
> [0-9]+ {
> - yylval->intval = (atoi(yytext));
> + yylval->intval = vkd3d_parse_integer(yytext);
> return C_INTEGER;
> }
>
> diff --git a/libs/vkd3d-shader/preproc.y b/libs/vkd3d-shader/preproc.y
> index 3f02ac03..009c35ff 100644
> --- a/libs/vkd3d-shader/preproc.y
> +++ b/libs/vkd3d-shader/preproc.y
> @@ -165,38 +165,6 @@ static bool preproc_push_if(struct preproc_ctx *ctx, bool condition)
> return true;
> }
>
> -static int char_to_int(char c)
> -{
> - if ('0' <= c && c <= '9')
> - return c - '0';
> - if ('A' <= c && c <= 'F')
> - return c - 'A' + 10;
> - if ('a' <= c && c <= 'f')
> - return c - 'a' + 10;
> - return -1;
> -}
> -
> -static uint32_t preproc_parse_integer(const char *s)
> -{
> - uint32_t base = 10, ret = 0;
> - int digit;
> -
> - if (*s == '0')
> - {
> - base = 8;
> - ++s;
> - if (*s == 'x' || *s == 'X')
> - {
> - base = 16;
> - ++s;
> - }
> - }
> -
> - while ((digit = char_to_int(*s++)) >= 0)
> - ret = ret * base + (uint32_t)digit;
> - return ret;
> -}
> -
> static int default_open_include(const char *filename, bool local,
> const char *parent_data, void *context, struct vkd3d_shader_code *out)
> {
> @@ -691,7 +659,7 @@ directive
> primary_expr
> : T_INTEGER
> {
> - $$ = preproc_parse_integer($1);
> + $$ = vkd3d_parse_integer($1);
> vkd3d_free($1);
> }
> | T_IDENTIFIER
> diff --git a/libs/vkd3d-shader/vkd3d_shader_main.c b/libs/vkd3d-shader/vkd3d_shader_main.c
> index 62baf17f..6fd32435 100644
> --- a/libs/vkd3d-shader/vkd3d_shader_main.c
> +++ b/libs/vkd3d-shader/vkd3d_shader_main.c
> @@ -24,6 +24,38 @@
>
> VKD3D_DEBUG_ENV_NAME("VKD3D_SHADER_DEBUG");
>
> +static inline int char_to_int(char c)
> +{
> + if ('0' <= c && c <= '9')
> + return c - '0';
> + if ('A' <= c && c <= 'F')
> + return c - 'A' + 10;
> + if ('a' <= c && c <= 'f')
> + return c - 'a' + 10;
> + return -1;
> +}
> +
> +uint32_t vkd3d_parse_integer(const char *s)
> +{
> + uint32_t base = 10, ret = 0;
> + int digit;
> +
> + if (*s == '0')
> + {
> + base = 8;
> + ++s;
> + if (*s == 'x' || *s == 'X')
> + {
> + base = 16;
> + ++s;
> + }
> + }
> +
> + while ((digit = char_to_int(*s++)) >= 0)
> + ret = ret * base + (uint32_t)digit;
> + return ret;
> +}
> +
> void vkd3d_string_buffer_init(struct vkd3d_string_buffer *buffer)
> {
> buffer->buffer_size = 16;
> diff --git a/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d-shader/vkd3d_shader_private.h
> index 29e178cc..8bde5523 100644
> --- a/libs/vkd3d-shader/vkd3d_shader_private.h
> +++ b/libs/vkd3d-shader/vkd3d_shader_private.h
> @@ -1035,6 +1035,8 @@ static inline size_t bytecode_get_size(struct vkd3d_bytecode_buffer *buffer)
> return buffer->size;
> }
>
> +uint32_t vkd3d_parse_integer(const char *s);
> +
> struct vkd3d_shader_message_context
> {
> enum vkd3d_shader_log_level log_level;
More information about the wine-devel
mailing list