Skip to content

Commit

Permalink
ALSA: emux: improve patch ioctl data validation
Browse files Browse the repository at this point in the history
[ Upstream commit 89b32cc ]

In load_data(), make the validation of and skipping over the main info
block match that in load_guspatch().

In load_guspatch(), add checking that the specified patch length matches
the actually supplied data, like load_data() already did.

Signed-off-by: Oswald Buddenhagen <oswald.buddenhagen@gmx.de>
Message-ID: <20240406064830.1029573-8-oswald.buddenhagen@gmx.de>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Sasha Levin <sashal@kernel.org>
  • Loading branch information
ossilator authored and gregkh committed Jul 5, 2024
1 parent 763896a commit d23982e
Showing 1 changed file with 11 additions and 6 deletions.
17 changes: 11 additions & 6 deletions sound/synth/emux/soundfont.c
Original file line number Diff line number Diff line change
Expand Up @@ -697,7 +697,6 @@ load_data(struct snd_sf_list *sflist, const void __user *data, long count)
struct snd_soundfont *sf;
struct soundfont_sample_info sample_info;
struct snd_sf_sample *sp;
long off;

/* patch must be opened */
if ((sf = sflist->currsf) == NULL)
Expand All @@ -706,12 +705,16 @@ load_data(struct snd_sf_list *sflist, const void __user *data, long count)
if (is_special_type(sf->type))
return -EINVAL;

if (count < (long)sizeof(sample_info)) {
return -EINVAL;
}
if (copy_from_user(&sample_info, data, sizeof(sample_info)))
return -EFAULT;
data += sizeof(sample_info);
count -= sizeof(sample_info);

off = sizeof(sample_info);

if (sample_info.size != (count-off)/2)
// SoundFont uses S16LE samples.
if (sample_info.size * 2 != count)
return -EINVAL;

/* Check for dup */
Expand All @@ -738,7 +741,7 @@ load_data(struct snd_sf_list *sflist, const void __user *data, long count)
int rc;
rc = sflist->callback.sample_new
(sflist->callback.private_data, sp, sflist->memhdr,
data + off, count - off);
data, count);
if (rc < 0) {
sf_sample_delete(sflist, sf, sp);
return rc;
Expand Down Expand Up @@ -951,10 +954,12 @@ load_guspatch(struct snd_sf_list *sflist, const char __user *data,
}
if (copy_from_user(&patch, data, sizeof(patch)))
return -EFAULT;

count -= sizeof(patch);
data += sizeof(patch);

if ((patch.len << (patch.mode & WAVE_16_BITS ? 1 : 0)) != count)
return -EINVAL;

sf = newsf(sflist, SNDRV_SFNT_PAT_TYPE_GUS|SNDRV_SFNT_PAT_SHARED, NULL);
if (sf == NULL)
return -ENOMEM;
Expand Down

0 comments on commit d23982e

Please sign in to comment.