From 6b6cd11fbefa66a5cf1b5b4c2964580b19e0ebbc Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Sun, 16 Aug 2015 23:37:10 +0300 Subject: [PATCH] cellSaveData fix --- rpcs3/Emu/SysCalls/Modules/cellMsgDialog.cpp | 2 +- rpcs3/Emu/SysCalls/Modules/cellSaveData.cpp | 26 ++++++++++++++++++-- rpcs3/Emu/SysCalls/Modules/cellSync.h | 26 +++++++++----------- 3 files changed, 37 insertions(+), 17 deletions(-) diff --git a/rpcs3/Emu/SysCalls/Modules/cellMsgDialog.cpp b/rpcs3/Emu/SysCalls/Modules/cellMsgDialog.cpp index 5c32d3c431..992574fa28 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellMsgDialog.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellMsgDialog.cpp @@ -32,7 +32,7 @@ s32 cellMsgDialogOpen2(u32 type, vm::cptr msgString, vm::ptr= 0x200 || type & -0x33f8) + if (!msgString || std::strlen(msgString.get_ptr()) >= 0x200 || type & -0x33f8) { return CELL_MSGDIALOG_ERROR_PARAM; } diff --git a/rpcs3/Emu/SysCalls/Modules/cellSaveData.cpp b/rpcs3/Emu/SysCalls/Modules/cellSaveData.cpp index 0a887ed36b..eaf20423a9 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellSaveData.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellSaveData.cpp @@ -77,7 +77,7 @@ never_inline s32 savedata_op(PPUThread& ppu, u32 operation, u32 version, vm::cpt const auto fileSet = stack.of(&_stack_t::fileSet); // path of the specified user (00000001 by default) - const std::string base_dir = fmt::format("/dev_hdd0/home/%08d/savedata/", userId ? userId : 1u); + const std::string base_dir = fmt::format("/dev_hdd0/home/%08u/savedata/", userId ? userId : 1u); result->userdata = userdata; // probably should be assigned only once (allows the callback to change it) @@ -447,10 +447,11 @@ never_inline s32 savedata_op(PPUThread& ppu, u32 operation, u32 version, vm::cpt return CELL_SAVEDATA_ERROR_CBRESULT; } - // Update PARAM.SFO if (statSet->setParam) { psf.Clear(); + + // Update PARAM.SFO psf.SetString("ACCOUNT_ID", ""); // ??? psf.SetInteger("ATTRIBUTE", statSet->setParam->attribute); psf.SetString("CATEGORY", "SD"); // ??? @@ -463,14 +464,26 @@ never_inline s32 savedata_op(PPUThread& ppu, u32 operation, u32 version, vm::cpt psf.SetString("SUB_TITLE", statSet->setParam->subTitle); psf.SetString("TITLE", statSet->setParam->title); } + else if (!psf) + { + // setParam is NULL for new savedata: abort operation + + return CELL_OK; + } switch (const u32 mode = statSet->reCreateMode & 0xffff) { case CELL_SAVEDATA_RECREATE_NO: + { + cellSaveData.Error("Savedata %s considered broken", save_entry.dirName); + // fallthrough + } + case CELL_SAVEDATA_RECREATE_NO_NOBROKEN: { break; } + case CELL_SAVEDATA_RECREATE_YES: case CELL_SAVEDATA_RECREATE_YES_RESET_OWNER: { @@ -483,8 +496,17 @@ never_inline s32 savedata_op(PPUThread& ppu, u32 operation, u32 version, vm::cpt } } + if (!statSet->setParam) + { + // Savedata deleted and setParam is NULL: delete directory and abort operation + if (Emu.GetVFS().RemoveDir(dir_path)) cellSysutil.Error("savedata_op(): savedata directory %s deleted", save_entry.dirName); + + return CELL_OK; + } + break; } + default: { cellSysutil.Error("savedata_op(): unknown statSet->reCreateMode (0x%x)", statSet->reCreateMode); diff --git a/rpcs3/Emu/SysCalls/Modules/cellSync.h b/rpcs3/Emu/SysCalls/Modules/cellSync.h index d3f6d06cde..c6b006ff42 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellSync.h +++ b/rpcs3/Emu/SysCalls/Modules/cellSync.h @@ -7,28 +7,26 @@ enum { CELL_SYNC_ERROR_AGAIN = 0x80410101, CELL_SYNC_ERROR_INVAL = 0x80410102, - CELL_SYNC_ERROR_NOSYS = 0x80410103, // ??? + CELL_SYNC_ERROR_NOSYS = 0x80410103, CELL_SYNC_ERROR_NOMEM = 0x80410104, - CELL_SYNC_ERROR_SRCH = 0x80410105, // ??? - CELL_SYNC_ERROR_NOENT = 0x80410106, // ??? - CELL_SYNC_ERROR_NOEXEC = 0x80410107, // ??? + CELL_SYNC_ERROR_SRCH = 0x80410105, + CELL_SYNC_ERROR_NOENT = 0x80410106, + CELL_SYNC_ERROR_NOEXEC = 0x80410107, CELL_SYNC_ERROR_DEADLK = 0x80410108, CELL_SYNC_ERROR_PERM = 0x80410109, CELL_SYNC_ERROR_BUSY = 0x8041010A, - //////////////////////// 0x8041010B, // ??? - CELL_SYNC_ERROR_ABORT = 0x8041010C, // ??? - CELL_SYNC_ERROR_FAULT = 0x8041010D, // ??? - CELL_SYNC_ERROR_CHILD = 0x8041010E, // ??? + CELL_SYNC_ERROR_ABORT = 0x8041010C, + CELL_SYNC_ERROR_FAULT = 0x8041010D, + CELL_SYNC_ERROR_CHILD = 0x8041010E, CELL_SYNC_ERROR_STAT = 0x8041010F, CELL_SYNC_ERROR_ALIGN = 0x80410110, CELL_SYNC_ERROR_NULL_POINTER = 0x80410111, - - CELL_SYNC_ERROR_NOT_SUPPORTED_THREAD = 0x80410112, // ??? - CELL_SYNC_ERROR_SHOTAGE = 0x80410112, // ??? - CELL_SYNC_ERROR_NO_NOTIFIER = 0x80410113, // ??? - CELL_SYNC_ERROR_UNKNOWNKEY = 0x80410113, // ??? - CELL_SYNC_ERROR_NO_SPU_CONTEXT_STORAGE = 0x80410114, // ??? + CELL_SYNC_ERROR_NOT_SUPPORTED_THREAD = 0x80410112, + CELL_SYNC_ERROR_SHOTAGE = 0x80410112, + CELL_SYNC_ERROR_NO_NOTIFIER = 0x80410113, + CELL_SYNC_ERROR_UNKNOWNKEY = 0x80410113, + CELL_SYNC_ERROR_NO_SPU_CONTEXT_STORAGE = 0x80410114, }; struct alignas(4) sync_mutex_t // CellSyncMutex sync var