]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - sound/core/control.c
Merge master.kernel.org:/pub/scm/linux/kernel/git/wim/linux-2.6-watchdog
[mv-sheeva.git] / sound / core / control.c
index 31ad58154c06c8959ed19079237543a2d4f55b0c..48ef0a09a7a71ad964aac00a79404945e6102d22 100644 (file)
@@ -75,6 +75,8 @@ static int snd_ctl_open(struct inode *inode, struct file *file)
        init_waitqueue_head(&ctl->change_sleep);
        spin_lock_init(&ctl->read_lock);
        ctl->card = card;
+       ctl->prefer_pcm_subdevice = -1;
+       ctl->prefer_rawmidi_subdevice = -1;
        ctl->pid = current->pid;
        file->private_data = ctl;
        write_lock_irqsave(&card->ctl_files_rwlock, flags);
@@ -949,6 +951,8 @@ static int snd_ctl_elem_user_tlv(struct snd_kcontrol *kcontrol,
                ue->tlv_data = new_data;
                ue->tlv_data_size = size;
        } else {
+               if (! ue->tlv_data_size || ! ue->tlv_data)
+                       return -ENXIO;
                if (size < ue->tlv_data_size)
                        return -ENOSPC;
                if (copy_to_user(tlv, ue->tlv_data, ue->tlv_data_size))
@@ -1014,10 +1018,6 @@ static int snd_ctl_elem_add(struct snd_ctl_file *file,
        }
        switch (info->type) {
        case SNDRV_CTL_ELEM_TYPE_BOOLEAN:
-               private_size = sizeof(char);
-               if (info->count > 128)
-                       return -EINVAL;
-               break;
        case SNDRV_CTL_ELEM_TYPE_INTEGER:
                private_size = sizeof(long);
                if (info->count > 128)
@@ -1046,6 +1046,7 @@ static int snd_ctl_elem_add(struct snd_ctl_file *file,
        if (ue == NULL)
                return -ENOMEM;
        ue->info = *info;
+       ue->info.access = 0;
        ue->elem_data = (char *)ue + sizeof(*ue);
        ue->elem_data_size = private_size;
        kctl.private_free = snd_ctl_elem_user_free;