[v4 1/4] d3dx9: Remove redundant parameter size check in set_constants().

Matteo Bruni matteo.mystral at gmail.com
Wed Jun 21 14:55:36 CDT 2017


2017-06-19 11:24 GMT+02:00 Paul Gofman <gofmanp at gmail.com>:
> Signed-off-by: Paul Gofman <gofmanp at gmail.com>
> ---
> v4:
>     - added assert() for parameter size.
> ---
>  dlls/d3dx9_36/preshader.c | 10 +++++-----
>  1 file changed, 5 insertions(+), 5 deletions(-)
>
> diff --git a/dlls/d3dx9_36/preshader.c b/dlls/d3dx9_36/preshader.c
> index 2785ca3..76d6de9 100644
> --- a/dlls/d3dx9_36/preshader.c
> +++ b/dlls/d3dx9_36/preshader.c
> @@ -1178,11 +1178,6 @@ static void set_constants(struct d3dx_regstore *rs, struct d3dx_const_tab *const
>                          param_offset = i + j * info.major;
>                      else
>                          param_offset = i * info.minor + j;
> -                    if (param_offset * sizeof(unsigned int) >= param->bytes)
> -                    {
> -                        WARN("Parameter data is too short, name %s, component %u.\n", debugstr_a(param->name), i);
> -                        break;
> -                    }
>                      out[offset] = data[param_offset];
>                  }
>              }
> @@ -1303,6 +1298,11 @@ static HRESULT merge_const_set_entries(struct d3dx_const_tab *const_tab,
>              memmove(&const_tab->const_set[index + 1], &const_tab->const_set[i],
>                      sizeof(*const_tab->const_set) * (const_tab->const_set_count - i));
>              const_tab->const_set_count -= i - index - 1;
> +            assert(param->bytes >= table_info[first_const->table].component_size
> +                    * first_const->element_count
> +                    * (first_const->direct_copy ? get_reg_components(first_const->table)
> +                    * first_const->register_count
> +                    : first_const->param->rows * first_const->param->columns));

I don't think an assert() is correct here. You are comparing parameter
size, which eventually depends on the effect data, with the constant
size, which comes from the constant table and thus again the effect
data. In general we shouldn't assert on invalid input data.

Also by putting the assert() in merge_const_set_entries() you're not
checking the non-array, non-struct constants.

Am I missing something? Is there something else that would trigger if
e.g. a 4x4 matrix constants gets matched with a 3x4 parameter?



More information about the wine-devel mailing list