Fix MP3 finding stack crash

This commit is contained in:
erorcun 2021-06-28 17:11:12 +03:00
parent d17d437de3
commit fdbd414299
2 changed files with 47 additions and 95 deletions

View file

@ -479,18 +479,32 @@ _FindMP3s(void)
bool8 bInitFirstEntry; bool8 bInitFirstEntry;
HANDLE hFind; HANDLE hFind;
char path[MAX_PATH]; char path[MAX_PATH];
char filepath[MAX_PATH*2];
int total_ms; int total_ms;
WIN32_FIND_DATA fd; WIN32_FIND_DATA fd;
char filepath[MAX_PATH + sizeof(fd.cFileName)];
if (getcwd(_mp3DirectoryPath, MAX_PATH) == NULL) { if (getcwd(_mp3DirectoryPath, MAX_PATH) == NULL) {
perror("getcwd: "); perror("getcwd: ");
return; return;
} }
if (strlen(_mp3DirectoryPath) + 1 > MAX_PATH - 10) {
// This is not gonna end well
printf("MP3 folder path is too long, no place left for file names. MP3 finding aborted.\n");
return;
}
OutputDebugString("Finding MP3s..."); OutputDebugString("Finding MP3s...");
strcpy(path, _mp3DirectoryPath); strcpy(path, _mp3DirectoryPath);
strcat(path, "\\MP3\\"); strcat(path, "\\MP3\\");
#if !defined(_WIN32)
char *actualPath = casepath(path);
if (actualPath) {
strcpy(path, actualPath);
free(actualPath);
}
#endif
strcpy(_mp3DirectoryPath, path); strcpy(_mp3DirectoryPath, path);
OutputDebugString(_mp3DirectoryPath); OutputDebugString(_mp3DirectoryPath);
@ -503,92 +517,32 @@ _FindMP3s(void)
{ {
return; return;
} }
strcpy(filepath, _mp3DirectoryPath);
strcat(filepath, fd.cFileName);
size_t filepathlen = strlen(filepath);
if ( filepathlen <= 0)
{
FindClose(hFind);
return;
}
if ( _ResolveLink(filepath, filepath) ) bShortcut = FALSE;
{ bInitFirstEntry = TRUE;
OutputDebugString("Resolving Link");
OutputDebugString(filepath);
bShortcut = TRUE;
} else
bShortcut = FALSE;
if (aStream[0] && aStream[0]->Open(filepath))
{
total_ms = aStream[0]->GetLengthMS();
aStream[0]->Close();
OutputDebugString(fd.cFileName); do
{
_pMP3List = new tMP3Entry; strcpy(filepath, _mp3DirectoryPath);
strcat(filepath, fd.cFileName);
if ( _pMP3List == NULL )
{ if (!strcmp(fd.cFileName, ".") || !strcmp(fd.cFileName, ".."))
FindClose(hFind); continue;
return;
}
nNumMP3s = 1;
strcpy(_pMP3List->aFilename, fd.cFileName);
_pMP3List->nTrackLength = total_ms;
_pMP3List->pNext = NULL;
pList = _pMP3List;
if ( bShortcut )
{
_pMP3List->pLinkPath = new char[MAX_PATH*2];
strcpy(_pMP3List->pLinkPath, filepath);
}
else
{
_pMP3List->pLinkPath = NULL;
}
bInitFirstEntry = FALSE; size_t filepathlen = strlen(filepath);
}
else
{
strcat(filepath, " - NOT A VALID MP3");
OutputDebugString(filepath);
bInitFirstEntry = TRUE;
}
while ( TRUE )
{
if ( !FindNextFile(hFind, &fd) )
break;
if ( bInitFirstEntry ) if ( bInitFirstEntry )
{ {
strcpy(filepath, _mp3DirectoryPath); if (filepathlen > 0)
strcat(filepath, fd.cFileName);
size_t filepathlen = strlen(filepath);
if ( filepathlen > 0 )
{ {
if ( _ResolveLink(filepath, filepath) ) if (_ResolveLink(filepath, filepath))
{ {
OutputDebugString("Resolving Link"); OutputDebugString("Resolving Link");
OutputDebugString(filepath); OutputDebugString(filepath);
bShortcut = TRUE; bShortcut = TRUE;
} else { }
else
{
bShortcut = FALSE; bShortcut = FALSE;
if (filepathlen > MAX_PATH) { if (filepathlen > MAX_PATH) {
continue; continue;
@ -600,29 +554,29 @@ _FindMP3s(void)
aStream[0]->Close(); aStream[0]->Close();
OutputDebugString(fd.cFileName); OutputDebugString(fd.cFileName);
_pMP3List = new tMP3Entry; _pMP3List = new tMP3Entry;
if ( _pMP3List == NULL) if (_pMP3List == NULL)
break; break;
nNumMP3s = 1; nNumMP3s = 1;
strcpy(_pMP3List->aFilename, fd.cFileName); strcpy(_pMP3List->aFilename, fd.cFileName);
_pMP3List->nTrackLength = total_ms; _pMP3List->nTrackLength = total_ms;
_pMP3List->pNext = NULL; _pMP3List->pNext = NULL;
if ( bShortcut ) if (bShortcut)
{ {
_pMP3List->pLinkPath = new char [MAX_PATH*2]; _pMP3List->pLinkPath = new char[MAX_PATH + sizeof(fd.cFileName)];
strcpy(_pMP3List->pLinkPath, filepath); strcpy(_pMP3List->pLinkPath, filepath);
} }
else else
{ {
_pMP3List->pLinkPath = NULL; _pMP3List->pLinkPath = NULL;
} }
pList = _pMP3List; pList = _pMP3List;
bInitFirstEntry = FALSE; bInitFirstEntry = FALSE;
@ -633,14 +587,11 @@ _FindMP3s(void)
OutputDebugString(filepath); OutputDebugString(filepath);
} }
} }
else
break;
} }
else else
{ {
strcpy(filepath, _mp3DirectoryPath);
strcat(filepath, fd.cFileName);
size_t filepathlen = strlen(filepath);
if ( filepathlen > 0 ) if ( filepathlen > 0 )
{ {
if ( _ResolveLink(filepath, filepath) ) if ( _ResolveLink(filepath, filepath) )
@ -648,7 +599,8 @@ _FindMP3s(void)
OutputDebugString("Resolving Link"); OutputDebugString("Resolving Link");
OutputDebugString(filepath); OutputDebugString(filepath);
bShortcut = TRUE; bShortcut = TRUE;
} else }
else
bShortcut = FALSE; bShortcut = FALSE;
if (aStream[0] && aStream[0]->Open(filepath)) if (aStream[0] && aStream[0]->Open(filepath))
@ -673,7 +625,7 @@ _FindMP3s(void)
if ( bShortcut ) if ( bShortcut )
{ {
e->pLinkPath = new char [MAX_PATH*2]; e->pLinkPath = new char [MAX_PATH + sizeof(fd.cFileName)];
strcpy(e->pLinkPath, filepath); strcpy(e->pLinkPath, filepath);
} }
else else
@ -692,7 +644,7 @@ _FindMP3s(void)
} }
} }
} }
} } while (FindNextFile(hFind, &fd));
FindClose(hFind); FindClose(hFind);
} }

View file

@ -147,7 +147,7 @@ typedef void* HANDLE;
struct WIN32_FIND_DATA { struct WIN32_FIND_DATA {
char extension[32]; // for searching char extension[32]; // for searching
char folder[32]; // for searching char folder[MAX_PATH]; // for searching
char cFileName[256]; // because tSkinInfo has it 256 char cFileName[256]; // because tSkinInfo has it 256
time_t ftLastWriteTime; time_t ftLastWriteTime;
}; };