ALSA: mixart: range checking proc file
The original code doesn't take into consideration that the value of MIXART_BA0_SIZE - pos can be less than zero which would lead to a large unsigned value for "count". Also I moved the check that read size is a multiple of 4 bytes below the code that adjusts "count". Signed-off-by: Dan Carpenter <error27@gmail.com> Cc: <stable@kernel.org> Acked-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
a0fd4345f9
commit
b0cc58a25d
|
@ -1161,13 +1161,15 @@ static long snd_mixart_BA0_read(struct snd_info_entry *entry, void *file_private
|
|||
unsigned long count, unsigned long pos)
|
||||
{
|
||||
struct mixart_mgr *mgr = entry->private_data;
|
||||
unsigned long maxsize;
|
||||
|
||||
count = count & ~3; /* make sure the read size is a multiple of 4 bytes */
|
||||
if(count <= 0)
|
||||
if (pos >= MIXART_BA0_SIZE)
|
||||
return 0;
|
||||
if(pos + count > MIXART_BA0_SIZE)
|
||||
count = (long)(MIXART_BA0_SIZE - pos);
|
||||
if(copy_to_user_fromio(buf, MIXART_MEM( mgr, pos ), count))
|
||||
maxsize = MIXART_BA0_SIZE - pos;
|
||||
if (count > maxsize)
|
||||
count = maxsize;
|
||||
count = count & ~3; /* make sure the read size is a multiple of 4 bytes */
|
||||
if (copy_to_user_fromio(buf, MIXART_MEM(mgr, pos), count))
|
||||
return -EFAULT;
|
||||
return count;
|
||||
}
|
||||
|
@ -1180,13 +1182,15 @@ static long snd_mixart_BA1_read(struct snd_info_entry *entry, void *file_private
|
|||
unsigned long count, unsigned long pos)
|
||||
{
|
||||
struct mixart_mgr *mgr = entry->private_data;
|
||||
unsigned long maxsize;
|
||||
|
||||
count = count & ~3; /* make sure the read size is a multiple of 4 bytes */
|
||||
if(count <= 0)
|
||||
if (pos > MIXART_BA1_SIZE)
|
||||
return 0;
|
||||
if(pos + count > MIXART_BA1_SIZE)
|
||||
count = (long)(MIXART_BA1_SIZE - pos);
|
||||
if(copy_to_user_fromio(buf, MIXART_REG( mgr, pos ), count))
|
||||
maxsize = MIXART_BA1_SIZE - pos;
|
||||
if (count > maxsize)
|
||||
count = maxsize;
|
||||
count = count & ~3; /* make sure the read size is a multiple of 4 bytes */
|
||||
if (copy_to_user_fromio(buf, MIXART_REG(mgr, pos), count))
|
||||
return -EFAULT;
|
||||
return count;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue