-added more security checks and mechanisms to wiiflow to increase stability

This commit is contained in:
fix94.1 2013-09-24 15:21:31 +00:00
parent f036c92c45
commit a780efc0cd
12 changed files with 164 additions and 86 deletions

View File

@ -35,6 +35,7 @@
#include "nand.hpp" #include "nand.hpp"
#include "config/config.hpp" #include "config/config.hpp"
#include "gecko/gecko.hpp" #include "gecko/gecko.hpp"
#include "gui/fmt.h"
#include "gui/text.hpp" #include "gui/text.hpp"
#include "loader/fs.h" #include "loader/fs.h"
#include "loader/nk.h" #include "loader/nk.h"
@ -73,7 +74,7 @@ u8 Channels::GetRequestedIOS(u64 title)
else else
{ {
char tmd[ISFS_MAXPATH] ATTRIBUTE_ALIGN(32); char tmd[ISFS_MAXPATH] ATTRIBUTE_ALIGN(32);
sprintf(tmd, "/title/%08x/%08x/content/title.tmd", TITLE_UPPER(title), TITLE_LOWER(title)); strncpy(tmd, fmt("/title/%08x/%08x/content/title.tmd", TITLE_UPPER(title), TITLE_LOWER(title)), ISFS_MAXPATH);
titleTMD = ISFS_GetFile(tmd, &size, -1); titleTMD = ISFS_GetFile(tmd, &size, -1);
} }
if(titleTMD == NULL) if(titleTMD == NULL)
@ -117,12 +118,15 @@ bool Channels::GetAppNameFromTmd(u64 title, char *app, u32 *bootcontent)
else else
{ {
char tmd[ISFS_MAXPATH] ATTRIBUTE_ALIGN(32); char tmd[ISFS_MAXPATH] ATTRIBUTE_ALIGN(32);
sprintf(tmd, "/title/%08x/%08x/content/title.tmd", TITLE_UPPER(title), TITLE_LOWER(title)); strncpy(tmd, fmt("/title/%08x/%08x/content/title.tmd", TITLE_UPPER(title), TITLE_LOWER(title)), ISFS_MAXPATH);
data = ISFS_GetFile(tmd, &size, -1); data = ISFS_GetFile(tmd, &size, -1);
} }
if (data == NULL || size < 0x208) if(data == NULL || size < 0x208)
{
if(data != NULL)
free(data);
return ret; return ret;
}
_tmd *tmd_file = (_tmd *)SIGNATURE_PAYLOAD((u32 *)data); _tmd *tmd_file = (_tmd *)SIGNATURE_PAYLOAD((u32 *)data);
u16 i; u16 i;
for(i = 0; i < tmd_file->num_contents; ++i) for(i = 0; i < tmd_file->num_contents; ++i)
@ -130,7 +134,8 @@ bool Channels::GetAppNameFromTmd(u64 title, char *app, u32 *bootcontent)
if(tmd_file->contents[i].index == 0) if(tmd_file->contents[i].index == 0)
{ {
*bootcontent = tmd_file->contents[i].cid; *bootcontent = tmd_file->contents[i].cid;
sprintf(app, "/title/%08x/%08x/content/%08x.app", TITLE_UPPER(title), TITLE_LOWER(title), *bootcontent); strncpy(app, fmt("/title/%08x/%08x/content/%08x.app",
TITLE_UPPER(title), TITLE_LOWER(title), *bootcontent), ISFS_MAXPATH);
ret = true; ret = true;
break; break;
} }

View File

@ -1079,12 +1079,19 @@ void Nand::Patch_AHB()
u8 *Nand::GetEmuFile(const char *path, u32 *size, s32 len) u8 *Nand::GetEmuFile(const char *path, u32 *size, s32 len)
{ {
u32 filesize = 0; if(path == NULL)
const char *tmp_path = fmt("%s%s", FullNANDPath, path);
bool ret = fsop_GetFileSizeBytes(tmp_path, &filesize);
if(ret == false || filesize == 0)
return NULL; return NULL;
char *tmp_path = fmt_malloc("%s%s", FullNANDPath, path);
if(tmp_path == NULL)
return NULL;
u32 filesize = 0;
bool ret = fsop_GetFileSizeBytes(tmp_path, &filesize);
if(ret == false || filesize == 0)
{
MEM2_free(tmp_path);
return NULL;
}
if(len > 0) if(len > 0)
filesize = min(filesize, (u32)len); filesize = min(filesize, (u32)len);
u8 *tmp_buf = (u8*)MEM2_alloc(filesize); u8 *tmp_buf = (u8*)MEM2_alloc(filesize);
@ -1092,6 +1099,7 @@ u8 *Nand::GetEmuFile(const char *path, u32 *size, s32 len)
fread(tmp_buf, filesize, 1, f); fread(tmp_buf, filesize, 1, f);
fclose(f); fclose(f);
MEM2_free(tmp_path);
DCFlushRange(tmp_buf, filesize); DCFlushRange(tmp_buf, filesize);
*size = filesize; *size = filesize;
return tmp_buf; return tmp_buf;
@ -1118,11 +1126,15 @@ u64 *Nand::GetChannels(u32 *count)
u8 *Nand::GetTMD(u64 title, u32 *size) u8 *Nand::GetTMD(u64 title, u32 *size)
{ {
u8 *tmd_buf = NULL;
u32 tmd_size = 0; u32 tmd_size = 0;
const char *tmd_path = fmt("/title/%08x/%08x/content/title.tmd", char *tmd_path = fmt_malloc("/title/%08x/%08x/content/title.tmd",
TITLE_UPPER(title), TITLE_LOWER(title)); TITLE_UPPER(title), TITLE_LOWER(title));
u8 *tmd_buf = GetEmuFile(tmd_path, &tmd_size); if(tmd_path != NULL)
{
tmd_buf = GetEmuFile(tmd_path, &tmd_size);
MEM2_free(tmd_path);
}
*size = tmd_size; *size = tmd_size;
return tmd_buf; return tmd_buf;
} }

View File

@ -132,7 +132,11 @@ bool PartitionHandle::Mount(int pos, const char *name, bool forceFAT)
MountNameList.resize(pos + 1); MountNameList.resize(pos + 1);
MountNameList[pos] = name; MountNameList[pos] = name;
const char *DeviceSyn = fmt("%s:", name); char DeviceSyn[10];
memcpy(DeviceSyn, name, 8);
strcat(DeviceSyn, ":");
DeviceSyn[9] = '\0';
//! Some stupid partition manager think they don't need to edit the freaken MBR. //! Some stupid partition manager think they don't need to edit the freaken MBR.
//! So we need to check the first 64 sectors and see if some partition is there. //! So we need to check the first 64 sectors and see if some partition is there.
//! libfat does that by default so let's use it. //! libfat does that by default so let's use it.
@ -202,7 +206,11 @@ void PartitionHandle::UnMount(int pos)
return; return;
WBFS_Close(); WBFS_Close();
const char *DeviceSyn = fmt("%s:", MountName(pos)); char DeviceSyn[10];
memcpy(DeviceSyn, MountName(pos), 8);
strcat(DeviceSyn, ":");
DeviceSyn[9] = '\0';
if(strncmp(GetFSName(pos), "WBFS", 4) == 0) if(strncmp(GetFSName(pos), "WBFS", 4) == 0)
{ {
wbfs_t *wbfshandle = GetWbfsHandle(pos); wbfs_t *wbfshandle = GetWbfsHandle(pos);

View File

@ -42,9 +42,13 @@ void GC_Disc::init(const char *path)
*strrchr(GamePath, '/') = '\0'; *strrchr(GamePath, '/') = '\0';
if(strchr(GamePath, '/') != NULL) //sys if(strchr(GamePath, '/') != NULL) //sys
*strrchr(GamePath, '/') = '\0'; *strrchr(GamePath, '/') = '\0';
const char *FstPath = fmt("%s/sys/fst.bin", GamePath); char *FstPath = fmt_malloc("%s/sys/fst.bin", GamePath);
fsop_GetFileSizeBytes(FstPath, &FSTSize); if(FstPath != NULL)
f = fopen(FstPath, "rb"); {
fsop_GetFileSizeBytes(FstPath, &FSTSize);
f = fopen(FstPath, "rb");
MEM2_free(FstPath);
}
} }
else else
{ {

View File

@ -3,7 +3,7 @@
#include "boxmesh.hpp" #include "boxmesh.hpp"
#include "text.hpp" #include "text.hpp"
#include "gecko/gecko.hpp" #include "gecko/gecko.hpp"
#include "memory/mem2.hpp"
using namespace std; using namespace std;
static guVector _GRRaxisx = (guVector){1, 0, 0}; // DO NOT MODIFY!!! static guVector _GRRaxisx = (guVector){1, 0, 0}; // DO NOT MODIFY!!!
@ -184,9 +184,12 @@ CFanartElement::CFanartElement(Config &cfg, const char *dir, int artwork)
: m_artwork(artwork), m_isValid(false) : m_artwork(artwork), m_isValid(false)
{ {
m_isValid = (TexHandle.fromImageFile(m_art, fmt("%s/artwork%d.png", dir, artwork)) == TE_OK); m_isValid = (TexHandle.fromImageFile(m_art, fmt("%s/artwork%d.png", dir, artwork)) == TE_OK);
if (!m_isValid) return; if(!m_isValid)
return;
const char *section = fmt("artwork%d", artwork); char *section = fmt_malloc("artwork%d", artwork);
if(section == NULL)
return;
m_show_on_top = cfg.getBool(section, "show_on_top", true); m_show_on_top = cfg.getBool(section, "show_on_top", true);
@ -212,6 +215,8 @@ CFanartElement::CFanartElement(Config &cfg, const char *dir, int artwork)
m_step_scaleY = m_event_duration == 0 ? 0 : (m_scaleY - m_event_scaleY) / m_event_duration; m_step_scaleY = m_event_duration == 0 ? 0 : (m_scaleY - m_event_scaleY) / m_event_duration;
m_step_alpha = m_event_duration == 0 ? 0 : (m_alpha - m_event_alpha) / m_event_duration; m_step_alpha = m_event_duration == 0 ? 0 : (m_alpha - m_event_alpha) / m_event_duration;
m_step_angle = m_event_duration == 0 ? 0 : (m_angle - m_event_angle) / m_event_duration; m_step_angle = m_event_duration == 0 ? 0 : (m_angle - m_event_angle) / m_event_duration;
MEM2_free(section);
} }
void CFanartElement::Cleanup(void) void CFanartElement::Cleanup(void)

View File

@ -5,6 +5,7 @@
#include <string.h> #include <string.h>
#include <stdarg.h> #include <stdarg.h>
#include <stdio.h> #include <stdio.h>
#include "memory/mem2.hpp"
int currentStr = 0; int currentStr = 0;
static char fmt_buffer[MAX_USES][MAX_MSG_SIZE]; static char fmt_buffer[MAX_USES][MAX_MSG_SIZE];
@ -19,6 +20,22 @@ char *fmt(const char *format, ...)
return fmt_buffer[currentStr]; return fmt_buffer[currentStr];
} }
char *fmt_malloc(const char *format, ...)
{
va_list va;
va_start(va, format);
char *new_buffer = (char*)MEM2_alloc(MAX_MSG_SIZE);
if(new_buffer != NULL)
{
vsnprintf(new_buffer, MAX_MSG_SIZE - 1, format, va);
new_buffer[MAX_MSG_SIZE - 1] = '\0';
}
va_end(va);
return new_buffer;
}
void Asciify(wchar_t *str) void Asciify(wchar_t *str)
{ {
const wchar_t *ptr = str; const wchar_t *ptr = str;

View File

@ -14,6 +14,7 @@ enum {
}; };
char *fmt(const char *format, ...); char *fmt(const char *format, ...);
char *fmt_malloc(const char *format, ...);
void Asciify(wchar_t *str); void Asciify(wchar_t *str);
void Asciify2(char *str); void Asciify2(char *str);

View File

@ -566,7 +566,6 @@ const char *CMenu::_cfDomain(bool selected)
void CMenu::_initCFThemeMenu() void CMenu::_initCFThemeMenu()
{ {
TexData emptyTex; TexData emptyTex;
string domain;
int x; int x;
int y; int y;
@ -581,12 +580,14 @@ void CMenu::_initCFThemeMenu()
// //
for (int i = 0; i < 16; ++i) for (int i = 0; i < 16; ++i)
{ {
domain = fmt("CFTHEME/VAL%i%c_%%s", i / 3 + 1, (char)(i % 3) + 'A'); char *domain = fmt_malloc("CFTHEME/VAL%i%c_%%s", i / 3 + 1, (char)(i % 3) + 'A');
if(domain == NULL) continue;
x = 20 + (i / 4) * 150; x = 20 + (i / 4) * 150;
y = 340 + (i % 4) * 32; y = 340 + (i % 4) * 32;
m_cfThemeLblVal[i] = _addLabel(fmt(domain.c_str(), "BTN"), theme.btnFont, L"", x + 32, y, 86, 32, theme.btnFontColor, FTGX_JUSTIFY_CENTER | FTGX_ALIGN_MIDDLE, theme.btnTexC); m_cfThemeLblVal[i] = _addLabel(fmt(domain, "BTN"), theme.btnFont, L"", x + 32, y, 86, 32, theme.btnFontColor, FTGX_JUSTIFY_CENTER | FTGX_ALIGN_MIDDLE, theme.btnTexC);
m_cfThemeBtnValM[i] = _addPicButton(fmt(domain.c_str(), "MINUS"), theme.btnTexMinus, theme.btnTexMinusS, x, y, 32, 32); m_cfThemeBtnValM[i] = _addPicButton(fmt(domain, "MINUS"), theme.btnTexMinus, theme.btnTexMinusS, x, y, 32, 32);
m_cfThemeBtnValP[i] = _addPicButton(fmt(domain.c_str(), "PLUS"), theme.btnTexPlus, theme.btnTexPlusS, x + 118, y, 32, 32); m_cfThemeBtnValP[i] = _addPicButton(fmt(domain, "PLUS"), theme.btnTexPlus, theme.btnTexPlusS, x + 118, y, 32, 32);
MEM2_free(domain);
} }
for (int i = 0; i < 4; ++i) for (int i = 0; i < 4; ++i)
m_cfThemeLblValTxt[i] = _addLabel(fmt("CFTHEME/VAL%i_LBL", i + 1), theme.lblFont, L"", 20 + i * 150, 100, 150, 240, theme.lblFontColor, FTGX_JUSTIFY_CENTER | FTGX_ALIGN_BOTTOM, emptyTex); m_cfThemeLblValTxt[i] = _addLabel(fmt("CFTHEME/VAL%i_LBL", i + 1), theme.lblFont, L"", 20 + i * 150, 100, 150, 240, theme.lblFontColor, FTGX_JUSTIFY_CENTER | FTGX_ALIGN_BOTTOM, emptyTex);

View File

@ -207,7 +207,8 @@ void CMenu::_initCodeMenu()
for (int i = 0; i < 10; ++i) for (int i = 0; i < 10; ++i)
{ {
const char *codeText = fmt("CODE/%i_BTN", i); char *codeText = fmt_malloc("CODE/%i_BTN", i);
if(codeText == NULL) continue;
if (i > 0) if (i > 0)
{ {
int x = i - 1; int x = i - 1;
@ -218,6 +219,7 @@ void CMenu::_initCodeMenu()
m_codeBtnKey[i] = _addButton(codeText, theme.btnFont, wfmt(L"%i", i), x, y, 100, 50, theme.btnFontColor); m_codeBtnKey[i] = _addButton(codeText, theme.btnFont, wfmt(L"%i", i), x, y, 100, 50, theme.btnFontColor);
} }
_setHideAnim(m_codeBtnKey[i], codeText, 0, 0, 0.f, 0.f); _setHideAnim(m_codeBtnKey[i], codeText, 0, 0, 0.f, 0.f);
MEM2_free(codeText);
} }
_setHideAnim(m_codeBtnErase, "CODE/ERASE_BTN", 0, 0, -2.f, 0.f); _setHideAnim(m_codeBtnErase, "CODE/ERASE_BTN", 0, 0, -2.f, 0.f);
_setHideAnim(m_codeBtnBack, "CODE/BACK_BTN", 0, 0, -2.f, 0.f); _setHideAnim(m_codeBtnBack, "CODE/BACK_BTN", 0, 0, -2.f, 0.f);

View File

@ -137,7 +137,7 @@ void CMenu::_hideSettings(bool instant)
m_btnMgr.hide(m_downloadLblPrio, instant); m_btnMgr.hide(m_downloadLblPrio, instant);
m_btnMgr.hide(m_downloadBtnPrioM, instant); m_btnMgr.hide(m_downloadBtnPrioM, instant);
m_btnMgr.hide(m_downloadBtnPrioP, instant); m_btnMgr.hide(m_downloadBtnPrioP, instant);
m_btnMgr.hide(m_downloadLblRegion, instant); m_btnMgr.hide(m_downloadLblRegion, instant);
m_btnMgr.hide(m_downloadBtnEN, instant); m_btnMgr.hide(m_downloadBtnEN, instant);
m_btnMgr.hide(m_downloadBtnJA, instant); m_btnMgr.hide(m_downloadBtnJA, instant);
m_btnMgr.hide(m_downloadBtnFR, instant); m_btnMgr.hide(m_downloadBtnFR, instant);
@ -437,7 +437,6 @@ int CMenu::_initNetwork()
int CMenu::_coverDownloader(bool missingOnly) int CMenu::_coverDownloader(bool missingOnly)
{ {
string path;
vector<string> coverList; vector<string> coverList;
vector<dir_discHdr> pluginCoverList; vector<dir_discHdr> pluginCoverList;
@ -484,28 +483,33 @@ int CMenu::_coverDownloader(bool missingOnly)
_setThrdMsg(_t("dlmsg7", L"Listing covers to download..."), listWeight * (float)step / (float)nbSteps); _setThrdMsg(_t("dlmsg7", L"Listing covers to download..."), listWeight * (float)step / (float)nbSteps);
LWP_MutexUnlock(m_mutex); LWP_MutexUnlock(m_mutex);
++step; ++step;
string id; char *path = NULL;
const char *id = NULL;
if(m_gameList[i].type == TYPE_PLUGIN) if(m_gameList[i].type == TYPE_PLUGIN)
{ {
char gamePath[256]; char gamePath[256];
if(string(m_gameList[i].path).find_last_of("/") != string::npos) if(strchr(m_gameList[i].path, '/') != NULL)
strncpy(gamePath, &m_gameList[i].path[string(m_gameList[i].path).find_last_of("/")+1], sizeof(gamePath)); strncpy(gamePath, strrchr(m_gameList[i].path, '/') + 1, sizeof(gamePath));
else else
strncpy(gamePath, m_gameList[i].path, sizeof(gamePath)); strncpy(gamePath, m_gameList[i].path, sizeof(gamePath));
path = fmt("%s/%s.png", m_boxPicDir.c_str(), gamePath); path = fmt_malloc("%s/%s.png", m_boxPicDir.c_str(), gamePath);
id = path; id = path;
} }
else else
{ {
id = (const char *)m_gameList[i].id; path = fmt_malloc("%s/%s.png", m_boxPicDir.c_str(), m_gameList[i].id);
path = fmt("%s/%s.png", m_boxPicDir.c_str(), id.c_str()); id = m_gameList[i].id;
} }
if(!missingOnly || (!CoverFlow.fullCoverCached(id.c_str()) && !checkPNGFile(path.c_str()))) if(!missingOnly || (id != NULL && !CoverFlow.fullCoverCached(id) && path != NULL && !checkPNGFile(path)))
{ {
if(m_gameList[i].type == TYPE_PLUGIN) if(m_gameList[i].type == TYPE_PLUGIN)
pluginCoverList.push_back(m_gameList[i]); pluginCoverList.push_back(m_gameList[i]);
coverList.push_back(id); if(id != NULL)
coverList.push_back(id);
} }
if(path != NULL)
MEM2_free(path);
path = NULL;
} }
} }
else else
@ -544,7 +548,7 @@ int CMenu::_coverDownloader(bool missingOnly)
bool custom = false; bool custom = false;
int c_altCase = 0; int c_altCase = 0;
string newID = m_newID.getString(domain, coverList[i], coverList[i]); const string &newID = m_newID.getString(domain, coverList[i], coverList[i]);
if(!newID.empty() && strncasecmp(newID.c_str(), coverList[i].c_str(), coverList[i].length()) == 0) if(!newID.empty() && strncasecmp(newID.c_str(), coverList[i].c_str(), coverList[i].length()) == 0)
m_newID.remove(domain, coverList[i]); m_newID.remove(domain, coverList[i]);
@ -578,8 +582,8 @@ int CMenu::_coverDownloader(bool missingOnly)
original = false; original = false;
if (!success && !m_thrdStop && original) if (!success && !m_thrdStop && original)
{ {
path = fmt("%s/%s.png", m_boxPicDir.c_str(), coverList[i].c_str()); char *path = fmt_malloc("%s/%s.png", m_boxPicDir.c_str(), coverList[i].c_str());
if (!checkPNGFile(path.c_str())) if(path != NULL && !checkPNGFile(path))
{ {
for (u32 j = 0; !success && j < fmtURLBox.size() && !m_thrdStop; ++j) for (u32 j = 0; !success && j < fmtURLBox.size() && !m_thrdStop; ++j)
{ {
@ -696,9 +700,9 @@ int CMenu::_coverDownloader(bool missingOnly)
if (savePNG) if (savePNG)
{ {
LWP_MutexLock(m_mutex); LWP_MutexLock(m_mutex);
_setThrdMsg(wfmt(_fmt("dlmsg4", L"Saving %s"), path.c_str()), listWeight + dlWeight * (float)(step + 1) / (float)nbSteps); _setThrdMsg(wfmt(_fmt("dlmsg4", L"Saving %s"), path), listWeight + dlWeight * (float)(step + 1) / (float)nbSteps);
LWP_MutexUnlock(m_mutex); LWP_MutexUnlock(m_mutex);
fsop_WriteFile(path.c_str(), download.data, download.size); fsop_WriteFile(path, download.data, download.size);
} }
LWP_MutexLock(m_mutex); LWP_MutexLock(m_mutex);
_setThrdMsg(wfmt(_fmt("dlmsg10", L"Making %s"), sfmt("%s.wfc", coverList[i].c_str()).c_str()), listWeight + dlWeight * (float)(step + 1) / (float)nbSteps); _setThrdMsg(wfmt(_fmt("dlmsg10", L"Making %s"), sfmt("%s.wfc", coverList[i].c_str()).c_str()), listWeight + dlWeight * (float)(step + 1) / (float)nbSteps);
@ -710,16 +714,19 @@ int CMenu::_coverDownloader(bool missingOnly)
} }
} }
} }
if(path != NULL)
MEM2_free(path);
path = NULL;
} }
break; break;
case CBOX: case CBOX:
if( m_downloadPrioVal&C_TYPE_ONCU ) if( m_downloadPrioVal&C_TYPE_ONCU )
custom = true; custom = true;
c_altCase = c_gameTDB.GetCaseVersions( coverList[i].c_str() ); c_altCase = c_gameTDB.GetCaseVersions( coverList[i].c_str() );
if (!success && !m_thrdStop && c_gameTDB.IsLoaded() && c_altCase > 1 && custom) if(!success && !m_thrdStop && c_gameTDB.IsLoaded() && c_altCase > 1 && custom)
{ {
path = fmt("%s/%s.png", m_boxPicDir.c_str(), coverList[i].c_str()); char *path = fmt_malloc("%s/%s.png", m_boxPicDir.c_str(), coverList[i].c_str());
if (!checkPNGFile(path.c_str())) if(path != NULL && !checkPNGFile(path))
{ {
for (u32 j = 0; !success && j < fmtURLCBox.size() && !m_thrdStop; ++j) for (u32 j = 0; !success && j < fmtURLCBox.size() && !m_thrdStop; ++j)
{ {
@ -838,9 +845,9 @@ int CMenu::_coverDownloader(bool missingOnly)
if (savePNG) if (savePNG)
{ {
LWP_MutexLock(m_mutex); LWP_MutexLock(m_mutex);
_setThrdMsg(wfmt(_fmt("dlmsg4", L"Saving %s"), path.c_str()), listWeight + dlWeight * (float)(step + 1) / (float)nbSteps); _setThrdMsg(wfmt(_fmt("dlmsg4", L"Saving %s"), path), listWeight + dlWeight * (float)(step + 1) / (float)nbSteps);
LWP_MutexUnlock(m_mutex); LWP_MutexUnlock(m_mutex);
fsop_WriteFile(path.c_str(), download.data, download.size); fsop_WriteFile(path, download.data, download.size);
} }
LWP_MutexLock(m_mutex); LWP_MutexLock(m_mutex);
_setThrdMsg(wfmt(_fmt("dlmsg10", L"Making %s"), sfmt("%s.wfc", coverList[i].c_str()).c_str()), listWeight + dlWeight * (float)(step + 1) / (float)nbSteps); _setThrdMsg(wfmt(_fmt("dlmsg10", L"Making %s"), sfmt("%s.wfc", coverList[i].c_str()).c_str()), listWeight + dlWeight * (float)(step + 1) / (float)nbSteps);
@ -852,15 +859,18 @@ int CMenu::_coverDownloader(bool missingOnly)
} }
} }
} }
if(path != NULL)
MEM2_free(path);
path = NULL;
} }
break; break;
case FLAT: case FLAT:
if( m_downloadPrioVal&C_TYPE_ONOR ) if( m_downloadPrioVal&C_TYPE_ONOR )
original = false; original = false;
if (!success && !m_thrdStop && original) if(!success && !m_thrdStop && original)
{ {
path = fmt("%s/%s.png", m_picDir.c_str(), coverList[i].c_str()); char *path = fmt_malloc("%s/%s.png", m_picDir.c_str(), coverList[i].c_str());
if (!checkPNGFile(path.c_str())) if(path != NULL && !checkPNGFile(path))
{ {
// Try to get the front cover // Try to get the front cover
if (m_thrdStop) break; if (m_thrdStop) break;
@ -979,9 +989,9 @@ int CMenu::_coverDownloader(bool missingOnly)
if (savePNG) if (savePNG)
{ {
LWP_MutexLock(m_mutex); LWP_MutexLock(m_mutex);
_setThrdMsg(wfmt(_fmt("dlmsg4", L"Saving %s"), path.c_str()), listWeight + dlWeight * (float)(step + 1) / (float)nbSteps); _setThrdMsg(wfmt(_fmt("dlmsg4", L"Saving %s"), path), listWeight + dlWeight * (float)(step + 1) / (float)nbSteps);
LWP_MutexUnlock(m_mutex); LWP_MutexUnlock(m_mutex);
fsop_WriteFile(path.c_str(), download.data, download.size); fsop_WriteFile(path, download.data, download.size);
} }
LWP_MutexLock(m_mutex); LWP_MutexLock(m_mutex);
_setThrdMsg(wfmt(_fmt("dlmsg10", L"Making %s"), sfmt("%s.wfc", coverList[i].c_str()).c_str()), listWeight + dlWeight * (float)(step + 1) / (float)nbSteps); _setThrdMsg(wfmt(_fmt("dlmsg10", L"Making %s"), sfmt("%s.wfc", coverList[i].c_str()).c_str()), listWeight + dlWeight * (float)(step + 1) / (float)nbSteps);
@ -993,15 +1003,18 @@ int CMenu::_coverDownloader(bool missingOnly)
} }
} }
} }
if(path != NULL)
MEM2_free(path);
path = NULL;
} }
break; break;
case CFLAT: case CFLAT:
if( m_downloadPrioVal&C_TYPE_ONCU ) if( m_downloadPrioVal&C_TYPE_ONCU )
custom = true; custom = true;
if (!success && !m_thrdStop && c_gameTDB.IsLoaded() && c_altCase > 1 && custom) if(!success && !m_thrdStop && c_gameTDB.IsLoaded() && c_altCase > 1 && custom)
{ {
path = fmt("%s/%s.png", m_picDir.c_str(), coverList[i].c_str()); char *path = fmt_malloc("%s/%s.png", m_picDir.c_str(), coverList[i].c_str());
if (!checkPNGFile(path.c_str())) if(path != NULL && !checkPNGFile(path))
{ {
// Try to get the front cover // Try to get the front cover
if (m_thrdStop) break; if (m_thrdStop) break;
@ -1116,9 +1129,9 @@ int CMenu::_coverDownloader(bool missingOnly)
if(savePNG) if(savePNG)
{ {
LWP_MutexLock(m_mutex); LWP_MutexLock(m_mutex);
_setThrdMsg(wfmt(_fmt("dlmsg4", L"Saving %s"), path.c_str()), listWeight + dlWeight * (float)(step + 1) / (float)nbSteps); _setThrdMsg(wfmt(_fmt("dlmsg4", L"Saving %s"), path), listWeight + dlWeight * (float)(step + 1) / (float)nbSteps);
LWP_MutexUnlock(m_mutex); LWP_MutexUnlock(m_mutex);
fsop_WriteFile(path.c_str(), download.data, download.size); fsop_WriteFile(path, download.data, download.size);
} }
LWP_MutexLock(m_mutex); LWP_MutexLock(m_mutex);
_setThrdMsg(wfmt(_fmt("dlmsg10", L"Making %s"), sfmt("%s.wfc", coverList[i].c_str()).c_str()), listWeight + dlWeight * (float)(step + 1) / (float)nbSteps); _setThrdMsg(wfmt(_fmt("dlmsg10", L"Making %s"), sfmt("%s.wfc", coverList[i].c_str()).c_str()), listWeight + dlWeight * (float)(step + 1) / (float)nbSteps);
@ -1130,11 +1143,13 @@ int CMenu::_coverDownloader(bool missingOnly)
} }
} }
} }
if(path != NULL)
MEM2_free(path);
path = NULL;
} }
break; break;
} }
} }
newID.clear();
++step; ++step;
} }
if(c_gameTDB.IsLoaded()) if(c_gameTDB.IsLoaded())
@ -1172,8 +1187,8 @@ void CMenu::_download(string gameId)
if(gameId.size() && CoverFlow.getHdr()->type == TYPE_PLUGIN) if(gameId.size() && CoverFlow.getHdr()->type == TYPE_PLUGIN)
{ {
char gamePath[256]; char gamePath[256];
if(string(CoverFlow.getHdr()->path).find_last_of("/") != string::npos) if(strchr(CoverFlow.getHdr()->path, '/') != NULL)
strncpy(gamePath, &CoverFlow.getHdr()->path[string(CoverFlow.getHdr()->path).find_last_of("/")+1], sizeof(gamePath)); strncpy(gamePath, strrchr(CoverFlow.getHdr()->path, '/') + 1, sizeof(gamePath));
else else
strncpy(gamePath, CoverFlow.getHdr()->path, sizeof(gamePath)); strncpy(gamePath, CoverFlow.getHdr()->path, sizeof(gamePath));
m_coverDLGameId = gamePath; m_coverDLGameId = gamePath;
@ -1929,8 +1944,6 @@ int CMenu::_gametdbDownloader(CMenu *m)
int CMenu::_gametdbDownloaderAsync() int CMenu::_gametdbDownloaderAsync()
{ {
string langCode;
u32 bufferSize = 0x800000; // 8 MB u32 bufferSize = 0x800000; // 8 MB
u8 *buffer = (u8*)MEM2_alloc(bufferSize); u8 *buffer = (u8*)MEM2_alloc(bufferSize);
if (buffer == NULL) if (buffer == NULL)
@ -1940,7 +1953,7 @@ int CMenu::_gametdbDownloaderAsync()
LWP_MutexUnlock(m_mutex); LWP_MutexUnlock(m_mutex);
return 0; return 0;
} }
langCode = m_loc.getString(m_curLanguage, "gametdb_code", "EN"); const string &langCode = m_loc.getString(m_curLanguage, "gametdb_code", "EN");
LWP_MutexLock(m_mutex); LWP_MutexLock(m_mutex);
_setThrdMsg(_t("dlmsg1", L"Initializing network..."), 0.f); _setThrdMsg(_t("dlmsg1", L"Initializing network..."), 0.f);
LWP_MutexUnlock(m_mutex); LWP_MutexUnlock(m_mutex);
@ -1966,18 +1979,20 @@ int CMenu::_gametdbDownloaderAsync()
} }
else else
{ {
string zippath = fmt("%s/wiitdb.zip", m_settingsDir.c_str()); bool res = false;
char *zippath = fmt_malloc("%s/wiitdb.zip", m_settingsDir.c_str());
gprintf("Downloading file to '%s'\n", zippath.c_str()); if(zippath != NULL)
{
fsop_deleteFile(zippath.c_str()); gprintf("Writing file to '%s'\n", zippath);
fsop_deleteFile(zippath);
_setThrdMsg(wfmt(_fmt("dlmsg4", L"Saving %s"), "wiitdb.zip"), 1.f); _setThrdMsg(wfmt(_fmt("dlmsg4", L"Saving %s"), "wiitdb.zip"), 1.f);
bool res = fsop_WriteFile(zippath.c_str(), download.data, download.size); res = fsop_WriteFile(zippath, download.data, download.size);
if (res == false) }
if(res == false)
{ {
gprintf("Can't save zip file\n"); gprintf("Can't save zip file\n");
if(zippath != NULL)
MEM2_free(zippath);
LWP_MutexLock(m_mutex); LWP_MutexLock(m_mutex);
_setThrdMsg(_t("dlmsg15", L"Couldn't save ZIP file"), 1.f); _setThrdMsg(_t("dlmsg15", L"Couldn't save ZIP file"), 1.f);
LWP_MutexUnlock(m_mutex); LWP_MutexUnlock(m_mutex);
@ -1986,12 +2001,13 @@ int CMenu::_gametdbDownloaderAsync()
{ {
gprintf("Extracting zip file: "); gprintf("Extracting zip file: ");
ZipFile zFile(zippath.c_str()); ZipFile zFile(zippath);
bool zres = zFile.ExtractAll(m_settingsDir.c_str()); bool zres = zFile.ExtractAll(m_settingsDir.c_str());
gprintf(zres ? "success\n" : "failed\n"); gprintf(zres ? "success\n" : "failed\n");
// We don't need the zipfile anymore // We don't need the zipfile anymore
fsop_deleteFile(zippath.c_str()); fsop_deleteFile(zippath);
MEM2_free(zippath);
// We should always remove the offsets file to make sure it's reloaded // We should always remove the offsets file to make sure it's reloaded
fsop_deleteFile(fmt("%s/gametdb_offsets.bin", m_settingsDir.c_str())); fsop_deleteFile(fmt("%s/gametdb_offsets.bin", m_settingsDir.c_str()));
@ -2018,7 +2034,7 @@ int CMenu::_gametdbDownloaderAsync()
const char *banner_url = NULL; const char *banner_url = NULL;
const char *banner_url_id3 = NULL; const char *banner_url_id3 = NULL;
const char *banner_location = NULL; char *banner_location = NULL;
u32 CMenu::_downloadBannerAsync(void *obj) u32 CMenu::_downloadBannerAsync(void *obj)
{ {
CMenu *m = (CMenu *)obj; CMenu *m = (CMenu *)obj;
@ -2057,7 +2073,8 @@ u32 CMenu::_downloadBannerAsync(void *obj)
/* minimum 50kb */ /* minimum 50kb */
if (banner.data != NULL && banner.size > 51200 && banner.data[0] != '<') if (banner.data != NULL && banner.size > 51200 && banner.data[0] != '<')
{ {
fsop_WriteFile(banner_location, banner.data, banner.size); if(banner_location != NULL)
fsop_WriteFile(banner_location, banner.data, banner.size);
LWP_MutexLock(m->m_mutex); LWP_MutexLock(m->m_mutex);
m->_setThrdMsg(m->_t("dlmsg14", L"Done."), 1.f); m->_setThrdMsg(m->_t("dlmsg14", L"Done."), 1.f);
LWP_MutexUnlock(m->m_mutex); LWP_MutexUnlock(m->m_mutex);
@ -2091,7 +2108,9 @@ void CMenu::_downloadBnr(const char *gameID)
base_url_id3.replace(base_url_id3.find(GAME_BNR_ID), strlen(GAME_BNR_ID), gameID, 3); base_url_id3.replace(base_url_id3.find(GAME_BNR_ID), strlen(GAME_BNR_ID), gameID, 3);
banner_url_id3 = base_url_id3.c_str(); banner_url_id3 = base_url_id3.c_str();
banner_location = fmt("%s/%s.bnr", m_customBnrDir.c_str(), gameID); banner_location = fmt_malloc("%s/%s.bnr", m_customBnrDir.c_str(), gameID);
if(banner_location == NULL)
return;
m_btnMgr.show(m_downloadPBar); m_btnMgr.show(m_downloadPBar);
m_btnMgr.setProgress(m_downloadPBar, 0.f); m_btnMgr.setProgress(m_downloadPBar, 0.f);
@ -2144,7 +2163,13 @@ void CMenu::_downloadBnr(const char *gameID)
if (m_thrdStop && !m_thrdWorking) if (m_thrdStop && !m_thrdWorking)
break; break;
} }
m_btnMgr.setText(m_downloadBtnCancel, _t("gm2", L"Back")); if(banner_location != NULL)
{
MEM2_free(banner_location);
banner_location = NULL;
}
m_btnMgr.setText(m_downloadBtnCancel, _t("gm2", L"Back"));
if (thread != LWP_THREAD_NULL) if (thread != LWP_THREAD_NULL)
{ {
LWP_JoinThread(thread, NULL); LWP_JoinThread(thread, NULL);

View File

@ -428,10 +428,8 @@ void CMenu::_game(bool launch)
else if(BTN_MINUS_PRESSED) else if(BTN_MINUS_PRESSED)
{ {
const char *videoPath = fmt("%s/%.3s.thp", m_videoDir.c_str(), CoverFlow.getId()); const char *videoPath = fmt("%s/%.3s.thp", m_videoDir.c_str(), CoverFlow.getId());
FILE *file = fopen(videoPath, "r"); if(fsop_FileExist(videoPath))
if(file)
{ {
fclose(file);
MusicPlayer.Stop(); MusicPlayer.Stop();
m_gameSound.Stop(); m_gameSound.Stop();
m_banner.SetShowBanner(false); m_banner.SetShowBanner(false);

View File

@ -77,10 +77,10 @@ bool Plugin::AddPlugin(Config &plugin)
NewPlugin.DisplayName.fromUTF8(PluginName.c_str()); NewPlugin.DisplayName.fromUTF8(PluginName.c_str());
NewPlugin.consoleCoverID = plugin.getString(PLUGIN_INI_DEF,"consoleCoverID"); NewPlugin.consoleCoverID = plugin.getString(PLUGIN_INI_DEF,"consoleCoverID");
const char *bannerfilepath = fmt("%s/%s", pluginsDir.c_str(), plugin.getString(PLUGIN_INI_DEF,"bannerSound").c_str()); const string &bannerfilepath = sfmt("%s/%s", pluginsDir.c_str(), plugin.getString(PLUGIN_INI_DEF,"bannerSound").c_str());
fsop_GetFileSizeBytes(bannerfilepath, &NewPlugin.BannerSoundSize); fsop_GetFileSizeBytes(bannerfilepath.c_str(), &NewPlugin.BannerSoundSize);
if(NewPlugin.BannerSoundSize > 0) if(NewPlugin.BannerSoundSize > 0)
NewPlugin.BannerSound = string(bannerfilepath); NewPlugin.BannerSound = bannerfilepath;
Plugins.push_back(NewPlugin); Plugins.push_back(NewPlugin);
return false; return false;
} }