From b88af24d7c78da7ae1a14357d62b50b5dd8f4474 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Wed, 21 May 2025 11:37:08 +0300 Subject: [PATCH] rsx-debugger: Extra safety checks for FP decompiler --- rpcs3/rpcs3qt/rsx_debugger.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/rpcs3/rpcs3qt/rsx_debugger.cpp b/rpcs3/rpcs3qt/rsx_debugger.cpp index f39bd8c8ba..0026fda959 100644 --- a/rpcs3/rpcs3qt/rsx_debugger.cpp +++ b/rpcs3/rpcs3qt/rsx_debugger.cpp @@ -1274,7 +1274,15 @@ void rsx_debugger::GetFragmentProgram() const } const auto [program_offset, program_location] = rsx::method_registers.shader_program_address(); - auto data_ptr = vm::base(rsx::get_address(program_offset, program_location)); + const auto address = rsx::get_address(program_offset, program_location, 4); + if (!address) + { + m_fragment_disasm->clear(); + return; + } + + // NOTE: Reading through super ptr while crash-safe means we're probably reading incorrect bytes, but should be fine in 99% of cases + auto data_ptr = vm::get_super_ptr(address); const auto fp_metadata = program_hash_util::fragment_program_utils::analyse_fragment_program(data_ptr); const bool output_h0 = rsx::method_registers.shader_control() & CELL_GCM_SHADER_CONTROL_32_BITS_EXPORTS ? false : true; @@ -1314,4 +1322,4 @@ void rsx_debugger::GetFragmentProgram() const m_fragment_disasm->clear(); m_fragment_disasm->setText(QString::fromStdString(fp_disasm.GetArbShader())); -} \ No newline at end of file +}