cellSaveData: always commit changes on error in funcFile loop

Make sure the changes which are already done are written.
This commit is contained in:
Nekotekina 2019-09-25 04:13:11 +03:00
parent f841b47b6b
commit cd843bda6e

View file

@ -1064,9 +1064,9 @@ static NEVER_INLINE error_code savedata_op(ppu_thread& ppu, u32 operation, u32 v
// Clear order info // Clear order info
blist.clear(); blist.clear();
// Set to not load files // Set to not load files on next step
has_modified = true;
recreated = true; recreated = true;
has_modified = true;
break; break;
} }
@ -1106,14 +1106,16 @@ static NEVER_INLINE error_code savedata_op(ppu_thread& ppu, u32 operation, u32 v
fileGet->excSize = 0; fileGet->excSize = 0;
memset(fileGet->reserved, 0, sizeof(fileGet->reserved)); memset(fileGet->reserved, 0, sizeof(fileGet->reserved));
error_code savedata_result = CELL_OK;
while (funcFile) while (funcFile)
{ {
funcFile(ppu, result, fileGet, fileSet); funcFile(ppu, result, fileGet, fileSet);
if (result->result < 0) if (result->result < 0)
{ {
cellSaveData.warning("savedata_op(): funcFile returned result=%d.", result->result); savedata_result = {CELL_SAVEDATA_ERROR_CBRESULT, +result->result};
return CELL_SAVEDATA_ERROR_CBRESULT; break;
} }
if (result->result == CELL_SAVEDATA_CBRESULT_OK_LAST || result->result == CELL_SAVEDATA_CBRESULT_OK_LAST_NOCONFIRM) if (result->result == CELL_SAVEDATA_CBRESULT_OK_LAST || result->result == CELL_SAVEDATA_CBRESULT_OK_LAST_NOCONFIRM)
@ -1175,10 +1177,16 @@ static NEVER_INLINE error_code savedata_op(ppu_thread& ppu, u32 operation, u32 v
{ {
// ****** sysutil savedata parameter error : 61 ****** // ****** sysutil savedata parameter error : 61 ******
cellSaveData.error("savedata_op(): unknown fileSet->fileType (0x%x)", type); cellSaveData.error("savedata_op(): unknown fileSet->fileType (0x%x)", type);
return {CELL_SAVEDATA_ERROR_PARAM, "61"}; savedata_result = {CELL_SAVEDATA_ERROR_PARAM, "61"};
break;
} }
} }
if (savedata_result)
{
break;
}
psf.emplace("*" + file_path, fileSet->fileType == CELL_SAVEDATA_FILETYPE_SECUREFILE); psf.emplace("*" + file_path, fileSet->fileType == CELL_SAVEDATA_FILETYPE_SECUREFILE);
const u32 access_size = std::min<u32>(fileSet->fileSize, fileSet->fileBufSize); const u32 access_size = std::min<u32>(fileSet->fileSize, fileSet->fileBufSize);
@ -1212,19 +1220,22 @@ static NEVER_INLINE error_code savedata_op(ppu_thread& ppu, u32 operation, u32 v
{ {
// ****** sysutil savedata parameter error : 22 ****** // ****** sysutil savedata parameter error : 22 ******
cellSaveData.error("Failed to open file %s%s", dir_path, file_path); cellSaveData.error("Failed to open file %s%s", dir_path, file_path);
return {CELL_SAVEDATA_ERROR_PARAM, "22"}; savedata_result = {CELL_SAVEDATA_ERROR_PARAM, "22"};
break;
} }
if (fileSet->fileBufSize < fileSet->fileSize) if (fileSet->fileBufSize < fileSet->fileSize)
{ {
// ****** sysutil savedata parameter error : 72 ****** // ****** sysutil savedata parameter error : 72 ******
return {CELL_SAVEDATA_ERROR_PARAM, "72"}; savedata_result = {CELL_SAVEDATA_ERROR_PARAM, "72"};
break;
} }
if (!fileSet->fileBuf) if (!fileSet->fileBuf)
{ {
// ****** sysutil savedata parameter error : 73 ****** // ****** sysutil savedata parameter error : 73 ******
return {CELL_SAVEDATA_ERROR_PARAM, "73"}; savedata_result = {CELL_SAVEDATA_ERROR_PARAM, "73"};
break;
} }
// Read from memory file to vm // Read from memory file to vm
@ -1289,9 +1300,15 @@ static NEVER_INLINE error_code savedata_op(ppu_thread& ppu, u32 operation, u32 v
{ {
// ****** sysutil savedata parameter error : 60 ****** // ****** sysutil savedata parameter error : 60 ******
cellSaveData.error("savedata_op(): unknown fileSet->fileOperation (0x%x)", op); cellSaveData.error("savedata_op(): unknown fileSet->fileOperation (0x%x)", op);
return {CELL_SAVEDATA_ERROR_PARAM, "60"}; savedata_result = {CELL_SAVEDATA_ERROR_PARAM, "60"};
break;
} }
} }
if (savedata_result)
{
break;
}
} }
// Write PARAM.SFO and savedata // Write PARAM.SFO and savedata
@ -1352,7 +1369,7 @@ static NEVER_INLINE error_code savedata_op(ppu_thread& ppu, u32 operation, u32 v
fs::remove_all(old_path); fs::remove_all(old_path);
} }
return CELL_OK; return savedata_result;
} }
static NEVER_INLINE error_code savedata_get_list_item(vm::cptr<char> dirName, vm::ptr<CellSaveDataDirStat> dir, vm::ptr<CellSaveDataSystemFileParam> sysFileParam, vm::ptr<u32> bind, vm::ptr<u32> sizeKB, u32 userId) static NEVER_INLINE error_code savedata_get_list_item(vm::cptr<char> dirName, vm::ptr<CellSaveDataDirStat> dir, vm::ptr<CellSaveDataSystemFileParam> sysFileParam, vm::ptr<u32> bind, vm::ptr<u32> sizeKB, u32 userId)