check groove/speed/virtual tempo bounds
reject bad values
This commit is contained in:
parent
bb814f7760
commit
5e78a48921
3 changed files with 20 additions and 0 deletions
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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++) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue