Issue470 fix - Performance file bounds checking and error handling (#494)

* Fix for Issue #470 to introduce bounds checking on loading performance files and when saving a new performance.

* Reduce number of performances to 256 and include some better error handling for when there are no performances free for saving.
rpi1-2tg
Kevin 2 years ago committed by GitHub
parent bb50d022f3
commit 87dc5ce432
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      src/minidexed.cpp
  2. 56
      src/performanceconfig.cpp
  3. 4
      src/performanceconfig.h

@ -1474,7 +1474,7 @@ bool CMiniDexed::DoSetNewPerformance (void)
bool CMiniDexed::SavePerformanceNewFile () bool CMiniDexed::SavePerformanceNewFile ()
{ {
m_bSavePerformanceNewFile = m_PerformanceConfig.GetInternalFolderOk(); m_bSavePerformanceNewFile = m_PerformanceConfig.GetInternalFolderOk() && m_PerformanceConfig.CheckFreePerformanceSlot();
return m_bSavePerformanceNewFile; return m_bSavePerformanceNewFile;
} }

@ -20,10 +20,13 @@
// You should have received a copy of the GNU General Public License // You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>. // along with this program. If not, see <http://www.gnu.org/licenses/>.
// //
#include <circle/logger.h>
#include "performanceconfig.h" #include "performanceconfig.h"
#include "mididevice.h" #include "mididevice.h"
#include <cstring> #include <cstring>
#include <algorithm> #include <algorithm>
LOGMODULE ("Performance");
CPerformanceConfig::CPerformanceConfig (FATFS *pFileSystem) CPerformanceConfig::CPerformanceConfig (FATFS *pFileSystem)
: m_Properties ("performance.ini", pFileSystem) : m_Properties ("performance.ini", pFileSystem)
@ -747,8 +750,27 @@ bool CPerformanceConfig::GetInternalFolderOk()
return nInternalFolderOk; return nInternalFolderOk;
} }
bool CPerformanceConfig::CheckFreePerformanceSlot(void)
{
if (nLastPerformance < NUM_PERFORMANCES)
{
// There is a free slot...
return true;
}
else
{
return false;
}
}
bool CPerformanceConfig::CreateNewPerformanceFile(void) bool CPerformanceConfig::CreateNewPerformanceFile(void)
{ {
if (nLastPerformance >= NUM_PERFORMANCES) {
// No space left for new performances
LOGWARN ("No space left for new performance");
return false;
}
std::string sPerformanceName = NewPerformanceName; std::string sPerformanceName = NewPerformanceName;
NewPerformanceName=""; NewPerformanceName="";
nActualPerformance=nLastPerformance; nActualPerformance=nLastPerformance;
@ -829,19 +851,23 @@ bool CPerformanceConfig::ListPerformances()
Result = f_findfirst (&Directory, &FileInfo, "SD:/" PERFORMANCE_DIR, "*.ini"); Result = f_findfirst (&Directory, &FileInfo, "SD:/" PERFORMANCE_DIR, "*.ini");
for (unsigned i = 0; Result == FR_OK && FileInfo.fname[0]; i++) for (unsigned i = 0; Result == FR_OK && FileInfo.fname[0]; i++)
{ {
if (!(FileInfo.fattrib & (AM_HID | AM_SYS))) if (nLastPerformance >= NUM_PERFORMANCES) {
{ LOGNOTE ("Skipping performance %s", FileInfo.fname);
std::string FileName = FileInfo.fname; } else {
size_t nLen = FileName.length(); if (!(FileInfo.fattrib & (AM_HID | AM_SYS)))
if ( nLen > 8 && nLen <26 && strcmp(FileName.substr(6,1).c_str(), "_")==0) {
{ std::string FileName = FileInfo.fname;
nPIndex=stoi(FileName.substr(0,6)); size_t nLen = FileName.length();
if(nPIndex > nLastFileIndex) if ( nLen > 8 && nLen <26 && strcmp(FileName.substr(6,1).c_str(), "_")==0)
{ {
nLastFileIndex=nPIndex; nPIndex=stoi(FileName.substr(0,6));
} if(nPIndex > nLastFileIndex)
{
m_nPerformanceFileName[nLastPerformance++]= FileName; nLastFileIndex=nPIndex;
}
m_nPerformanceFileName[nLastPerformance++]= FileName;
}
} }
} }
@ -854,6 +880,8 @@ bool CPerformanceConfig::ListPerformances()
} }
} }
LOGNOTE ("Number of Performances: %d", nLastPerformance);
return nInternalFolderOk; return nInternalFolderOk;
} }

@ -28,6 +28,7 @@
#include <Properties/propertiesfatfsfile.h> #include <Properties/propertiesfatfsfile.h>
#define NUM_VOICE_PARAM 156 #define NUM_VOICE_PARAM 156
#define PERFORMANCE_DIR "performance" #define PERFORMANCE_DIR "performance"
#define NUM_PERFORMANCES 256
class CPerformanceConfig // Performance configuration class CPerformanceConfig // Performance configuration
{ {
@ -131,6 +132,7 @@ public:
std::string GetNewPerformanceDefaultName(void); std::string GetNewPerformanceDefaultName(void);
void SetNewPerformanceName(std::string nName); void SetNewPerformanceName(std::string nName);
bool DeletePerformance(unsigned nID); bool DeletePerformance(unsigned nID);
bool CheckFreePerformanceSlot(void);
private: private:
CPropertiesFatFsFile m_Properties; CPropertiesFatFsFile m_Properties;
@ -168,7 +170,7 @@ private:
unsigned nLastFileIndex; unsigned nLastFileIndex;
unsigned nActualPerformance = 0; unsigned nActualPerformance = 0;
//unsigned nMenuSelectedPerformance = 0; //unsigned nMenuSelectedPerformance = 0;
std::string m_nPerformanceFileName[1024]; std::string m_nPerformanceFileName[NUM_PERFORMANCES];
FATFS *m_pFileSystem; FATFS *m_pFileSystem;
bool nInternalFolderOk=false; bool nInternalFolderOk=false;

Loading…
Cancel
Save