From c32ffa1db077ca3f8044abe7c027167a9fe36956 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 11 Aug 2018 16:33:39 -0700 Subject: [PATCH 1/5] GE Debugger: Rename depth clamp more places. Was still showing clip enable in disasm. --- GPU/GPUCommon.cpp | 2 +- GPU/GeDisasm.cpp | 4 ++-- GPU/Null/NullGpu.cpp | 4 ++-- GPU/Software/SoftGpu.cpp | 2 +- GPU/ge_constants.h | 2 +- Windows/GEDebugger/TabState.cpp | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/GPU/GPUCommon.cpp b/GPU/GPUCommon.cpp index 1b9bb46283..6339504d0d 100644 --- a/GPU/GPUCommon.cpp +++ b/GPU/GPUCommon.cpp @@ -193,7 +193,7 @@ const CommonCommandTableEntry commonCommandTable[] = { { GE_CMD_VIEWPORTYCENTER, FLAG_FLUSHBEFOREONCHANGE, DIRTY_FRAMEBUF | DIRTY_TEXTURE_PARAMS | DIRTY_VIEWPORTSCISSOR_STATE }, { GE_CMD_VIEWPORTZSCALE, FLAG_FLUSHBEFOREONCHANGE, DIRTY_FRAMEBUF | DIRTY_TEXTURE_PARAMS | DIRTY_DEPTHRANGE | DIRTY_PROJMATRIX | DIRTY_VIEWPORTSCISSOR_STATE }, { GE_CMD_VIEWPORTZCENTER, FLAG_FLUSHBEFOREONCHANGE, DIRTY_FRAMEBUF | DIRTY_TEXTURE_PARAMS | DIRTY_DEPTHRANGE | DIRTY_PROJMATRIX | DIRTY_VIEWPORTSCISSOR_STATE }, - { GE_CMD_CLIPENABLE, FLAG_FLUSHBEFOREONCHANGE, DIRTY_VIEWPORTSCISSOR_STATE | DIRTY_RASTER_STATE }, + { GE_CMD_DEPTHCLAMPENABLE, FLAG_FLUSHBEFOREONCHANGE, DIRTY_VIEWPORTSCISSOR_STATE | DIRTY_RASTER_STATE }, // Z clip { GE_CMD_MINZ, FLAG_FLUSHBEFOREONCHANGE, DIRTY_DEPTHRANGE | DIRTY_VIEWPORTSCISSOR_STATE }, diff --git a/GPU/GeDisasm.cpp b/GPU/GeDisasm.cpp index d334385691..4faaca6a43 100644 --- a/GPU/GeDisasm.cpp +++ b/GPU/GeDisasm.cpp @@ -297,8 +297,8 @@ void GeDisassembleOp(u32 pc, u32 op, u32 prev, char *buffer, int bufsize) { } break; - case GE_CMD_CLIPENABLE: - snprintf(buffer, bufsize, "Clip enable: %i", data); + case GE_CMD_DEPTHCLAMPENABLE: + snprintf(buffer, bufsize, "Depth clamp enable: %i", data); break; case GE_CMD_CULLFACEENABLE: diff --git a/GPU/Null/NullGpu.cpp b/GPU/Null/NullGpu.cpp index 29a50f2054..c4b345d96e 100644 --- a/GPU/Null/NullGpu.cpp +++ b/GPU/Null/NullGpu.cpp @@ -137,8 +137,8 @@ void NullGPU::ExecuteOp(u32 op, u32 diff) { } break; - case GE_CMD_CLIPENABLE: - DEBUG_LOG(G3D, "DL Clip Enable: %i (ignoring)", data); + case GE_CMD_DEPTHCLAMPENABLE: + DEBUG_LOG(G3D, "DL Depth Clamp Enable: %i (ignoring)", data); //we always clip, this is opengl break; diff --git a/GPU/Software/SoftGpu.cpp b/GPU/Software/SoftGpu.cpp index 5d3b20c8e3..381a40403a 100644 --- a/GPU/Software/SoftGpu.cpp +++ b/GPU/Software/SoftGpu.cpp @@ -506,7 +506,7 @@ void SoftGPU::ExecuteOp(u32 op, u32 diff) { case GE_CMD_REGION2: break; - case GE_CMD_CLIPENABLE: + case GE_CMD_DEPTHCLAMPENABLE: break; case GE_CMD_CULLFACEENABLE: diff --git a/GPU/ge_constants.h b/GPU/ge_constants.h index c0b1bc067e..b765af5bcb 100644 --- a/GPU/ge_constants.h +++ b/GPU/ge_constants.h @@ -43,7 +43,7 @@ enum GECommand { GE_CMD_LIGHTENABLE1 = 0x19, GE_CMD_LIGHTENABLE2 = 0x1A, GE_CMD_LIGHTENABLE3 = 0x1B, - GE_CMD_CLIPENABLE = 0x1C, + GE_CMD_DEPTHCLAMPENABLE = 0x1C, GE_CMD_CULLFACEENABLE = 0x1D, GE_CMD_TEXTUREMAPENABLE = 0x1E, GE_CMD_FOGENABLE = 0x1F, diff --git a/Windows/GEDebugger/TabState.cpp b/Windows/GEDebugger/TabState.cpp index 494cf3e999..3b3241b947 100644 --- a/Windows/GEDebugger/TabState.cpp +++ b/Windows/GEDebugger/TabState.cpp @@ -100,7 +100,7 @@ static const TabStateRow stateFlagsRows[] = { { L"Light 1 enable", GE_CMD_LIGHTENABLE1, CMD_FMT_FLAG }, { L"Light 2 enable", GE_CMD_LIGHTENABLE2, CMD_FMT_FLAG }, { L"Light 3 enable", GE_CMD_LIGHTENABLE3, CMD_FMT_FLAG }, - { L"Clip enable", GE_CMD_CLIPENABLE, CMD_FMT_FLAG }, + { L"Depth clamp enable", GE_CMD_DEPTHCLAMPENABLE, CMD_FMT_FLAG }, { L"Cullface enable", GE_CMD_CULLFACEENABLE, CMD_FMT_FLAG }, { L"Texture map enable", GE_CMD_TEXTUREMAPENABLE, CMD_FMT_FLAG }, { L"Fog enable", GE_CMD_FOGENABLE, CMD_FMT_FLAG }, From 718053e7fce9370f927c2def2fd27207a5c450e2 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 11 Aug 2018 16:35:58 -0700 Subject: [PATCH 2/5] Savedata: Return error codes on WRITEDATA/MAKEDATA. --- Core/Dialog/PSPSaveDialog.cpp | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/Core/Dialog/PSPSaveDialog.cpp b/Core/Dialog/PSPSaveDialog.cpp index cb68396f6a..e47f51dcf7 100755 --- a/Core/Dialog/PSPSaveDialog.cpp +++ b/Core/Dialog/PSPSaveDialog.cpp @@ -1101,21 +1101,14 @@ void PSPSaveDialog::ExecuteNotVisibleIOAction() { // TODO: Should reset the directory's other files. case SCE_UTILITY_SAVEDATA_TYPE_MAKEDATA: case SCE_UTILITY_SAVEDATA_TYPE_MAKEDATASECURE: - if (param.Save(param.GetPspParam(), GetSelectedSaveDirName(), param.GetPspParam()->mode == SCE_UTILITY_SAVEDATA_TYPE_MAKEDATASECURE) == 0) { - result = 0; - } else if (MemoryStick_FreeSpace() == 0) { + result = param.Save(param.GetPspParam(), GetSelectedSaveDirName(), param.GetPspParam()->mode == SCE_UTILITY_SAVEDATA_TYPE_MAKEDATASECURE); + if (result == SCE_UTILITY_SAVEDATA_ERROR_SAVE_MS_NOSPACE) { result = SCE_UTILITY_SAVEDATA_ERROR_RW_MEMSTICK_FULL; - } else { - result = SCE_UTILITY_SAVEDATA_ERROR_RW_NO_DATA; } break; case SCE_UTILITY_SAVEDATA_TYPE_WRITEDATA: case SCE_UTILITY_SAVEDATA_TYPE_WRITEDATASECURE: - if (param.Save(param.GetPspParam(), GetSelectedSaveDirName(), param.GetPspParam()->mode == SCE_UTILITY_SAVEDATA_TYPE_WRITEDATASECURE) == 0) { - result = 0; - } else { - result = SCE_UTILITY_SAVEDATA_ERROR_RW_NO_DATA; - } + result = param.Save(param.GetPspParam(), GetSelectedSaveDirName(), param.GetPspParam()->mode == SCE_UTILITY_SAVEDATA_TYPE_WRITEDATASECURE); break; case SCE_UTILITY_SAVEDATA_TYPE_READDATA: case SCE_UTILITY_SAVEDATA_TYPE_READDATASECURE: From 42feade4607d692569534a41881c10d33f29a52f Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 11 Aug 2018 16:36:28 -0700 Subject: [PATCH 3/5] Savedata: Return error when bufSize is too small. Mirrors what a PSP does. --- Core/Dialog/SavedataParam.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Core/Dialog/SavedataParam.cpp b/Core/Dialog/SavedataParam.cpp index dfb436dca7..9a57a427f8 100644 --- a/Core/Dialog/SavedataParam.cpp +++ b/Core/Dialog/SavedataParam.cpp @@ -362,6 +362,10 @@ int SavedataParam::Save(SceUtilitySavedataParam* param, const std::string &saveD if (!param) { return SCE_UTILITY_SAVEDATA_ERROR_SAVE_MS_NOSPACE; } + if (param->dataSize > param->dataBufSize) { + ERROR_LOG_REPORT(SCEUTILITY, "Savedata buffer overflow: %d / %d", param->dataSize, param->dataBufSize); + return SCE_UTILITY_SAVEDATA_ERROR_RW_BAD_PARAMS; + } if (param->secureVersion > 3) { ERROR_LOG_REPORT(SCEUTILITY, "Savedata version requested on save: %d", param->secureVersion); return SCE_UTILITY_SAVEDATA_ERROR_SAVE_PARAM; From c0ccc9449d33eba35f2891f8054c9ed4de44c4b6 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 11 Aug 2018 16:39:11 -0700 Subject: [PATCH 4/5] Savedata: Use size, not bufSize, for icons. Verified by tests. Should help #8810. --- Core/Dialog/SavedataParam.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Core/Dialog/SavedataParam.cpp b/Core/Dialog/SavedataParam.cpp index 9a57a427f8..a6240ac13a 100644 --- a/Core/Dialog/SavedataParam.cpp +++ b/Core/Dialog/SavedataParam.cpp @@ -524,26 +524,26 @@ int SavedataParam::Save(SceUtilitySavedataParam* param, const std::string &saveD if (param->icon0FileData.buf.IsValid()) { std::string icon0path = dirPath + "/" + ICON0_FILENAME; - WritePSPFile(icon0path, param->icon0FileData.buf, param->icon0FileData.bufSize); + WritePSPFile(icon0path, param->icon0FileData.buf, param->icon0FileData.size); } // SAVE ICON1 if (param->icon1FileData.buf.IsValid()) { std::string icon1path = dirPath + "/" + ICON1_FILENAME; - WritePSPFile(icon1path, param->icon1FileData.buf, param->icon1FileData.bufSize); + WritePSPFile(icon1path, param->icon1FileData.buf, param->icon1FileData.size); } // SAVE PIC1 if (param->pic1FileData.buf.IsValid()) { std::string pic1path = dirPath + "/" + PIC1_FILENAME; - WritePSPFile(pic1path, param->pic1FileData.buf, param->pic1FileData.bufSize); + WritePSPFile(pic1path, param->pic1FileData.buf, param->pic1FileData.size); } // Save SND if (param->snd0FileData.buf.IsValid()) { std::string snd0path = dirPath + "/" + SND0_FILENAME; - WritePSPFile(snd0path, param->snd0FileData.buf, param->snd0FileData.bufSize); + WritePSPFile(snd0path, param->snd0FileData.buf, param->snd0FileData.size); } return 0; From b64bb2e8ce93a5fc9566e73bb74827a7664c97fa Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 11 Aug 2018 16:52:44 -0700 Subject: [PATCH 5/5] Savedata: Also validate icon/subdata size. --- Core/Dialog/SavedataParam.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Core/Dialog/SavedataParam.cpp b/Core/Dialog/SavedataParam.cpp index a6240ac13a..a137e779f7 100644 --- a/Core/Dialog/SavedataParam.cpp +++ b/Core/Dialog/SavedataParam.cpp @@ -366,6 +366,17 @@ int SavedataParam::Save(SceUtilitySavedataParam* param, const std::string &saveD ERROR_LOG_REPORT(SCEUTILITY, "Savedata buffer overflow: %d / %d", param->dataSize, param->dataBufSize); return SCE_UTILITY_SAVEDATA_ERROR_RW_BAD_PARAMS; } + auto validateSize = [](const PspUtilitySavedataFileData &data) { + if (data.buf.IsValid() && data.bufSize < data.size) { + ERROR_LOG_REPORT(SCEUTILITY, "Savedata subdata buffer overflow: %d / %d", data.size, data.bufSize); + return false; + } + return true; + }; + if (!validateSize(param->icon0FileData) || !validateSize(param->icon1FileData) || !validateSize(param->pic1FileData) || !validateSize(param->snd0FileData)) { + return SCE_UTILITY_SAVEDATA_ERROR_RW_BAD_PARAMS; + } + if (param->secureVersion > 3) { ERROR_LOG_REPORT(SCEUTILITY, "Savedata version requested on save: %d", param->secureVersion); return SCE_UTILITY_SAVEDATA_ERROR_SAVE_PARAM;