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 12 months 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 ()
{
m_bSavePerformanceNewFile = m_PerformanceConfig.GetInternalFolderOk();
m_bSavePerformanceNewFile = m_PerformanceConfig.GetInternalFolderOk() && m_PerformanceConfig.CheckFreePerformanceSlot();
return m_bSavePerformanceNewFile;
}

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

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

Loading…
Cancel
Save