[PATCH vkd3d 6/6] vkd3d-shader/hlsl: Parse state blocks in variable definitions.

Giovanni Mascellani gmascellani at codeweavers.com
Mon Sep 27 05:20:52 CDT 2021


Hi,

Il 25/09/21 14:09, Matteo Bruni ha scritto:
>> +    | NEW_IDENTIFIER
>> +        {
>> +            if (ctx->in_state_block)
>> +            {
>> +                struct hlsl_ir_load *load;
>> +                struct hlsl_ir_var *var;
>> +
>> +                if (!(var = hlsl_new_var(ctx, $1, ctx->builtin_types.scalar[HLSL_TYPE_INT], @1, NULL, 0, NULL)))
>> +                    YYABORT;
>> +                if (!(load = hlsl_new_var_load(ctx, var, @1)))
>> +                    YYABORT;
>> +                if (!($$ = make_list(ctx, &load->node)))
>> +                {
>> +                    hlsl_free_instr(&load->node);
>> +                    YYABORT;
>> +                }
>> +            }
> This leaks var on error.

Also, the node is doubly freed in the error path (because make_list 
already frees the node when it fails). Maybe the outer hlsl_free_instr 
was meant to free the variable instead (though the variable must also be 
freed when hlsl_new_var_load fails).

That said, I didn't know about this strange HLSL feature, so I don't 
know what the intended behavior would be. Does anybody have a link? 
Searching for "hlsl state block" didn't help much.

Thanks, Giovanni.



More information about the wine-devel mailing list