GIT: unionfs2-2.6.27.y: ALSA: mixart: range checking proc file

Erez Zadok ezk at fsl.cs.sunysb.edu
Thu Aug 12 23:15:18 EDT 2010


commit 8a63de3a1462918dcba19f19ba0304284654a193
Author: Dan Carpenter <error27 at gmail.com>
Date:   Tue Apr 6 19:31:26 2010 +0300

    ALSA: mixart: range checking proc file
    
    commit b0cc58a25d04160d39a80e436847eaa2fbc5aa09 upstream.
    
    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 at gmail.com>
    Acked-by: Linus Torvalds <torvalds at linux-foundation.org>
    Signed-off-by: Takashi Iwai <tiwai at suse.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh at suse.de>

diff --git a/sound/pci/mixart/mixart.c b/sound/pci/mixart/mixart.c
index 7e83131..62ebff5 100644
--- a/sound/pci/mixart/mixart.c
+++ b/sound/pci/mixart/mixart.c
@@ -1160,13 +1160,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;
 }
@@ -1179,13 +1181,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;
 }


More information about the unionfs-cvs mailing list