VirtualBox

Ignore:
Timestamp:
Jan 9, 2020 5:36:36 PM (5 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
135630
Message:

3D: Check register index in shader opcodes, bugref:9613

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Graphics/shaderlib/shader.c

    r82693 r82704  
    341341    {
    342342        case WINED3DSPR_TEXTURE: /* WINED3DSPR_ADDR */
    343             if (shader_type == WINED3D_SHADER_TYPE_PIXEL) reg_maps->texcoord |= 1 << reg->idx;
    344             else reg_maps->address |= 1 << reg->idx;
     343            if (shader_type == WINED3D_SHADER_TYPE_PIXEL)
     344            {
     345                AssertReturn(reg->idx < MAX_REG_TEXCRD, E_INVALIDARG);
     346                reg_maps->texcoord |= 1 << reg->idx;
     347            }
     348            else
     349            {
     350                AssertReturn(reg->idx < MAX_REG_ADDR, E_INVALIDARG);
     351                reg_maps->address |= 1 << reg->idx;
     352            }
    345353            break;
    346354
    347355        case WINED3DSPR_TEMP:
     356            AssertReturn(reg->idx < MAX_REG_TEMP, E_INVALIDARG);
    348357            reg_maps->temporary |= 1 << reg->idx;
    349358            break;
     
    371380                }
    372381            }
    373             else reg_maps->input_registers |= 1 << reg->idx;
     382            else
     383            {
     384                AssertReturn(reg->idx < MAX_REG_INPUT, E_INVALIDARG);
     385                reg_maps->input_registers |= 1 << reg->idx;
     386            }
    374387            break;
    375388
     
    404417            else
    405418            {
     419                AssertReturn(reg->idx < reg_maps->constf_size, E_INVALIDARG);
    406420                set_bitmap_bit(reg_maps->constf, reg->idx);
    407421            }
     
    409423
    410424        case WINED3DSPR_CONSTINT:
     425            AssertReturn(reg->idx < MAX_CONST_I, E_INVALIDARG);
    411426            reg_maps->integer_constants |= (1 << reg->idx);
    412427            break;
    413428
    414429        case WINED3DSPR_CONSTBOOL:
     430            AssertReturn(reg->idx < MAX_CONST_B, E_INVALIDARG);
    415431            reg_maps->boolean_constants |= (1 << reg->idx);
    416432            break;
     
    422438        default:
    423439            TRACE("Not recording register of type %#x and idx %u\n", reg->type, reg->idx);
    424             break;
     440            return E_INVALIDARG;
    425441    }
    426442
     
    478494        return E_OUTOFMEMORY;
    479495    }
     496
     497    reg_maps->constf_size = constf_size;
    480498
    481499    while (!fe->shader_is_end(fe_data, &ptr))
     
    667685
    668686                hr = shader_record_register_usage(shader, reg_maps, &dst_param.reg, shader_version.type);
    669                 if (FAILED(hr))
    670                 {
    671                     ERR("shader_record_register_usage failed.\n");
    672                     return hr;
    673                 }
     687                AssertReturn(FAILED(hr), hr);
    674688
    675689                /* WINED3DSPR_TEXCRDOUT is the same as WINED3DSPR_OUTPUT. _OUTPUT can be > MAX_REG_TEXCRD and
     
    680694                {
    681695                    unsigned int idx = dst_param.reg.idx;
    682                    
    683                     if (idx >= MAX_REG_TEXCRD)
    684                     {
    685                         ERR("Invalid texcoord index %d.\n", idx);
    686                         return E_INVALIDARG;
    687                     }
    688                    
     696                    AssertReturn(idx < MAX_REG_TEXCRD, E_INVALIDARG);
     697
    689698                    reg_maps->texcoord_mask[idx] |= dst_param.write_mask;
    690699                }
     
    778787                struct wined3d_shader_src_param src_param, src_rel_addr;
    779788                unsigned int count;
     789                HRESULT hr;
    780790
    781791                fe->shader_read_src_param(fe_data, &ptr, &src_param, &src_rel_addr);
    782792                count = get_instr_extra_regcount(ins.handler_idx, i);
    783793
    784                 shader_record_register_usage(shader, reg_maps, &src_param.reg, shader_version.type);
     794                hr = shader_record_register_usage(shader, reg_maps, &src_param.reg, shader_version.type);
     795                AssertReturn(FAILED(hr), hr);
     796
    785797                while (count)
    786798                {
    787799                    ++src_param.reg.idx;
    788                     shader_record_register_usage(shader, reg_maps, &src_param.reg, shader_version.type);
     800                    hr = shader_record_register_usage(shader, reg_maps, &src_param.reg, shader_version.type);
     801                    AssertReturn(FAILED(hr), hr);
    789802                    --count;
    790803                }
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette