aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorerorcun <erorcunerorcun@hotmail.com.tr>2021-06-28 17:11:12 +0300
committererorcun <erorcunerorcun@hotmail.com.tr>2021-06-28 17:44:48 +0300
commitfdbd414299172fb9e95e6166f6ad95e7844339f0 (patch)
tree8039ccf247598acc7fb1c8f522f837f58137aa82 /src
parentd17d437de319ca4c388dc724cffea91702d3a699 (diff)
Fix MP3 finding stack crash
Diffstat (limited to 'src')
-rw-r--r--src/audio/sampman_oal.cpp140
-rw-r--r--src/skel/crossplatform.h2
2 files changed, 47 insertions, 95 deletions
diff --git a/src/audio/sampman_oal.cpp b/src/audio/sampman_oal.cpp
index fa262c98..5d6b0dc3 100644
--- a/src/audio/sampman_oal.cpp
+++ b/src/audio/sampman_oal.cpp
@@ -479,18 +479,32 @@ _FindMP3s(void)
bool8 bInitFirstEntry;
HANDLE hFind;
char path[MAX_PATH];
- char filepath[MAX_PATH*2];
int total_ms;
WIN32_FIND_DATA fd;
+ char filepath[MAX_PATH + sizeof(fd.cFileName)];
if (getcwd(_mp3DirectoryPath, MAX_PATH) == NULL) {
perror("getcwd: ");
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...");
strcpy(path, _mp3DirectoryPath);
strcat(path, "\\MP3\\");
+
+#if !defined(_WIN32)
+ char *actualPath = casepath(path);
+ if (actualPath) {
+ strcpy(path, actualPath);
+ free(actualPath);
+ }
+#endif
strcpy(_mp3DirectoryPath, path);
OutputDebugString(_mp3DirectoryPath);
@@ -503,92 +517,32 @@ _FindMP3s(void)
{
return;
}
-
- strcpy(filepath, _mp3DirectoryPath);
- strcat(filepath, fd.cFileName);
-
- size_t filepathlen = strlen(filepath);
-
- if ( filepathlen <= 0)
- {
- FindClose(hFind);
- return;
- }
- if ( _ResolveLink(filepath, filepath) )
- {
- 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();
+ bShortcut = FALSE;
+ bInitFirstEntry = TRUE;
- OutputDebugString(fd.cFileName);
-
- _pMP3List = new tMP3Entry;
-
- if ( _pMP3List == NULL )
- {
- FindClose(hFind);
- 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;
- }
+ do
+ {
+ strcpy(filepath, _mp3DirectoryPath);
+ strcat(filepath, fd.cFileName);
+
+ if (!strcmp(fd.cFileName, ".") || !strcmp(fd.cFileName, ".."))
+ continue;
- bInitFirstEntry = FALSE;
- }
- else
- {
- strcat(filepath, " - NOT A VALID MP3");
-
- OutputDebugString(filepath);
+ size_t filepathlen = strlen(filepath);
- bInitFirstEntry = TRUE;
- }
-
- while ( TRUE )
- {
- if ( !FindNextFile(hFind, &fd) )
- break;
-
if ( bInitFirstEntry )
{
- 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))
{
OutputDebugString("Resolving Link");
OutputDebugString(filepath);
bShortcut = TRUE;
- } else {
+ }
+ else
+ {
bShortcut = FALSE;
if (filepathlen > MAX_PATH) {
continue;
@@ -600,29 +554,29 @@ _FindMP3s(void)
aStream[0]->Close();
OutputDebugString(fd.cFileName);
-
+
_pMP3List = new tMP3Entry;
-
- if ( _pMP3List == NULL)
+
+ if (_pMP3List == NULL)
break;
-
+
nNumMP3s = 1;
-
+
strcpy(_pMP3List->aFilename, fd.cFileName);
-
+
_pMP3List->nTrackLength = total_ms;
_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);
}
else
{
_pMP3List->pLinkPath = NULL;
}
-
+
pList = _pMP3List;
bInitFirstEntry = FALSE;
@@ -633,14 +587,11 @@ _FindMP3s(void)
OutputDebugString(filepath);
}
}
+ else
+ break;
}
else
{
- strcpy(filepath, _mp3DirectoryPath);
- strcat(filepath, fd.cFileName);
-
- size_t filepathlen = strlen(filepath);
-
if ( filepathlen > 0 )
{
if ( _ResolveLink(filepath, filepath) )
@@ -648,7 +599,8 @@ _FindMP3s(void)
OutputDebugString("Resolving Link");
OutputDebugString(filepath);
bShortcut = TRUE;
- } else
+ }
+ else
bShortcut = FALSE;
if (aStream[0] && aStream[0]->Open(filepath))
@@ -673,7 +625,7 @@ _FindMP3s(void)
if ( bShortcut )
{
- e->pLinkPath = new char [MAX_PATH*2];
+ e->pLinkPath = new char [MAX_PATH + sizeof(fd.cFileName)];
strcpy(e->pLinkPath, filepath);
}
else
@@ -692,7 +644,7 @@ _FindMP3s(void)
}
}
}
- }
+ } while (FindNextFile(hFind, &fd));
FindClose(hFind);
}
diff --git a/src/skel/crossplatform.h b/src/skel/crossplatform.h
index 9b43bcaf..24c3fb4d 100644
--- a/src/skel/crossplatform.h
+++ b/src/skel/crossplatform.h
@@ -147,7 +147,7 @@ typedef void* HANDLE;
struct WIN32_FIND_DATA {
char extension[32]; // for searching
- char folder[32]; // for searching
+ char folder[MAX_PATH]; // for searching
char cFileName[256]; // because tSkinInfo has it 256
time_t ftLastWriteTime;
};