mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-30 21:30:04 +00:00 
			
		
		
		
	fix(bps): Fixes BPS patch changing target size (#5829)
This commit is contained in:
		
							parent
							
								
									c40871f126
								
							
						
					
					
						commit
						89410c164a
					
				
					 1 changed files with 17 additions and 2 deletions
				
			
		|  | @ -63,6 +63,7 @@ namespace Bps { | |||
| // Realistically uint32s are more than enough for code patching.
 | ||||
| using Number = u32; | ||||
| 
 | ||||
| constexpr std::size_t MagicSize = 4; | ||||
| constexpr std::size_t FooterSize = 12; | ||||
| 
 | ||||
| // The BPS format uses CRC32 checksums.
 | ||||
|  | @ -149,7 +150,7 @@ public: | |||
|         : m_source{source}, m_target{target}, m_patch{patch} {} | ||||
| 
 | ||||
|     bool Apply() { | ||||
|         const auto magic = *m_patch.Read<std::array<char, 4>>(); | ||||
|         const auto magic = *m_patch.Read<std::array<char, MagicSize>>(); | ||||
|         if (std::string_view(magic.data(), magic.size()) != "BPS1") { | ||||
|             LOG_ERROR(Service_FS, "Invalid BPS magic"); | ||||
|             return false; | ||||
|  | @ -257,10 +258,24 @@ private: | |||
| } // namespace Bps
 | ||||
| 
 | ||||
| bool ApplyBpsPatch(const std::vector<u8>& patch, std::vector<u8>& buffer) { | ||||
|     Bps::Stream patch_stream{patch.data(), patch.size()}; | ||||
| 
 | ||||
|     // Move the offset past the file format marker (i.e. "BPS1")
 | ||||
|     patch_stream.Seek(Bps::MagicSize); | ||||
| 
 | ||||
|     const Bps::Number source_size = patch_stream.ReadNumber(); | ||||
|     const Bps::Number target_size = patch_stream.ReadNumber(); | ||||
| 
 | ||||
|     if (target_size > source_size) { | ||||
|         LOG_INFO(Service_FS, "Resizing target to {}", target_size); | ||||
|         buffer.resize(target_size); | ||||
|     } | ||||
| 
 | ||||
|     patch_stream.Seek(0); | ||||
| 
 | ||||
|     const std::vector<u8> source = buffer; | ||||
|     Bps::Stream source_stream{source.data(), source.size()}; | ||||
|     Bps::Stream target_stream{buffer.data(), buffer.size()}; | ||||
|     Bps::Stream patch_stream{patch.data(), patch.size()}; | ||||
|     Bps::PatchApplier applier{source_stream, target_stream, patch_stream}; | ||||
|     return applier.Apply(); | ||||
| } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue