From b8a83ab448f3ee8309524234e2cf614625899283 Mon Sep 17 00:00:00 2001 From: Chris Spegal Date: Mon, 9 Oct 2023 09:10:07 -0400 Subject: [PATCH] Fix non-trivial uses of writePODVector --- .../libs/coreinit/coreinit_MemoryMapping.cpp | 15 +++++- src/Cafe/OS/libs/nn_aoc/nn_aoc.cpp | 15 ++++-- src/Cafe/OS/libs/nsysnet/nsysnet.cpp | 54 ++++++++++++++++++- 3 files changed, 78 insertions(+), 6 deletions(-) diff --git a/src/Cafe/OS/libs/coreinit/coreinit_MemoryMapping.cpp b/src/Cafe/OS/libs/coreinit/coreinit_MemoryMapping.cpp index fbdc366f..626a4daa 100644 --- a/src/Cafe/OS/libs/coreinit/coreinit_MemoryMapping.cpp +++ b/src/Cafe/OS/libs/coreinit/coreinit_MemoryMapping.cpp @@ -156,13 +156,26 @@ namespace coreinit void MemoryMapping_Save(MemStreamWriter& s) { s.writeSection("coreinit_MemoryMapping "); - s.writePODVector(s_allocatedVirtMemory); + s.writeBE(s_allocatedVirtMemory.size()); + for (auto i : s_allocatedVirtMemory) + { + s.writeBE(i.virtualAddress); + s.writeBE(i.size); + s.writeBE(i.alignment); + } } void MemoryMapping_Restore(MemStreamReader& s) { s.readSection("coreinit_MemoryMapping "); s.readPODVector(s_allocatedVirtMemory); + uint32 s_allocatedVirtMemorySize = s.readBE(); + s_allocatedVirtMemory.clear(); + s_allocatedVirtMemory.reserve(s_allocatedVirtMemorySize); + for (sint32 i = 0; i < s_allocatedVirtMemorySize; i++) + { + s_allocatedVirtMemory.push_back(OSVirtMemoryEntry(s.readBE(), s.readBE(), s.readBE())); + } } void InitializeMemoryMapping() diff --git a/src/Cafe/OS/libs/nn_aoc/nn_aoc.cpp b/src/Cafe/OS/libs/nn_aoc/nn_aoc.cpp index 413730c2..2071153a 100644 --- a/src/Cafe/OS/libs/nn_aoc/nn_aoc.cpp +++ b/src/Cafe/OS/libs/nn_aoc/nn_aoc.cpp @@ -36,7 +36,6 @@ namespace nn struct AOCCacheEntry { - AOCCacheEntry() {}; AOCCacheEntry(uint64 titleId) : aocTitleId(titleId) {}; uint64 aocTitleId; @@ -153,14 +152,24 @@ namespace nn void save(MemStreamWriter& s) { s.writeSection("nn_aoc"); - s.writePODVector(sAocCache); + s.writeBE(sAocCache.size()); + for (auto i : sAocCache) + { + s.writeBE(i.aocTitleId); + } s.writeBool(sAocCacheGenerated); } void restore(MemStreamReader& s) { s.readSection("nn_aoc"); - s.readPODVector(sAocCache); + uint32 sAocCacheSize = s.readBE(); + sAocCache.clear(); + sAocCache.reserve(sAocCacheSize); + for (sint32 i = 0; i < sAocCacheSize; i++) + { + sAocCache.emplace_back(s.readBE()); + } s.readBool(sAocCacheGenerated); } diff --git a/src/Cafe/OS/libs/nsysnet/nsysnet.cpp b/src/Cafe/OS/libs/nsysnet/nsysnet.cpp index 42593938..aa8d454f 100644 --- a/src/Cafe/OS/libs/nsysnet/nsysnet.cpp +++ b/src/Cafe/OS/libs/nsysnet/nsysnet.cpp @@ -2161,6 +2161,45 @@ namespace nsysnet } } +template<> +void MemStreamWriter::writeBE(const nsysnet::NSSLInternalState_t& v) +{ + writeBool(v.destroyed); + writeBE(v.sslVersion); + writeBE(v.clientPKI); + + writeBE(v.serverPKIs.size()); + for (auto i : v.serverPKIs) + writeBE(i); + + writeBE(v.serverCustomPKIs.size()); + for (auto i : v.serverCustomPKIs) + writePODVector(i); +} + +template<> +void MemStreamReader::readBE(nsysnet::NSSLInternalState_t& v) +{ + readBool(v.destroyed); + readBE(v.sslVersion); + readBE(v.clientPKI); + + uint32 serverPKIsSize = readBE(); + v.serverPKIs.clear(); + for (uint32 i = 0; i < serverPKIsSize; i++) + v.serverPKIs.insert(readBE()); + + uint32 serverCustomPKIsSize = readBE(); + v.serverCustomPKIs.clear(); + v.serverCustomPKIs.resize(serverCustomPKIsSize); + for (uint32 i = 0; i < serverCustomPKIsSize; i++) + { + std::vector pki; + readPODVector(pki); + v.serverCustomPKIs.push_back(pki); + } +} + void nsysnet_save(MemStreamWriter& s) { s.writeSection("nsysnet"); @@ -2169,7 +2208,9 @@ void nsysnet_save(MemStreamWriter& s) s.writeMPTR(_staticHostentName); s.writeMPTR(_staticHostentPtrList); s.writeMPTR(_staticHostentEntries); - s.writePODVector(nsysnet::g_nsslInternalStates); + s.writeBE(nsysnet::g_nsslInternalStates.size()); + for (auto i : nsysnet::g_nsslInternalStates) + s.writeBE(i); s.writeBool(sockLibReady); s.writeData(virtualSocketTable, sizeof(virtualSocket_t) * WU_SOCKET_LIMIT); } @@ -2182,7 +2223,15 @@ void nsysnet_restore(MemStreamReader& s) s.readMPTR(_staticHostentName); s.readMPTR(_staticHostentPtrList); s.readMPTR(_staticHostentEntries); - s.readPODVector(nsysnet::g_nsslInternalStates); + uint32 g_nsslInternalStatesSize = s.readBE(); + nsysnet::g_nsslInternalStates.clear(); + nsysnet::g_nsslInternalStates.resize(g_nsslInternalStatesSize); + for (uint32 i = 0; i < g_nsslInternalStatesSize; i++) + { + nsysnet::NSSLInternalState_t t; + s.readBE(t); + nsysnet::g_nsslInternalStates.push_back(t); + } s.readBool(sockLibReady); s.readData(virtualSocketTable, sizeof(virtualSocket_t) * WU_SOCKET_LIMIT); } @@ -2247,3 +2296,4 @@ void nsysnet_load() osLib_addFunction("nsysnet", "NSSLExportInternalServerCertificate", nsysnet::export_NSSLExportInternalServerCertificate); osLib_addFunction("nsysnet", "NSSLExportInternalClientCertificate", nsysnet::export_NSSLExportInternalClientCertificate); } +