diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index 80fbb5ca..a8fd95a4 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -1428,6 +1428,10 @@ bool DivEngine::addWaveFromFile(const char* path) { fclose(f); return false; } + if (len==(SIZE_MAX>>1)) { + fclose(f); + return false; + } if (len==0) { fclose(f); return false; @@ -1620,6 +1624,14 @@ int DivEngine::addSampleFromFile(const char* path) { return -1; } + if (len==(SIZE_MAX>>1)) { + fclose(f); + BUSY_END; + lastError="file is invalid!"; + delete sample; + return -1; + } + if (fseek(f,0,SEEK_SET)<0) { fclose(f); BUSY_END; diff --git a/src/engine/fileOpsIns.cpp b/src/engine/fileOpsIns.cpp index 1173d59a..521ab424 100644 --- a/src/engine/fileOpsIns.cpp +++ b/src/engine/fileOpsIns.cpp @@ -1220,6 +1220,11 @@ std::vector DivEngine::instrumentFromFile(const char* path) { fclose(f); return ret; } + if (len==(SIZE_MAX>>1)) { + lastError=strerror(errno); + fclose(f); + return ret; + } if (len==0) { lastError=strerror(errno); fclose(f); diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 4aa37b81..ddd52592 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -1286,6 +1286,7 @@ void FurnaceGUI::openFileDialog(FurnaceGUIFileDialogs type) { ); break; case GUI_FILE_INS_OPEN: + prevIns=-3; if (!dirExists(workingDirIns)) workingDirIns=getHomeDir(); hasOpened=fileDialog->openLoad( "Load Instrument", @@ -1298,6 +1299,9 @@ void FurnaceGUI::openFileDialog(FurnaceGUIFileDialogs type) { std::vector instruments=e->instrumentFromFile(path); if (!instruments.empty()) { e->loadTempIns(instruments[0]); + if (curIns!=-2) { + prevIns=curIns; + } curIns=-2; } for (DivInstrument* i: instruments) delete i; @@ -2937,6 +2941,9 @@ bool FurnaceGUI::loop() { workingDirLayout=fileDialog->getPath()+DIR_SEPARATOR_STR; break; } + if (prevIns!=-3) { + curIns=prevIns; + } if (fileDialog->accepted()) { fileName=fileDialog->getFileName(); if (fileName!="") { @@ -3791,6 +3798,7 @@ FurnaceGUI::FurnaceGUI(): curSample(0), curOctave(3), curOrder(0), + prevIns(0), oldRow(0), oldOrder(0), oldOrder1(0), diff --git a/src/gui/gui.h b/src/gui/gui.h index 98a86112..91c17b3f 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -931,7 +931,7 @@ class FurnaceGUI { char finalLayoutPath[4096]; - int curIns, curWave, curSample, curOctave, curOrder, oldRow, oldOrder, oldOrder1, editStep, exportLoops, soloChan, soloTimeout, orderEditMode, orderCursor; + int curIns, curWave, curSample, curOctave, curOrder, prevIns, oldRow, oldOrder, oldOrder1, editStep, exportLoops, soloChan, soloTimeout, orderEditMode, orderCursor; int loopOrder, loopRow, loopEnd, isClipping, extraChannelButtons, patNameTarget, newSongCategory, latchTarget; int wheelX, wheelY;