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:
		| @@ -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}; | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user