summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/newgrf.cpp41
-rw-r--r--src/newgrf_sound.cpp12
-rw-r--r--src/newgrf_sound.h2
-rw-r--r--src/sound.cpp8
4 files changed, 45 insertions, 18 deletions
diff --git a/src/newgrf.cpp b/src/newgrf.cpp
index b065216e3..27fe019bc 100644
--- a/src/newgrf.cpp
+++ b/src/newgrf.cpp
@@ -6874,10 +6874,13 @@ static void DefineGotoLabel(ByteReader *buf)
grfmsg(2, "DefineGotoLabel: GOTO target with label 0x%02X", label->label);
}
-static void ImportGRFSound()
+/**
+ * Process a sound import from another GRF file.
+ * @param sound Destination for sound.
+ */
+static void ImportGRFSound(SoundEntry *sound)
{
const GRFFile *file;
- SoundEntry *sound = AllocateSound();
uint32 grfid = FioReadDword();
SoundID sound_id = FioReadWord();
@@ -6901,10 +6904,13 @@ static void ImportGRFSound()
sound->priority = 0;
}
-static void LoadGRFSound(size_t offs)
+/**
+ * Load a sound from a file.
+ * @param offs File offset to read sound from.
+ * @param sound Destination for sound.
+ */
+static void LoadGRFSound(size_t offs, SoundEntry *sound)
{
- SoundEntry *sound = AllocateSound();
-
/* Set default volume and priority */
sound->volume = 0x80;
sound->priority = 0;
@@ -6925,15 +6931,24 @@ static void GRFSound(ByteReader *buf)
* W num Number of sound files that follow */
uint16 num = buf->ReadWord();
+ if (num == 0) return;
+ SoundEntry *sound;
if (_cur.grffile->sound_offset == 0) {
_cur.grffile->sound_offset = GetNumSounds();
_cur.grffile->num_sounds = num;
+ sound = AllocateSound(num);
+ } else {
+ sound = GetSound(_cur.grffile->sound_offset);
}
for (int i = 0; i < num; i++) {
_cur.nfo_line++;
+ /* Check whether the index is in range. This might happen if multiple action 11 are present.
+ * While this is invalid, we do not check for this. But we should prevent it from causing bigger trouble */
+ bool invalid = i >= _cur.grffile->num_sounds;
+
size_t offs = FioGetPos();
uint32 len = _cur.grf_container_ver >= 2 ? FioReadDword() : FioReadWord();
@@ -6941,12 +6956,15 @@ static void GRFSound(ByteReader *buf)
if (_cur.grf_container_ver >= 2 && type == 0xFD) {
/* Reference to sprite section. */
- if (len != 4) {
+ if (invalid) {
+ grfmsg(1, "GRFSound: Sound index out of range (multiple Action 11?)");
+ FioSkipBytes(len);
+ } else if (len != 4) {
grfmsg(1, "GRFSound: Invalid sprite section import");
FioSkipBytes(len);
} else {
uint32 id = FioReadDword();
- if (_cur.stage == GLS_INIT) LoadGRFSound(GetGRFSpriteOffset(id));
+ if (_cur.stage == GLS_INIT) LoadGRFSound(GetGRFSpriteOffset(id), sound + i);
}
continue;
}
@@ -6958,6 +6976,11 @@ static void GRFSound(ByteReader *buf)
continue;
}
+ if (invalid) {
+ grfmsg(1, "GRFSound: Sound index out of range (multiple Action 11?)");
+ FioSkipBytes(len);
+ }
+
byte action = FioReadByte();
switch (action) {
case 0xFF:
@@ -6966,7 +6989,7 @@ static void GRFSound(ByteReader *buf)
if (_cur.grf_container_ver >= 2) {
grfmsg(1, "GRFSound: Inline sounds are not supported for container version >= 2");
} else {
- LoadGRFSound(offs);
+ LoadGRFSound(offs, sound + i);
}
}
FioSkipBytes(len - 1); // already read <action>
@@ -6977,7 +7000,7 @@ static void GRFSound(ByteReader *buf)
/* XXX 'Action 0xFE' isn't really specified. It is only mentioned for
* importing sounds, so this is probably all wrong... */
if (FioReadByte() != 0) grfmsg(1, "GRFSound: Import type mismatch");
- ImportGRFSound();
+ ImportGRFSound(sound + i);
} else {
FioSkipBytes(len - 1); // already read <action>
}
diff --git a/src/newgrf_sound.cpp b/src/newgrf_sound.cpp
index 5abd443c9..b82853ac6 100644
--- a/src/newgrf_sound.cpp
+++ b/src/newgrf_sound.cpp
@@ -22,11 +22,15 @@
static SmallVector<SoundEntry, 8> _sounds;
-/* Allocate a new Sound */
-SoundEntry *AllocateSound()
+/**
+ * Allocate sound slots.
+ * @param num Number of slots to allocate.
+ * @return First allocated slot.
+ */
+SoundEntry *AllocateSound(uint num)
{
- SoundEntry *sound = _sounds.Append();
- MemSetT(sound, 0);
+ SoundEntry *sound = _sounds.Append(num);
+ MemSetT(sound, 0, num);
return sound;
}
diff --git a/src/newgrf_sound.h b/src/newgrf_sound.h
index a6375cee4..0d3295327 100644
--- a/src/newgrf_sound.h
+++ b/src/newgrf_sound.h
@@ -30,7 +30,7 @@ enum VehicleSoundEvent {
};
-SoundEntry *AllocateSound();
+SoundEntry *AllocateSound(uint num);
void InitializeSoundPool();
bool LoadNewGRFSound(SoundEntry *sound);
SoundEntry *GetSound(SoundID sound_id);
diff --git a/src/sound.cpp b/src/sound.cpp
index f792dfdff..4c7277852 100644
--- a/src/sound.cpp
+++ b/src/sound.cpp
@@ -218,11 +218,11 @@ static const byte _sound_idx[] = {
void SndCopyToPool()
{
+ SoundEntry *sound = AllocateSound(ORIGINAL_SAMPLE_COUNT);
for (uint i = 0; i < ORIGINAL_SAMPLE_COUNT; i++) {
- SoundEntry *sound = AllocateSound();
- *sound = _original_sounds[_sound_idx[i]];
- sound->volume = _sound_base_vol[i];
- sound->priority = 0;
+ sound[i] = _original_sounds[_sound_idx[i]];
+ sound[i].volume = _sound_base_vol[i];
+ sound[i].priority = 0;
}
}