From 8af48d6e54032a6c895d19af2533f14d652087c1 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 24 Dec 2012 17:00:05 -0800 Subject: [PATCH 01/10] Refactor some similar code together. No functionality changes, just moving around. --- Core/Dialog/SavedataParam.cpp | 181 ++++++++++++---------------------- Core/Dialog/SavedataParam.h | 3 +- 2 files changed, 66 insertions(+), 118 deletions(-) diff --git a/Core/Dialog/SavedataParam.cpp b/Core/Dialog/SavedataParam.cpp index 8f99e0d51f..493acb280f 100644 --- a/Core/Dialog/SavedataParam.cpp +++ b/Core/Dialog/SavedataParam.cpp @@ -16,7 +16,6 @@ // https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. #include "SavedataParam.h" -#include "../System.h" #include "image/png_load.h" #include "../HLE/sceKernelMemory.h" #include "../ELF/ParamSFO.h" @@ -430,64 +429,7 @@ u32 SavedataParam::SetPspParam(SceUtilitySavedataParam *param) PSPFileInfo info = pspFileSystem.GetFileInfo(fileDataPath); if (info.exists) { - saveDataList[realCount].size = info.size; - saveDataList[realCount].saveName = saveNameListData[i]; - saveDataList[realCount].idx = i; - saveDataList[realCount].modif_time = info.mtime; - - // Search save image icon0 - // TODO : If icon0 don't exist, need to use icon1 which is a moving icon. Also play sound - std::string fileDataPath2 = savePath+GetGameName(param)+saveNameListData[i]+"/"+icon0Name; - PSPFileInfo info2 = pspFileSystem.GetFileInfo(fileDataPath2); - if (info2.exists) - { - u8 *textureDataPNG = new u8[(size_t)info2.size]; - int handle = pspFileSystem.OpenFile(fileDataPath2,FILEACCESS_READ); - pspFileSystem.ReadFile(handle,textureDataPNG,info2.size); - pspFileSystem.CloseFile(handle); - unsigned char* textureData; - int w,h; - pngLoadPtr(textureDataPNG, (int)info2.size, &w, &h, &textureData, false); - delete[] textureDataPNG; - u32 texSize = w*h*4; - u32 atlasPtr = kernelMemory.Alloc(texSize, true, "SaveData Icon"); - saveDataList[realCount].textureData = atlasPtr; - Memory::Memcpy(atlasPtr, textureData, texSize); - free(textureData); - saveDataList[realCount].textureWidth = w; - saveDataList[realCount].textureHeight = h; - } - else - { - saveDataList[realCount].textureData = 0; - } - - // Load info in PARAM.SFO - fileDataPath2 = savePath+GetGameName(param)+saveNameListData[i]+"/"+sfoName; - info2 = pspFileSystem.GetFileInfo(fileDataPath2); - if (info2.exists) - { - u8 *sfoParam = new u8[(size_t)info2.size]; - int handle = pspFileSystem.OpenFile(fileDataPath2,FILEACCESS_READ); - pspFileSystem.ReadFile(handle,sfoParam,info2.size); - pspFileSystem.CloseFile(handle); - ParamSFOData sfoFile; - if (sfoFile.ReadSFO(sfoParam, (size_t)info2.size)) - { - std::string title = sfoFile.GetValueString("TITLE"); - memcpy(saveDataList[realCount].title,title.c_str(),title.size()); - saveDataList[realCount].title[title.size()] = 0; - - std::string savetitle = sfoFile.GetValueString("SAVEDATA_TITLE"); - memcpy(saveDataList[realCount].saveTitle,savetitle.c_str(),savetitle.size()); - saveDataList[realCount].saveTitle[savetitle.size()] = 0; - - std::string savedetail = sfoFile.GetValueString("SAVEDATA_DETAIL"); - memcpy(saveDataList[realCount].saveDetail,savedetail.c_str(),savedetail.size()); - saveDataList[realCount].saveDetail[savedetail.size()] = 0; - } - delete [] sfoParam; - } + LoadFileInfo(realCount, info); DEBUG_LOG(HLE,"%s Exist",fileDataPath.c_str()); realCount++; @@ -521,64 +463,7 @@ u32 SavedataParam::SetPspParam(SceUtilitySavedataParam *param) PSPFileInfo info = pspFileSystem.GetFileInfo(fileDataPath); if (info.exists) { - saveDataList[0].size = info.size; - saveDataList[0].saveName = GetSaveName(param); - saveDataList[0].idx = 0; - saveDataList[0].modif_time = info.mtime; - - // Search save image icon0 - // TODO : If icon0 don't exist, need to use icon1 which is a moving icon. Also play sound - std::string fileDataPath2 = savePath+GetGameName(param)+GetSaveName(param)+"/"+icon0Name; - PSPFileInfo info2 = pspFileSystem.GetFileInfo(fileDataPath2); - if (info2.exists) - { - u8 *textureDataPNG = new u8[(size_t)info2.size]; - int handle = pspFileSystem.OpenFile(fileDataPath2,FILEACCESS_READ); - pspFileSystem.ReadFile(handle,textureDataPNG,info2.size); - pspFileSystem.CloseFile(handle); - unsigned char *textureData; - int w,h; - pngLoadPtr(textureDataPNG, (int)info2.size, &w, &h, &textureData, false); - delete[] textureDataPNG; - u32 texSize = w*h*4; - u32 atlasPtr = kernelMemory.Alloc(texSize, true, "SaveData Icon"); - saveDataList[0].textureData = atlasPtr; - Memory::Memcpy(atlasPtr, textureData, texSize); - free(textureData); - saveDataList[0].textureWidth = w; - saveDataList[0].textureHeight = h; - } - else - { - saveDataList[0].textureData = 0; - } - - // Load info in PARAM.SFO - fileDataPath2 = savePath+GetGameName(param)+GetSaveName(param)+"/"+sfoName; - info2 = pspFileSystem.GetFileInfo(fileDataPath2); - if (info2.exists) - { - u8 *sfoParam = new u8[(size_t)info2.size]; - int handle = pspFileSystem.OpenFile(fileDataPath2,FILEACCESS_READ); - pspFileSystem.ReadFile(handle,sfoParam,info2.size); - pspFileSystem.CloseFile(handle); - ParamSFOData sfoFile; - if (sfoFile.ReadSFO(sfoParam,(size_t)info2.size)) - { - std::string title = sfoFile.GetValueString("TITLE"); - memcpy(saveDataList[0].title,title.c_str(),title.size()); - saveDataList[0].title[title.size()] = 0; - - std::string savetitle = sfoFile.GetValueString("SAVEDATA_TITLE"); - memcpy(saveDataList[0].saveTitle,savetitle.c_str(),savetitle.size()); - saveDataList[0].saveTitle[savetitle.size()] = 0; - - std::string savedetail = sfoFile.GetValueString("SAVEDATA_DETAIL"); - memcpy(saveDataList[0].saveDetail,savedetail.c_str(),savedetail.size()); - saveDataList[0].saveDetail[savedetail.size()] = 0; - } - delete [] sfoParam; - } + LoadFileInfo(0, info); DEBUG_LOG(HLE,"%s Exist",fileDataPath.c_str()); saveNameListDataCount = 1; @@ -600,6 +485,68 @@ u32 SavedataParam::SetPspParam(SceUtilitySavedataParam *param) return 0; } +void SavedataParam::LoadFileInfo(int idx, PSPFileInfo &info) +{ + saveDataList[idx].size = info.size; + saveDataList[idx].saveName = GetSaveName(pspParam); + saveDataList[idx].idx = 0; + saveDataList[idx].modif_time = info.mtime; + + // Search save image icon0 + // TODO : If icon0 don't exist, need to use icon1 which is a moving icon. Also play sound + std::string fileDataPath2 = savePath+GetGameName(pspParam)+GetSaveName(pspParam)+"/"+icon0Name; + PSPFileInfo info2 = pspFileSystem.GetFileInfo(fileDataPath2); + if (info2.exists) + { + u8 *textureDataPNG = new u8[(size_t)info2.size]; + int handle = pspFileSystem.OpenFile(fileDataPath2,FILEACCESS_READ); + pspFileSystem.ReadFile(handle,textureDataPNG,info2.size); + pspFileSystem.CloseFile(handle); + unsigned char *textureData; + int w,h; + pngLoadPtr(textureDataPNG, (int)info2.size, &w, &h, &textureData, false); + delete[] textureDataPNG; + u32 texSize = w*h*4; + u32 atlasPtr = kernelMemory.Alloc(texSize, true, "SaveData Icon"); + saveDataList[idx].textureData = atlasPtr; + Memory::Memcpy(atlasPtr, textureData, texSize); + free(textureData); + saveDataList[idx].textureWidth = w; + saveDataList[idx].textureHeight = h; + } + else + { + saveDataList[idx].textureData = 0; + } + + // Load info in PARAM.SFO + fileDataPath2 = savePath+GetGameName(pspParam)+GetSaveName(pspParam)+"/"+sfoName; + info2 = pspFileSystem.GetFileInfo(fileDataPath2); + if (info2.exists) + { + u8 *sfoParam = new u8[(size_t)info2.size]; + int handle = pspFileSystem.OpenFile(fileDataPath2,FILEACCESS_READ); + pspFileSystem.ReadFile(handle,sfoParam,info2.size); + pspFileSystem.CloseFile(handle); + ParamSFOData sfoFile; + if (sfoFile.ReadSFO(sfoParam,(size_t)info2.size)) + { + std::string title = sfoFile.GetValueString("TITLE"); + memcpy(saveDataList[idx].title,title.c_str(),title.size()); + saveDataList[idx].title[title.size()] = 0; + + std::string savetitle = sfoFile.GetValueString("SAVEDATA_TITLE"); + memcpy(saveDataList[idx].saveTitle,savetitle.c_str(),savetitle.size()); + saveDataList[idx].saveTitle[savetitle.size()] = 0; + + std::string savedetail = sfoFile.GetValueString("SAVEDATA_DETAIL"); + memcpy(saveDataList[idx].saveDetail,savedetail.c_str(),savedetail.size()); + saveDataList[idx].saveDetail[savedetail.size()] = 0; + } + delete [] sfoParam; + } +} + SceUtilitySavedataParam* SavedataParam::GetPspParam() { return pspParam; diff --git a/Core/Dialog/SavedataParam.h b/Core/Dialog/SavedataParam.h index 841f0cf811..d5be3a30d6 100644 --- a/Core/Dialog/SavedataParam.h +++ b/Core/Dialog/SavedataParam.h @@ -18,7 +18,7 @@ #pragma once #include "../HLE/sceKernel.h" - +#include "../System.h" enum SceUtilitySavedataType { @@ -168,6 +168,7 @@ public: private: void Clear(); + void LoadFileInfo(int idx, PSPFileInfo &info); SceUtilitySavedataParam* pspParam; int selectedSave; From cb544261b55ad077b114c130e71ce9db9b4d1092 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 24 Dec 2012 17:04:49 -0800 Subject: [PATCH 02/10] Fix crash loading bad png file in savedata. --- Core/Dialog/SavedataParam.cpp | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/Core/Dialog/SavedataParam.cpp b/Core/Dialog/SavedataParam.cpp index 493acb280f..c4b4f29cc0 100644 --- a/Core/Dialog/SavedataParam.cpp +++ b/Core/Dialog/SavedataParam.cpp @@ -504,15 +504,22 @@ void SavedataParam::LoadFileInfo(int idx, PSPFileInfo &info) pspFileSystem.CloseFile(handle); unsigned char *textureData; int w,h; - pngLoadPtr(textureDataPNG, (int)info2.size, &w, &h, &textureData, false); + + int success = pngLoadPtr(textureDataPNG, (int)info2.size, &w, &h, &textureData, false); delete[] textureDataPNG; - u32 texSize = w*h*4; - u32 atlasPtr = kernelMemory.Alloc(texSize, true, "SaveData Icon"); - saveDataList[idx].textureData = atlasPtr; - Memory::Memcpy(atlasPtr, textureData, texSize); - free(textureData); - saveDataList[idx].textureWidth = w; - saveDataList[idx].textureHeight = h; + + if (success) + { + u32 texSize = w*h*4; + u32 atlasPtr = kernelMemory.Alloc(texSize, true, "SaveData Icon"); + saveDataList[idx].textureData = atlasPtr; + Memory::Memcpy(atlasPtr, textureData, texSize); + free(textureData); + saveDataList[idx].textureWidth = w; + saveDataList[idx].textureHeight = h; + } + else + saveDataList[idx].textureData = 0; } else { From efefa80ab9548dd51509909923ab3e63f9d3235c Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 24 Dec 2012 17:05:54 -0800 Subject: [PATCH 03/10] Fix a couple warnings on 32 bit in savedata. --- Core/Dialog/SavedataParam.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Core/Dialog/SavedataParam.cpp b/Core/Dialog/SavedataParam.cpp index c4b4f29cc0..6f53cfd3f1 100644 --- a/Core/Dialog/SavedataParam.cpp +++ b/Core/Dialog/SavedataParam.cpp @@ -34,7 +34,7 @@ namespace { int getSizeNormalized(int size) { - int sizeCluster = MemoryStick_SectorSize(); + int sizeCluster = (int)MemoryStick_SectorSize(); return ((int)((size + sizeCluster - 1) / sizeCluster)) * sizeCluster; } } @@ -309,7 +309,7 @@ bool SavedataParam::GetSizes(SceUtilitySavedataParam *param) Memory::Write_U32((u32)MemoryStick_SectorSize(),param->msFree); // cluster Size Memory::Write_U32((u32)(MemoryStick_FreeSpace() / MemoryStick_SectorSize()),param->msFree+4); // Free cluster Memory::Write_U32((u32)(MemoryStick_FreeSpace() / 0x400),param->msFree+8); // Free space (in KB) - std::string spaceTxt = SavedataParam::GetSpaceText(MemoryStick_FreeSpace()); + std::string spaceTxt = SavedataParam::GetSpaceText((int)MemoryStick_FreeSpace()); Memory::Memset(param->msFree+12,0,spaceTxt.size()+1); Memory::Memcpy(param->msFree+12,spaceTxt.c_str(),spaceTxt.size()); // Text representing free space } @@ -346,7 +346,7 @@ bool SavedataParam::GetSizes(SceUtilitySavedataParam *param) total_size += getSizeNormalized(param->pic1FileData.size); total_size += getSizeNormalized(param->snd0FileData.size); - Memory::Write_U32(total_size / MemoryStick_SectorSize(),param->utilityData); // num cluster + Memory::Write_U32(total_size / (u32)MemoryStick_SectorSize(),param->utilityData); // num cluster Memory::Write_U32(total_size / 0x400,param->utilityData+4); // save size in KB std::string spaceTxt = SavedataParam::GetSpaceText(total_size); Memory::Memset(param->utilityData+8,0,spaceTxt.size()+1); From ca22e38752a75f8cb628a7e9e3193257b471edba Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 24 Dec 2012 17:07:00 -0800 Subject: [PATCH 04/10] Fix another potential png load failure. Also, rename func for consistency. --- Core/Dialog/SavedataParam.cpp | 15 ++++++++++----- Core/Dialog/SavedataParam.h | 2 +- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/Core/Dialog/SavedataParam.cpp b/Core/Dialog/SavedataParam.cpp index 6f53cfd3f1..19584711a9 100644 --- a/Core/Dialog/SavedataParam.cpp +++ b/Core/Dialog/SavedataParam.cpp @@ -429,7 +429,7 @@ u32 SavedataParam::SetPspParam(SceUtilitySavedataParam *param) PSPFileInfo info = pspFileSystem.GetFileInfo(fileDataPath); if (info.exists) { - LoadFileInfo(realCount, info); + SetFileInfo(realCount, info); DEBUG_LOG(HLE,"%s Exist",fileDataPath.c_str()); realCount++; @@ -463,7 +463,7 @@ u32 SavedataParam::SetPspParam(SceUtilitySavedataParam *param) PSPFileInfo info = pspFileSystem.GetFileInfo(fileDataPath); if (info.exists) { - LoadFileInfo(0, info); + SetFileInfo(0, info); DEBUG_LOG(HLE,"%s Exist",fileDataPath.c_str()); saveNameListDataCount = 1; @@ -485,7 +485,7 @@ u32 SavedataParam::SetPspParam(SceUtilitySavedataParam *param) return 0; } -void SavedataParam::LoadFileInfo(int idx, PSPFileInfo &info) +void SavedataParam::SetFileInfo(int idx, PSPFileInfo &info) { saveDataList[idx].size = info.size; saveDataList[idx].saveName = GetSaveName(pspParam); @@ -508,10 +508,12 @@ void SavedataParam::LoadFileInfo(int idx, PSPFileInfo &info) int success = pngLoadPtr(textureDataPNG, (int)info2.size, &w, &h, &textureData, false); delete[] textureDataPNG; + u32 texSize = w*h*4; + u32 atlasPtr; if (success) + atlasPtr = kernelMemory.Alloc(texSize, true, "SaveData Icon"); + if (success && atlasPtr > 0) { - u32 texSize = w*h*4; - u32 atlasPtr = kernelMemory.Alloc(texSize, true, "SaveData Icon"); saveDataList[idx].textureData = atlasPtr; Memory::Memcpy(atlasPtr, textureData, texSize); free(textureData); @@ -519,7 +521,10 @@ void SavedataParam::LoadFileInfo(int idx, PSPFileInfo &info) saveDataList[idx].textureHeight = h; } else + { + WARN_LOG(HLE, "Unable to load PNG data for savedata."); saveDataList[idx].textureData = 0; + } } else { diff --git a/Core/Dialog/SavedataParam.h b/Core/Dialog/SavedataParam.h index d5be3a30d6..616e26d48d 100644 --- a/Core/Dialog/SavedataParam.h +++ b/Core/Dialog/SavedataParam.h @@ -168,7 +168,7 @@ public: private: void Clear(); - void LoadFileInfo(int idx, PSPFileInfo &info); + void SetFileInfo(int idx, PSPFileInfo &info); SceUtilitySavedataParam* pspParam; int selectedSave; From f983c8af5cf4f3bde878c4ed4dc33536c63a95e9 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 24 Dec 2012 17:18:59 -0800 Subject: [PATCH 05/10] Protect against an unlikely buffer overflow. --- Core/Dialog/SavedataParam.cpp | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/Core/Dialog/SavedataParam.cpp b/Core/Dialog/SavedataParam.cpp index 19584711a9..32b4dadd11 100644 --- a/Core/Dialog/SavedataParam.cpp +++ b/Core/Dialog/SavedataParam.cpp @@ -37,6 +37,13 @@ namespace int sizeCluster = (int)MemoryStick_SectorSize(); return ((int)((size + sizeCluster - 1) / sizeCluster)) * sizeCluster; } + + void SetStringFromSFO(ParamSFOData &sfoFile, const char *name, char *str, int strLength) + { + std::string value = sfoFile.GetValueString(name); + strncpy(str, value.c_str(), strLength - 1); + str[strLength - 1] = 0; + } } SavedataParam::SavedataParam() @@ -543,17 +550,9 @@ void SavedataParam::SetFileInfo(int idx, PSPFileInfo &info) ParamSFOData sfoFile; if (sfoFile.ReadSFO(sfoParam,(size_t)info2.size)) { - std::string title = sfoFile.GetValueString("TITLE"); - memcpy(saveDataList[idx].title,title.c_str(),title.size()); - saveDataList[idx].title[title.size()] = 0; - - std::string savetitle = sfoFile.GetValueString("SAVEDATA_TITLE"); - memcpy(saveDataList[idx].saveTitle,savetitle.c_str(),savetitle.size()); - saveDataList[idx].saveTitle[savetitle.size()] = 0; - - std::string savedetail = sfoFile.GetValueString("SAVEDATA_DETAIL"); - memcpy(saveDataList[idx].saveDetail,savedetail.c_str(),savedetail.size()); - saveDataList[idx].saveDetail[savedetail.size()] = 0; + SetStringFromSFO(sfoFile, "TITLE", saveDataList[idx].title, sizeof(saveDataList[idx].title)); + SetStringFromSFO(sfoFile, "SAVEDATA_TITLE", saveDataList[idx].saveTitle, sizeof(saveDataList[idx].saveTitle)); + SetStringFromSFO(sfoFile, "SAVEDATA_DETAIL", saveDataList[idx].saveDetail, sizeof(saveDataList[idx].saveDetail)); } delete [] sfoParam; } From db6ef8ce642c21c70e2bc6912d27740e8eb537a9 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 24 Dec 2012 17:32:14 -0800 Subject: [PATCH 06/10] Simplify reading/writing in one shot. --- Core/Dialog/SavedataParam.cpp | 88 +++++++++++++---------------------- 1 file changed, 33 insertions(+), 55 deletions(-) diff --git a/Core/Dialog/SavedataParam.cpp b/Core/Dialog/SavedataParam.cpp index 32b4dadd11..5385acb652 100644 --- a/Core/Dialog/SavedataParam.cpp +++ b/Core/Dialog/SavedataParam.cpp @@ -44,6 +44,30 @@ namespace strncpy(str, value.c_str(), strLength - 1); str[strLength - 1] = 0; } + + bool ReadPSPFile(std::string filename, u8 *data, s64 dataSize) + { + u32 handle = pspFileSystem.OpenFile(filename, FILEACCESS_READ); + if (handle == 0) + return false; + + int result = pspFileSystem.ReadFile(handle, data, dataSize); + pspFileSystem.CloseFile(handle); + + return result != 0; + } + + bool WritePSPFile(std::string filename, u8 *data, int dataSize) + { + u32 handle = pspFileSystem.OpenFile(filename, (FileAccess)(FILEACCESS_WRITE | FILEACCESS_CREATE)); + if (handle == 0) + return false; + + int result = pspFileSystem.WriteFile(handle, data, dataSize); + pspFileSystem.CloseFile(handle); + + return result != 0; + } } SavedataParam::SavedataParam() @@ -145,22 +169,13 @@ bool SavedataParam::Save(SceUtilitySavedataParam* param, int saveId) std::string filePath = dirPath+"/"+GetFileName(param); INFO_LOG(HLE,"Saving file with size %u in %s",param->dataBufSize,filePath.c_str()); - unsigned int handle = pspFileSystem.OpenFile(filePath,(FileAccess)(FILEACCESS_WRITE | FILEACCESS_CREATE)); - if (handle == 0) + if (!WritePSPFile(filePath, data_, param->dataBufSize)) { - ERROR_LOG(HLE,"Error opening file %s",filePath.c_str()); - return false; - } - if (!pspFileSystem.WriteFile(handle, data_, param->dataBufSize)) - { - pspFileSystem.CloseFile(handle); ERROR_LOG(HLE,"Error writing file %s",filePath.c_str()); return false; } else { - pspFileSystem.CloseFile(handle); - // SAVE PARAM.SFO ParamSFOData sfoFile; sfoFile.SetValue("TITLE",param->sfoParam.title,128); @@ -175,12 +190,7 @@ bool SavedataParam::Save(SceUtilitySavedataParam* param, int saveId) size_t sfoSize; sfoFile.WriteSFO(&sfoData,&sfoSize); std::string sfopath = dirPath+"/"+sfoName; - handle = pspFileSystem.OpenFile(sfopath,(FileAccess)(FILEACCESS_WRITE | FILEACCESS_CREATE)); - if (handle) - { - pspFileSystem.WriteFile(handle, sfoData, sfoSize); - pspFileSystem.CloseFile(handle); - } + WritePSPFile(sfopath, sfoData, sfoSize); delete[] sfoData; // SAVE ICON0 @@ -188,36 +198,21 @@ bool SavedataParam::Save(SceUtilitySavedataParam* param, int saveId) { data_ = (u8*)Memory::GetPointer(*((unsigned int*)¶m->icon0FileData.buf)); std::string icon0path = dirPath+"/"+icon0Name; - handle = pspFileSystem.OpenFile(icon0path,(FileAccess)(FILEACCESS_WRITE | FILEACCESS_CREATE)); - if (handle) - { - pspFileSystem.WriteFile(handle, data_, param->icon0FileData.bufSize); - pspFileSystem.CloseFile(handle); - } + WritePSPFile(icon0path, data_, param->icon0FileData.bufSize); } // SAVE ICON1 if (param->icon1FileData.buf) { data_ = (u8*)Memory::GetPointer(*((unsigned int*)¶m->icon1FileData.buf)); std::string icon1path = dirPath+"/"+icon1Name; - handle = pspFileSystem.OpenFile(icon1path,(FileAccess)(FILEACCESS_WRITE | FILEACCESS_CREATE)); - if (handle) - { - pspFileSystem.WriteFile(handle, data_, param->icon1FileData.bufSize); - pspFileSystem.CloseFile(handle); - } + WritePSPFile(icon1path, data_, param->icon1FileData.bufSize); } // SAVE PIC1 if (param->pic1FileData.buf) { data_ = (u8*)Memory::GetPointer(*((unsigned int*)¶m->pic1FileData.buf)); std::string pic1path = dirPath+"/"+pic1Name; - handle = pspFileSystem.OpenFile(pic1path,(FileAccess)(FILEACCESS_WRITE | FILEACCESS_CREATE)); - if (handle) - { - pspFileSystem.WriteFile(handle, data_, param->pic1FileData.bufSize); - pspFileSystem.CloseFile(handle); - } + WritePSPFile(pic1path, data_, param->pic1FileData.bufSize); } // Save SND @@ -225,12 +220,7 @@ bool SavedataParam::Save(SceUtilitySavedataParam* param, int saveId) { data_ = (u8*)Memory::GetPointer(*((unsigned int*)¶m->snd0FileData.buf)); std::string snd0path = dirPath+"/"+snd0Name; - handle = pspFileSystem.OpenFile(snd0path,(FileAccess)(FILEACCESS_WRITE | FILEACCESS_CREATE)); - if (handle) - { - pspFileSystem.WriteFile(handle, data_, param->snd0FileData.bufSize); - pspFileSystem.CloseFile(handle); - } + WritePSPFile(snd0path, data_, param->snd0FileData.bufSize); } } return true; @@ -255,19 +245,11 @@ bool SavedataParam::Load(SceUtilitySavedataParam *param, int saveId) std::string filePath = dirPath+"/"+GetFileName(param); INFO_LOG(HLE,"Loading file with size %u in %s",param->dataBufSize,filePath.c_str()); - u32 handle = pspFileSystem.OpenFile(filePath,FILEACCESS_READ); - if (!handle) + if (!ReadPSPFile(filePath, data_, param->dataBufSize)) { - ERROR_LOG(HLE,"Error opening file %s",filePath.c_str()); - return false; - } - if (!pspFileSystem.ReadFile(handle, data_, param->dataBufSize)) - { - pspFileSystem.CloseFile(handle); ERROR_LOG(HLE,"Error reading file %s",filePath.c_str()); return false; } - pspFileSystem.CloseFile(handle); return true; } @@ -506,9 +488,7 @@ void SavedataParam::SetFileInfo(int idx, PSPFileInfo &info) if (info2.exists) { u8 *textureDataPNG = new u8[(size_t)info2.size]; - int handle = pspFileSystem.OpenFile(fileDataPath2,FILEACCESS_READ); - pspFileSystem.ReadFile(handle,textureDataPNG,info2.size); - pspFileSystem.CloseFile(handle); + ReadPSPFile(fileDataPath2, textureDataPNG, info2.size); unsigned char *textureData; int w,h; @@ -544,9 +524,7 @@ void SavedataParam::SetFileInfo(int idx, PSPFileInfo &info) if (info2.exists) { u8 *sfoParam = new u8[(size_t)info2.size]; - int handle = pspFileSystem.OpenFile(fileDataPath2,FILEACCESS_READ); - pspFileSystem.ReadFile(handle,sfoParam,info2.size); - pspFileSystem.CloseFile(handle); + ReadPSPFile(fileDataPath2, sfoParam, info2.size); ParamSFOData sfoFile; if (sfoFile.ReadSFO(sfoParam,(size_t)info2.size)) { From f8f581794ffb90a0a2c2b0db0ec581c1410cb429 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 24 Dec 2012 18:37:28 -0800 Subject: [PATCH 07/10] Make sure sceUtility funcs all return error codes. Right now, everything is 0, but before it wasn't returning anything. Returning 0 actually made some games start working right. --- Core/Dialog/PSPDialog.cpp | 7 +-- Core/Dialog/PSPDialog.h | 4 +- Core/Dialog/PSPMsgDialog.cpp | 19 +++---- Core/Dialog/PSPMsgDialog.h | 6 +-- Core/Dialog/PSPOskDialog.cpp | 4 +- Core/Dialog/PSPOskDialog.h | 2 +- Core/Dialog/PSPPlaceholderDialog.cpp | 6 ++- Core/Dialog/PSPPlaceholderDialog.h | 4 +- Core/Dialog/PSPSaveDialog.cpp | 13 +++-- Core/Dialog/PSPSaveDialog.h | 6 +-- Core/Dialog/SavedataParam.cpp | 2 +- Core/Dialog/SavedataParam.h | 2 +- Core/HLE/sceUtility.cpp | 74 +++++++++++++--------------- 13 files changed, 77 insertions(+), 72 deletions(-) diff --git a/Core/Dialog/PSPDialog.cpp b/Core/Dialog/PSPDialog.cpp index 0f0e469543..daf9c967ce 100644 --- a/Core/Dialog/PSPDialog.cpp +++ b/Core/Dialog/PSPDialog.cpp @@ -53,14 +53,15 @@ void PSPDialog::DisplayMessage(std::string text) PPGeDrawText(text.c_str(), 480/2, 100, PPGE_ALIGN_CENTER, 0.5f, 0xFFFFFFFF); } -void PSPDialog::Shutdown() +int PSPDialog::Shutdown() { status = SCE_UTILITY_STATUS_SHUTDOWN; + return 0; } -void PSPDialog::Update() +int PSPDialog::Update() { - + return 0; } bool PSPDialog::IsButtonPressed(int checkButton) diff --git a/Core/Dialog/PSPDialog.h b/Core/Dialog/PSPDialog.h index efab28f823..c9c06120c8 100644 --- a/Core/Dialog/PSPDialog.h +++ b/Core/Dialog/PSPDialog.h @@ -45,8 +45,8 @@ public: PSPDialog(); virtual ~PSPDialog(); - virtual void Update(); - virtual void Shutdown(); + virtual int Update(); + virtual int Shutdown(); enum DialogStatus { diff --git a/Core/Dialog/PSPMsgDialog.cpp b/Core/Dialog/PSPMsgDialog.cpp index 1ca3fe7d94..5d0fa4a06b 100644 --- a/Core/Dialog/PSPMsgDialog.cpp +++ b/Core/Dialog/PSPMsgDialog.cpp @@ -29,18 +29,18 @@ PSPMsgDialog::PSPMsgDialog() PSPMsgDialog::~PSPMsgDialog() { } -void PSPMsgDialog::Init(unsigned int paramAddr) +int PSPMsgDialog::Init(unsigned int paramAddr) { // Ignore if already running if (status != SCE_UTILITY_STATUS_NONE && status != SCE_UTILITY_STATUS_SHUTDOWN) { - return; + return 0; } messageDialogAddr = paramAddr; if (!Memory::IsValidAddress(messageDialogAddr)) { - return; + return 0; } Memory::ReadStruct(messageDialogAddr, &messageDialog); @@ -63,7 +63,7 @@ void PSPMsgDialog::Init(unsigned int paramAddr) status = SCE_UTILITY_STATUS_INITIALIZE; lastButtons = __CtrlPeekButtons(); - + return 0; } void PSPMsgDialog::DisplayBack() @@ -95,7 +95,7 @@ void PSPMsgDialog::DisplayEnterBack() PPGeDrawText("Back", 320, 220, PPGE_ALIGN_LEFT, 0.5f, 0xFFFFFFFF); } -void PSPMsgDialog::Update() +int PSPMsgDialog::Update() { switch (status) { case SCE_UTILITY_STATUS_FINISHED: @@ -105,7 +105,7 @@ void PSPMsgDialog::Update() if (status != SCE_UTILITY_STATUS_RUNNING) { - return; + return 0; } const char *text; @@ -191,17 +191,18 @@ void PSPMsgDialog::Update() break; default: status = SCE_UTILITY_STATUS_FINISHED; - return; + return 0; break; } lastButtons = buttons; Memory::WriteStruct(messageDialogAddr, &messageDialog); + return 0; } -void PSPMsgDialog::Shutdown() +int PSPMsgDialog::Shutdown() { - PSPDialog::Shutdown(); + return PSPDialog::Shutdown(); } diff --git a/Core/Dialog/PSPMsgDialog.h b/Core/Dialog/PSPMsgDialog.h index e3c1af1699..80b1f24e9f 100644 --- a/Core/Dialog/PSPMsgDialog.h +++ b/Core/Dialog/PSPMsgDialog.h @@ -41,9 +41,9 @@ public: PSPMsgDialog(); virtual ~PSPMsgDialog(); - virtual void Init(unsigned int paramAddr); - virtual void Update(); - void Shutdown(); + virtual int Init(unsigned int paramAddr); + virtual int Update(); + int Shutdown(); private : void DisplayBack(); diff --git a/Core/Dialog/PSPOskDialog.cpp b/Core/Dialog/PSPOskDialog.cpp index f2d186c5a5..a1c6e8fe7b 100644 --- a/Core/Dialog/PSPOskDialog.cpp +++ b/Core/Dialog/PSPOskDialog.cpp @@ -143,7 +143,7 @@ void PSPOskDialog::RenderKeyboard() } -void PSPOskDialog::Update() +int PSPOskDialog::Update() { buttons = __CtrlReadLatch(); int selectedRow = selectedChar / KEYSPERROW; @@ -230,4 +230,6 @@ void PSPOskDialog::Update() oskData.result = PSP_UTILITY_OSK_RESULT_CHANGED; Memory::WriteStruct(oskParams.SceUtilityOskDataPtr, &oskData); Memory::WriteStruct(oskParamsAddr, &oskParams); + + return 0; } diff --git a/Core/Dialog/PSPOskDialog.h b/Core/Dialog/PSPOskDialog.h index 9939923499..387abc32b9 100644 --- a/Core/Dialog/PSPOskDialog.h +++ b/Core/Dialog/PSPOskDialog.h @@ -145,7 +145,7 @@ public: virtual ~PSPOskDialog(); virtual int Init(u32 oskPtr); - virtual void Update(); + virtual int Update(); private: void HackyGetStringWide(std::string& _string, const u32 em_address); void RenderKeyboard(); diff --git a/Core/Dialog/PSPPlaceholderDialog.cpp b/Core/Dialog/PSPPlaceholderDialog.cpp index ccd26ed8b6..72e8670316 100644 --- a/Core/Dialog/PSPPlaceholderDialog.cpp +++ b/Core/Dialog/PSPPlaceholderDialog.cpp @@ -25,12 +25,13 @@ PSPPlaceholderDialog::~PSPPlaceholderDialog() { } -void PSPPlaceholderDialog::Init() +int PSPPlaceholderDialog::Init() { status = SCE_UTILITY_STATUS_INITIALIZE; + return 0; } -void PSPPlaceholderDialog::Update() +int PSPPlaceholderDialog::Update() { //__UtilityUpdate(); if (status == SCE_UTILITY_STATUS_INITIALIZE) @@ -45,4 +46,5 @@ void PSPPlaceholderDialog::Update() { status = SCE_UTILITY_STATUS_SHUTDOWN; } + return 0; } diff --git a/Core/Dialog/PSPPlaceholderDialog.h b/Core/Dialog/PSPPlaceholderDialog.h index 7854b07dc2..7ba4a989de 100644 --- a/Core/Dialog/PSPPlaceholderDialog.h +++ b/Core/Dialog/PSPPlaceholderDialog.h @@ -24,7 +24,7 @@ public: PSPPlaceholderDialog(); virtual ~PSPPlaceholderDialog(); - virtual void Init(); - virtual void Update(); + virtual int Init(); + virtual int Update(); }; diff --git a/Core/Dialog/PSPSaveDialog.cpp b/Core/Dialog/PSPSaveDialog.cpp index 0e4f27beb3..e89a427c9c 100644 --- a/Core/Dialog/PSPSaveDialog.cpp +++ b/Core/Dialog/PSPSaveDialog.cpp @@ -31,7 +31,7 @@ PSPSaveDialog::PSPSaveDialog() PSPSaveDialog::~PSPSaveDialog() { } -u32 PSPSaveDialog::Init(int paramAddr) +int PSPSaveDialog::Init(int paramAddr) { // Ignore if already running if (status != SCE_UTILITY_STATUS_NONE && status != SCE_UTILITY_STATUS_SHUTDOWN) @@ -315,7 +315,7 @@ void PSPSaveDialog::DisplayBack() PPGeDrawText("Back", 270, 220, PPGE_ALIGN_LEFT, 0.5f, 0xFFFFFFFF); } -void PSPSaveDialog::Update() +int PSPSaveDialog::Update() { switch (status) { case SCE_UTILITY_STATUS_FINISHED: @@ -327,12 +327,12 @@ void PSPSaveDialog::Update() if (status != SCE_UTILITY_STATUS_RUNNING) { - return; + return 0; } if (!param.GetPspParam()) { status = SCE_UTILITY_STATUS_SHUTDOWN; - return; + return 0; } buttons = __CtrlPeekButtons(); @@ -684,11 +684,14 @@ void PSPSaveDialog::Update() Memory::Memcpy(requestAddr,&request,request.size); } + return 0; } -void PSPSaveDialog::Shutdown() +int PSPSaveDialog::Shutdown() { PSPDialog::Shutdown(); param.SetPspParam(0); + + return 0; } diff --git a/Core/Dialog/PSPSaveDialog.h b/Core/Dialog/PSPSaveDialog.h index 6ee98f59f3..14034e6fa2 100644 --- a/Core/Dialog/PSPSaveDialog.h +++ b/Core/Dialog/PSPSaveDialog.h @@ -62,9 +62,9 @@ public: PSPSaveDialog(); virtual ~PSPSaveDialog(); - virtual u32 Init(int paramAddr); - virtual void Update(); - void Shutdown(); + virtual int Init(int paramAddr); + virtual int Update(); + int Shutdown(); private : diff --git a/Core/Dialog/SavedataParam.cpp b/Core/Dialog/SavedataParam.cpp index 5385acb652..6c28c53485 100644 --- a/Core/Dialog/SavedataParam.cpp +++ b/Core/Dialog/SavedataParam.cpp @@ -378,7 +378,7 @@ void SavedataParam::Clear() } } -u32 SavedataParam::SetPspParam(SceUtilitySavedataParam *param) +int SavedataParam::SetPspParam(SceUtilitySavedataParam *param) { pspParam = param; if (!pspParam) diff --git a/Core/Dialog/SavedataParam.h b/Core/Dialog/SavedataParam.h index 616e26d48d..fb248e43d5 100644 --- a/Core/Dialog/SavedataParam.h +++ b/Core/Dialog/SavedataParam.h @@ -156,7 +156,7 @@ public: SavedataParam(); - u32 SetPspParam(SceUtilitySavedataParam* param); + int SetPspParam(SceUtilitySavedataParam* param); SceUtilitySavedataParam* GetPspParam(); int GetFilenameCount(); diff --git a/Core/HLE/sceUtility.cpp b/Core/HLE/sceUtility.cpp index b66f705066..0d2340e0da 100644 --- a/Core/HLE/sceUtility.cpp +++ b/Core/HLE/sceUtility.cpp @@ -50,14 +50,13 @@ void __UtilityShutdown() int sceUtilitySavedataInitStart(u32 paramAddr) { DEBUG_LOG(HLE,"sceUtilitySavedataInitStart(%08x)", paramAddr); - return (u32)saveDialog.Init(paramAddr); + return saveDialog.Init(paramAddr); } int sceUtilitySavedataShutdownStart() { DEBUG_LOG(HLE,"sceUtilitySavedataShutdownStart()"); - saveDialog.Shutdown(); - return 0; + return saveDialog.Shutdown(); } int sceUtilitySavedataGetStatus() @@ -65,13 +64,10 @@ int sceUtilitySavedataGetStatus() return saveDialog.GetStatus(); } -void sceUtilitySavedataUpdate(u32 unknown) +int sceUtilitySavedataUpdate(int animSpeed) { - DEBUG_LOG(HLE,"sceUtilitySavedataUpdate()"); - - saveDialog.Update(); - - return; + DEBUG_LOG(HLE,"sceUtilitySavedataUpdate(%d)", animSpeed); + return saveDialog.Update(); } #define PSP_AV_MODULE_AVCODEC 0 @@ -99,26 +95,27 @@ void sceUtilityLoadModule(u32 module) __KernelReSchedule("utilityloadmodule"); } -void sceUtilityMsgDialogInitStart(u32 structAddr) +int sceUtilityMsgDialogInitStart(u32 structAddr) { DEBUG_LOG(HLE,"sceUtilityMsgDialogInitStart(%i)", structAddr); - msgDialog.Init(structAddr); + return msgDialog.Init(structAddr); } -void sceUtilityMsgDialogShutdownStart(u32 unknown) +int sceUtilityMsgDialogShutdownStart(u32 unknown) { DEBUG_LOG(HLE,"FAKE sceUtilityMsgDialogShutdownStart(%i)", unknown); - msgDialog.Shutdown(); + return msgDialog.Shutdown(); } -void sceUtilityMsgDialogUpdate(int animSpeed) +int sceUtilityMsgDialogUpdate(int animSpeed) { DEBUG_LOG(HLE,"sceUtilityMsgDialogUpdate(%i)", animSpeed); - msgDialog.Update(); + return msgDialog.Update(); } -u32 sceUtilityMsgDialogGetStatus() +int sceUtilityMsgDialogGetStatus() { + DEBUG_LOG(HLE,"sceUtilityMsgDialogGetStatus()"); return msgDialog.GetStatus(); } @@ -134,14 +131,13 @@ int sceUtilityOskInitStart(u32 oskPtr) int sceUtilityOskShutdownStart() { ERROR_LOG(HLE,"FAKE sceUtilityOskShutdownStart(%i)", PARAM(0)); - oskDialog.Shutdown(); - return 0; + return oskDialog.Shutdown(); } -void sceUtilityOskUpdate(unsigned int unknown) +int sceUtilityOskUpdate(unsigned int unknown) { ERROR_LOG(HLE,"FAKE sceUtilityOskUpdate(%i)", unknown); - oskDialog.Update(); + return oskDialog.Update(); } int sceUtilityOskGetStatus() @@ -156,25 +152,25 @@ int sceUtilityOskGetStatus() } -void sceUtilityNetconfInitStart(unsigned int unknown) +int sceUtilityNetconfInitStart(u32 structAddr) { - DEBUG_LOG(HLE,"FAKE sceUtilityNetconfInitStart(%i)", unknown); - netDialog.Init(); + DEBUG_LOG(HLE,"FAKE sceUtilityNetconfInitStart(%08x)", structAddr); + return netDialog.Init(); } -void sceUtilityNetconfShutdownStart(unsigned int unknown) +int sceUtilityNetconfShutdownStart(unsigned int unknown) { DEBUG_LOG(HLE,"FAKE sceUtilityNetconfShutdownStart(%i)", unknown); - netDialog.Shutdown(); + return netDialog.Shutdown(); } -void sceUtilityNetconfUpdate(int unknown) +int sceUtilityNetconfUpdate(int animSpeed) { - DEBUG_LOG(HLE,"FAKE sceUtilityNetconfUpdate(%i)", unknown); - netDialog.Update(); + DEBUG_LOG(HLE,"FAKE sceUtilityNetconfUpdate(%i)", animSpeed); + return netDialog.Update(); } -unsigned int sceUtilityNetconfGetStatus() +int sceUtilityNetconfGetStatus() { DEBUG_LOG(HLE,"sceUtilityNetconfGetStatus()"); return netDialog.GetStatus(); @@ -356,28 +352,28 @@ const HLEFunction sceUtility[] = {0x64d50c56, &WrapU_U, "sceUtilityUnloadNetModule"}, - {0xf88155f6, &WrapV_U, "sceUtilityNetconfShutdownStart"}, - {0x4db1e739, &WrapV_U, "sceUtilityNetconfInitStart"}, - {0x91e70e35, &WrapV_I, "sceUtilityNetconfUpdate"}, - {0x6332aa39, &WrapU_V, "sceUtilityNetconfGetStatus"}, + {0xf88155f6, &WrapI_U, "sceUtilityNetconfShutdownStart"}, + {0x4db1e739, &WrapI_U, "sceUtilityNetconfInitStart"}, + {0x91e70e35, &WrapI_I, "sceUtilityNetconfUpdate"}, + {0x6332aa39, &WrapI_V, "sceUtilityNetconfGetStatus"}, {0x5eee6548, 0, "sceUtilityCheckNetParam"}, {0x434d4b3a, 0, "sceUtilityGetNetParam"}, {0x4FED24D8, 0, "sceUtilityGetNetParamLatestID"}, - {0x67af3428, &WrapV_U, "sceUtilityMsgDialogShutdownStart"}, - {0x2ad8e239, &WrapV_U, "sceUtilityMsgDialogInitStart"}, - {0x95fc253b, &WrapV_I, "sceUtilityMsgDialogUpdate"}, - {0x9a1c91d7, &WrapU_V, "sceUtilityMsgDialogGetStatus"}, + {0x67af3428, &WrapI_U, "sceUtilityMsgDialogShutdownStart"}, + {0x2ad8e239, &WrapI_U, "sceUtilityMsgDialogInitStart"}, + {0x95fc253b, &WrapI_I, "sceUtilityMsgDialogUpdate"}, + {0x9a1c91d7, &WrapI_V, "sceUtilityMsgDialogGetStatus"}, {0x4928bd96, 0, "sceUtilityMsgDialogAbort"}, {0x9790b33c, &WrapI_V, "sceUtilitySavedataShutdownStart"}, {0x50c4cd57, &WrapI_U, "sceUtilitySavedataInitStart"}, - {0xd4b95ffb, &WrapV_U, "sceUtilitySavedataUpdate"}, + {0xd4b95ffb, &WrapI_I, "sceUtilitySavedataUpdate"}, {0x8874dbe0, &WrapI_V, "sceUtilitySavedataGetStatus"}, {0x3dfaeba9, &WrapI_V, "sceUtilityOskShutdownStart"}, {0xf6269b82, &WrapI_U, "sceUtilityOskInitStart"}, - {0x4b85c861, &WrapV_U, "sceUtilityOskUpdate"}, + {0x4b85c861, &WrapI_U, "sceUtilityOskUpdate"}, {0xf3f76017, &WrapI_V, "sceUtilityOskGetStatus"}, {0x41e30674, &WrapU_UU, "sceUtilitySetSystemParamString"}, From 0fa0d3f6db2289e4b3644f84c68b48b11f1620e3 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 24 Dec 2012 19:14:09 -0800 Subject: [PATCH 08/10] Oops, need to use saveNameList when specified. Mistake from 6f165cfbe46ead77e3b4e99fe18ee1609188cf9c... --- Core/Dialog/SavedataParam.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Core/Dialog/SavedataParam.cpp b/Core/Dialog/SavedataParam.cpp index 6c28c53485..0b69bf5c51 100644 --- a/Core/Dialog/SavedataParam.cpp +++ b/Core/Dialog/SavedataParam.cpp @@ -419,6 +419,7 @@ int SavedataParam::SetPspParam(SceUtilitySavedataParam *param) if (info.exists) { SetFileInfo(realCount, info); + saveDataList[realCount].saveName = saveNameListData[i]; DEBUG_LOG(HLE,"%s Exist",fileDataPath.c_str()); realCount++; @@ -453,6 +454,7 @@ int SavedataParam::SetPspParam(SceUtilitySavedataParam *param) if (info.exists) { SetFileInfo(0, info); + saveDataList[0].saveName = GetSaveName(pspParam); DEBUG_LOG(HLE,"%s Exist",fileDataPath.c_str()); saveNameListDataCount = 1; @@ -477,7 +479,6 @@ int SavedataParam::SetPspParam(SceUtilitySavedataParam *param) void SavedataParam::SetFileInfo(int idx, PSPFileInfo &info) { saveDataList[idx].size = info.size; - saveDataList[idx].saveName = GetSaveName(pspParam); saveDataList[idx].idx = 0; saveDataList[idx].modif_time = info.mtime; From 1a71bf3aafd3cd3235dbd44ad6411c4da29b329d Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Tue, 25 Dec 2012 01:36:21 -0800 Subject: [PATCH 09/10] Fix potential buffer overflow. Detail can be 1024 already, I guess. --- Core/Dialog/PSPSaveDialog.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Core/Dialog/PSPSaveDialog.cpp b/Core/Dialog/PSPSaveDialog.cpp index e89a427c9c..5fad54b585 100644 --- a/Core/Dialog/PSPSaveDialog.cpp +++ b/Core/Dialog/PSPSaveDialog.cpp @@ -238,7 +238,9 @@ void PSPSaveDialog::DisplaySaveDataInfo1() } else { - char txt[1024]; + char txt[2048]; + _dbg_assert_msg_(HLE, sizeof(txt) > sizeof(SaveFileInfo), "Local buffer is too small."); + sprintf(txt,"%s\n%02d/%02d/%d %02d:%02d %lld KB\n%s\n%s" , param.GetFileInfo(currentSelectedSave).title , param.GetFileInfo(currentSelectedSave).modif_time.tm_mday From b0295664e809b503b5ca7544ff283d5d4e445672 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Tue, 25 Dec 2012 01:36:51 -0800 Subject: [PATCH 10/10] Correctly fix incorrect save directory being used. Darn, should've caught this before when I refactored wrong. --- Core/Dialog/SavedataParam.cpp | 26 ++++++++++++-------------- Core/Dialog/SavedataParam.h | 2 +- 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/Core/Dialog/SavedataParam.cpp b/Core/Dialog/SavedataParam.cpp index 0b69bf5c51..af3cb111be 100644 --- a/Core/Dialog/SavedataParam.cpp +++ b/Core/Dialog/SavedataParam.cpp @@ -418,8 +418,7 @@ int SavedataParam::SetPspParam(SceUtilitySavedataParam *param) PSPFileInfo info = pspFileSystem.GetFileInfo(fileDataPath); if (info.exists) { - SetFileInfo(realCount, info); - saveDataList[realCount].saveName = saveNameListData[i]; + SetFileInfo(realCount, info, saveNameListData[i]); DEBUG_LOG(HLE,"%s Exist",fileDataPath.c_str()); realCount++; @@ -453,8 +452,7 @@ int SavedataParam::SetPspParam(SceUtilitySavedataParam *param) PSPFileInfo info = pspFileSystem.GetFileInfo(fileDataPath); if (info.exists) { - SetFileInfo(0, info); - saveDataList[0].saveName = GetSaveName(pspParam); + SetFileInfo(0, info, GetSaveName(pspParam)); DEBUG_LOG(HLE,"%s Exist",fileDataPath.c_str()); saveNameListDataCount = 1; @@ -476,15 +474,22 @@ int SavedataParam::SetPspParam(SceUtilitySavedataParam *param) return 0; } -void SavedataParam::SetFileInfo(int idx, PSPFileInfo &info) +void SavedataParam::SetFileInfo(int idx, PSPFileInfo &info, std::string saveName) { saveDataList[idx].size = info.size; + saveDataList[idx].saveName = saveName; saveDataList[idx].idx = 0; saveDataList[idx].modif_time = info.mtime; + // Start with a blank slate. + saveDataList[idx].textureData = 0; + saveDataList[idx].title[0] = 0; + saveDataList[idx].saveTitle[0] = 0; + saveDataList[idx].saveDetail[0] = 0; + // Search save image icon0 // TODO : If icon0 don't exist, need to use icon1 which is a moving icon. Also play sound - std::string fileDataPath2 = savePath+GetGameName(pspParam)+GetSaveName(pspParam)+"/"+icon0Name; + std::string fileDataPath2 = savePath + GetGameName(pspParam) + saveName + "/" + icon0Name; PSPFileInfo info2 = pspFileSystem.GetFileInfo(fileDataPath2); if (info2.exists) { @@ -509,18 +514,11 @@ void SavedataParam::SetFileInfo(int idx, PSPFileInfo &info) saveDataList[idx].textureHeight = h; } else - { WARN_LOG(HLE, "Unable to load PNG data for savedata."); - saveDataList[idx].textureData = 0; - } - } - else - { - saveDataList[idx].textureData = 0; } // Load info in PARAM.SFO - fileDataPath2 = savePath+GetGameName(pspParam)+GetSaveName(pspParam)+"/"+sfoName; + fileDataPath2 = savePath + GetGameName(pspParam) + saveName + "/" + sfoName; info2 = pspFileSystem.GetFileInfo(fileDataPath2); if (info2.exists) { diff --git a/Core/Dialog/SavedataParam.h b/Core/Dialog/SavedataParam.h index fb248e43d5..78b6d8fec0 100644 --- a/Core/Dialog/SavedataParam.h +++ b/Core/Dialog/SavedataParam.h @@ -168,7 +168,7 @@ public: private: void Clear(); - void SetFileInfo(int idx, PSPFileInfo &info); + void SetFileInfo(int idx, PSPFileInfo &info, std::string saveName); SceUtilitySavedataParam* pspParam; int selectedSave;