- Moved the copy buffer to the heap via std::make_unique.
- Added explicit null-safety and system shutdown checks to mirroring logic.
- Hardened recursion guards during directory traversal to ensure stability.
Signed-off-by: Collecting <collecting@noreply.localhost>
Added a "Global Custom Save Path" configuration option in the Filesystem settings.
Implemented a prioritized save-loading hierarchy: Global Path (if enabled) > Per-Game Custom Path > Default NAND.
Introduced a non-destructive migration tool that allows users to consolidate their existing saves into the new global location.
The migration tool specifically prioritizes per-game custom saves over NAND saves to ensure the most up-to-date data is preserved during consolidation.
The migration process is copy-only; no data is deleted from the source directories, ensuring absolute user data safety.
Maintained compatibility with the existing "Backup Saves to NAND" feature, ensuring saves continue to be mirrored internally if configured.
Signed-off-by: Collecting <collecting@noreply.localhost>
- Bumps HOS version from 20.1.5 to 21.0.0
- Updates the corresponding `VERSION_HASH`, `DISPLAY_VERSION`, and
`DISPLAY_TITLE` strings.
Signed-off-by: Zephyron <zephyron@citron-emu.org>
Remove the 'reliable' boolean field from LDNPacket and ProxyPacket
structs and all associated serialization/deserialization logic.
All packets now use reliable delivery by default via ENet layer,
matching the legacy format for full backward compatibility.
Signed-off-by: Zephyron <zephyron@citron-emu.org>
- Add size validation before memcpy for Connect/Disconnect packets
- Allow empty data for Scan packets (Type 0) which have no payload
- Add debug logging for ScanResp packets including BSSID and results
- Fix MacAddress indexing to use .raw[] instead of [] operator
Signed-off-by: Zephyron <zephyron@citron-emu.org>
Handle error 2359-2618 (module 359, description 2618) gracefully
by logging a warning instead of crashing, similar to module 56.
This allows games like SSBU to continue execution when encountering
this error code.
Signed-off-by: Zephyron <zephyron@citron-emu.org>
- Add error checking after decompression to drop corrupted packets
- Add error checking after compression to prevent sending empty packets
- Allow ZSTD_CONTENTSIZE_UNKNOWN and use streaming decompression
- Only reject ZSTD_CONTENTSIZE_ERROR as a fatal error
Fixes network connectivity issues where corrupted/empty packets were
being processed, breaking the network protocol.
Signed-off-by: Zephyron <zephyron@citron-emu.org>
Fix crash in PinHandle when SMMU allocation fails and unmap queue is empty.
Previously, the code would log an error and continue looping indefinitely,
causing log spam and eventual crash.
- Free multiple handles from unmap queue (up to 100) before giving up
- Add maximum attempt counter to prevent infinite loops
- Return 0 gracefully when no more handles can be freed
- Add error handling in callers (Remap, MapBufferEx, MapBuffer) to check for
PinHandle failure and return NvResult::InsufficientMemory instead of using
invalid addresses
Signed-off-by: Zephyron <zephyron@citron-emu.org>
Fix crash in PinHandle when SMMU allocation fails and unmap queue is empty.
Previously, the code would log an error and continue looping indefinitely,
causing log spam and eventual crash. Now it returns 0 to fail gracefully.
Also fix incorrect handle check on line 219 - should check freeHandleDesc
instead of handle_description.
Signed-off-by: Zephyron <zephyron@citron-emu.org>
- Add custom_save_paths map to Settings::Values
- Implement ReadCustomSavePathValues and SaveCustomSavePathValues in Config
- Update CreateSaveDataFactory to check for custom save paths
- Support per-game title ID save path overrides
Signed-off-by: Zephyron <zephyron@citron-emu.org>