check groove/speed/virtual tempo bounds

reject bad values
This commit is contained in:
tildearrow 2026-01-15 13:54:56 -05:00
parent bb814f7760
commit 5e78a48921
3 changed files with 20 additions and 0 deletions

View file

@ -1545,6 +1545,9 @@ bool DivEngine::loadFur(unsigned char* file, size_t len, int variantID) {
if (ds.version>=96) {
subSong->virtualTempoN=reader.readS();
subSong->virtualTempoD=reader.readS();
if (subSong->virtualTempoN<1) subSong->virtualTempoN=1;
if (subSong->virtualTempoD<1) subSong->virtualTempoD=1;
} else {
reader.readI();
}
@ -1638,6 +1641,7 @@ bool DivEngine::loadFur(unsigned char* file, size_t len, int variantID) {
for (int i=0; i<16; i++) {
subSong->speeds.val[i]=(unsigned char)reader.readC();
}
subSong->speeds.checkBounds();
// grooves
unsigned char grooveCount=reader.readC();
@ -1648,6 +1652,7 @@ bool DivEngine::loadFur(unsigned char* file, size_t len, int variantID) {
for (int j=0; j<16; j++) {
gp.val[j]=(unsigned char)reader.readC();
}
gp.checkBounds();
ds.grooves.push_back(gp);
}

View file

@ -482,10 +482,14 @@ bool DivSubSong::readData(SafeReader& reader, int version, int chans) {
virtualTempoN=reader.readS();
virtualTempoD=reader.readS();
if (virtualTempoN<1) virtualTempoN=1;
if (virtualTempoD<1) virtualTempoD=1;
speeds.len=reader.readC();
for (int i=0; i<16; i++) {
speeds.val[i]=reader.readS();
}
speeds.checkBounds();
name=reader.readString();
notes=reader.readString();
@ -545,6 +549,9 @@ bool DivSubSong::readData(SafeReader& reader, int version, int chans) {
if (version>=96) {
virtualTempoN=reader.readS();
virtualTempoD=reader.readS();
if (virtualTempoN<1) virtualTempoN=1;
if (virtualTempoD<1) virtualTempoD=1;
} else {
reader.readI();
}
@ -591,6 +598,7 @@ bool DivSubSong::readData(SafeReader& reader, int version, int chans) {
for (int i=0; i<16; i++) {
speeds.val[i]=(unsigned char)reader.readC();
}
speeds.checkBounds();
}
for (int i=0; i<16; i++) {
@ -1031,6 +1039,11 @@ void DivSong::unload() {
subsong.clear();
}
void DivGroovePattern::checkBounds() {
if (len<1) len=1;
if (len>16) len=16;
}
bool DivGroovePattern::readData(SafeReader& reader) {
unsigned char magic[4];
@ -1046,6 +1059,7 @@ bool DivGroovePattern::readData(SafeReader& reader) {
for (int i=0; i<16; i++) {
val[i]=reader.readS();
}
checkBounds();
return true;
}

View file

@ -63,6 +63,7 @@ struct DivGroovePattern {
unsigned short len;
bool readData(SafeReader& reader);
void putData(SafeWriter* w);
void checkBounds();
DivGroovePattern():
len(1) {
for (int i=0; i<16; i++) {