mirror of
https://git.h3cjp.net/H3cJP/citra.git
synced 2024-11-30 07:52:45 +00:00
shader_recompiler: fix potential OOB access
Found by static analysis with PVS-Studio. Original check wasn't actually checking for OOB and would segfault in case of it.
This commit is contained in:
parent
ca2d904770
commit
a943600019
|
@ -458,9 +458,10 @@ void EmitContext::DefineGenericOutput(size_t index, u32 invocations) {
|
||||||
std::string definition{fmt::format("layout(location={}", index)};
|
std::string definition{fmt::format("layout(location={}", index)};
|
||||||
const u32 remainder{4 - element};
|
const u32 remainder{4 - element};
|
||||||
const TransformFeedbackVarying* xfb_varying{};
|
const TransformFeedbackVarying* xfb_varying{};
|
||||||
if (!runtime_info.xfb_varyings.empty()) {
|
const size_t xfb_varying_index{base_index + element};
|
||||||
xfb_varying = &runtime_info.xfb_varyings[base_index + element];
|
if (xfb_varying_index < runtime_info.xfb_varyings.size()) {
|
||||||
xfb_varying = xfb_varying && xfb_varying->components > 0 ? xfb_varying : nullptr;
|
xfb_varying = &runtime_info.xfb_varyings[xfb_varying_index];
|
||||||
|
xfb_varying = xfb_varying->components > 0 ? xfb_varying : nullptr;
|
||||||
}
|
}
|
||||||
const u32 num_components{xfb_varying ? xfb_varying->components : remainder};
|
const u32 num_components{xfb_varying ? xfb_varying->components : remainder};
|
||||||
if (element > 0) {
|
if (element > 0) {
|
||||||
|
|
|
@ -164,9 +164,10 @@ void DefineGenericOutput(EmitContext& ctx, size_t index, std::optional<u32> invo
|
||||||
while (element < 4) {
|
while (element < 4) {
|
||||||
const u32 remainder{4 - element};
|
const u32 remainder{4 - element};
|
||||||
const TransformFeedbackVarying* xfb_varying{};
|
const TransformFeedbackVarying* xfb_varying{};
|
||||||
if (!ctx.runtime_info.xfb_varyings.empty()) {
|
const size_t xfb_varying_index{base_attr_index + element};
|
||||||
xfb_varying = &ctx.runtime_info.xfb_varyings[base_attr_index + element];
|
if (xfb_varying_index < ctx.runtime_info.xfb_varyings.size()) {
|
||||||
xfb_varying = xfb_varying && xfb_varying->components > 0 ? xfb_varying : nullptr;
|
xfb_varying = &ctx.runtime_info.xfb_varyings[xfb_varying_index];
|
||||||
|
xfb_varying = xfb_varying->components > 0 ? xfb_varying : nullptr;
|
||||||
}
|
}
|
||||||
const u32 num_components{xfb_varying ? xfb_varying->components : remainder};
|
const u32 num_components{xfb_varying ? xfb_varying->components : remainder};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue