- Reduced stack usage.
- Added a call to copy_from_user() to SNDRV_EMU10K1_IOCTL_PCM_POKE.
  With this, the ioctl actually might be useful. :)


Index: alsa-kernel/pci/emu10k1/emufx.c
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/pci/emu10k1/emufx.c,v
retrieving revision 1.33
diff -u -r1.33 emufx.c
--- alsa-kernel/pci/emu10k1/emufx.c     9 Jun 2003 08:57:05 -0000       1.33
+++ alsa-kernel/pci/emu10k1/emufx.c     1 Jul 2003 08:12:40 -0000
@@ -945,12 +945,15 @@
        snd_emu10k1_fx8010_ctl_t *ctl, nctl;
        snd_kcontrol_new_t knew;
        snd_kcontrol_t *kctl;
-       snd_ctl_elem_value_t val;
+       snd_ctl_elem_value_t *val;

+       val = (snd_ctl_elem_value_t *)kmalloc(sizeof(*val), GFP_KERNEL);
+       if (!val)
+               return;
        for (i = 0, _gctl = icode->gpr_add_controls;
             i < icode->gpr_add_control_count; i++, _gctl++) {
                if (copy_from_user(&gctl, _gctl, sizeof(gctl)))
-                       return;
+                       break;
                snd_runtime_check(gctl.id.iface == SNDRV_CTL_ELEM_IFACE_MIXER ||
                                  gctl.id.iface == SNDRV_CTL_ELEM_IFACE_PCM, continue);
                snd_runtime_check(gctl.id.name[0] != '\0', continue);
@@ -970,7 +973,7 @@
                for (j = 0; j < 32; j++) {
                        nctl.gpr[j] = gctl.gpr[j];
                        nctl.value[j] = ~gctl.value[j]; /* inverted, we want to write 
new value in gpr_ctl_put() */
-                       val.value.integer.value[j] = gctl.value[j];
+                       val->value.integer.value[j] = gctl.value[j];
                }
                nctl.min = gctl.min;
                nctl.max = gctl.max;
@@ -996,8 +999,9 @@
                        snd_ctl_notify(emu->card, SNDRV_CTL_EVENT_MASK_VALUE |
                                                  SNDRV_CTL_EVENT_MASK_INFO, 
&ctl->kcontrol->id);
                }
-               snd_emu10k1_gpr_ctl_put(ctl->kcontrol, &val);
+               snd_emu10k1_gpr_ctl_put(ctl->kcontrol, val);
        }
+       kfree(val);
 }

 static void snd_emu10k1_del_controls(emu10k1_t *emu, emu10k1_fx8010_code_t *icode)
@@ -2227,7 +2231,7 @@
 static int snd_emu10k1_fx8010_ioctl(snd_hwdep_t * hw, struct file *file, unsigned int 
cmd, unsigned long arg)
 {
        emu10k1_t *emu = snd_magic_cast(emu10k1_t, hw->private_data, return -ENXIO);
-       emu10k1_fx8010_info_t info;
+       emu10k1_fx8010_info_t *info;
        emu10k1_fx8010_code_t *icode;
        emu10k1_fx8010_pcm_t *ipcm;
        unsigned int addr;
@@ -2235,10 +2239,18 @@

        switch (cmd) {
        case SNDRV_EMU10K1_IOCTL_INFO:
-               if ((res = snd_emu10k1_fx8010_info(emu, &info)) < 0)
+               info = (emu10k1_fx8010_info_t *)kmalloc(sizeof(*info), GFP_KERNEL);
+               if (!info)
+                       return -ENOMEM;
+               if ((res = snd_emu10k1_fx8010_info(emu, info)) < 0) {
+                       kfree(info);
                        return res;
-               if (copy_to_user((void *)arg, &info, sizeof(info)))
+               }
+               if (copy_to_user((void *)arg, info, sizeof(*info))) {
+                       kfree(info);
                        return -EFAULT;
+               }
+               kfree(info);
                return 0;
        case SNDRV_EMU10K1_IOCTL_CODE_POKE:
                if (!capable(CAP_SYS_ADMIN))
@@ -2271,9 +2283,13 @@
        case SNDRV_EMU10K1_IOCTL_PCM_POKE:
                if (emu->audigy)
                        return -EINVAL;
-               ipcm = (emu10k1_fx8010_pcm_t *)snd_kcalloc(sizeof(*ipcm), GFP_KERNEL);
+               ipcm = (emu10k1_fx8010_pcm_t *)kmalloc(sizeof(*ipcm), GFP_KERNEL);
                if (ipcm == NULL)
                        return -ENOMEM;
+               if (copy_from_user(ipcm, (void *)arg, sizeof(*ipcm))) {
+                       kfree(ipcm);
+                       return -EFAULT;
+               }
                res = snd_emu10k1_ipcm_poke(emu, ipcm);
                kfree(ipcm);
                return res;




-------------------------------------------------------
This SF.Net email sponsored by: Free pre-built ASP.NET sites including
Data Reports, E-commerce, Portals, and Forums are available now.
Download today and enter to win an XBOX or Visual Studio .NET.
http://aspnet.click-url.com/go/psa00100006ave/direct;at.asp_061203_01/01
_______________________________________________
Alsa-devel mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-devel

Reply via email to