added boundary checks for sound/music ID for some sound and music functions
authorHolger Schemel <info@artsoft.org>
Fri, 2 Feb 2018 23:51:48 +0000 (00:51 +0100)
committerHolger Schemel <info@artsoft.org>
Fri, 2 Feb 2018 23:55:29 +0000 (00:55 +0100)
- this causes game music with negative music ID not being played anymore
- negative music IDs are used for (game) music files not specified in a GIC
- playing game music with negative ID will be fixed in the next commit

src/libgame/sound.c

index ea055503cbaa0204a18f0c8ba6e88b8b8fe8a82c..8a5ab84eb71b153d780973be1bed2fe3149cef6c 100644 (file)
@@ -687,41 +687,57 @@ int getMusicListSize()
 
 struct FileInfo *getSoundListEntry(int pos)
 {
+  int num_sounds = getSoundListSize();
   int num_list_entries = sound_info->num_file_list_entries;
   int list_pos = (pos < num_list_entries ? pos : pos - num_list_entries);
 
+  if (pos < 0 || pos >= num_sounds)    /* invalid sound */
+    return NULL;
+
   return (pos < num_list_entries ? &sound_info->file_list[list_pos] :
          &sound_info->dynamic_file_list[list_pos]);
 }
 
 struct FileInfo *getMusicListEntry(int pos)
 {
+  int num_music = getMusicListSize();
   int num_list_entries = music_info->num_file_list_entries;
   int list_pos = (pos < num_list_entries ? pos : pos - num_list_entries);
 
+  if (pos < 0 || pos >= num_music)     /* invalid music */
+    return NULL;
+
   return (pos < num_list_entries ? &music_info->file_list[list_pos] :
          &music_info->dynamic_file_list[list_pos]);
 }
 
 static SoundInfo *getSoundInfoEntryFromSoundID(int pos)
 {
+  int num_sounds = getSoundListSize();
   int num_list_entries = sound_info->num_file_list_entries;
   int list_pos = (pos < num_list_entries ? pos : pos - num_list_entries);
   SoundInfo **snd_info =
     (SoundInfo **)(pos < num_list_entries ? sound_info->artwork_list :
                   sound_info->dynamic_artwork_list);
 
+  if (pos < 0 || pos >= num_sounds)    /* invalid sound */
+    return NULL;
+
   return snd_info[list_pos];
 }
 
 static MusicInfo *getMusicInfoEntryFromMusicID(int pos)
 {
+  int num_music = getMusicListSize();
   int num_list_entries = music_info->num_file_list_entries;
   int list_pos = (pos < num_list_entries ? pos : pos - num_list_entries);
   MusicInfo **mus_info =
     (MusicInfo **)(pos < num_list_entries ? music_info->artwork_list :
                   music_info->dynamic_artwork_list);
 
+  if (pos < 0 || pos >= num_music)     /* invalid music */
+    return NULL;
+
   return mus_info[list_pos];
 }