static long sound_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { int len = 0, dtype; int dev = iminor(file->f_dentry->d_inode); long ret = -EINVAL; void __user *p = (void __user *)arg; if (_SIOC_DIR(cmd) != _SIOC_NONE && _SIOC_DIR(cmd) != 0) { /* * Have to validate the address given by the process. */ len = _SIOC_SIZE(cmd); if (len < 1 || len > 65536 || !p) return -EFAULT; if (_SIOC_DIR(cmd) & _SIOC_WRITE) if (!access_ok(VERIFY_READ, p, len)) return -EFAULT; if (_SIOC_DIR(cmd) & _SIOC_READ) if (!access_ok(VERIFY_WRITE, p, len)) return -EFAULT; } DEB(printk("sound_ioctl(dev=%d, cmd=0x%x, arg=0x%x)\n", dev, cmd, arg)); if (cmd == OSS_GETVERSION) return __put_user(SOUND_VERSION, (int __user *)p); lock_kernel(); if (_IOC_TYPE(cmd) == 'M' && num_mixers > 0 && /* Mixer ioctl */ (dev & 0x0f) != SND_DEV_CTL) { dtype = dev & 0x0f; switch (dtype) { case SND_DEV_DSP: case SND_DEV_DSP16: case SND_DEV_AUDIO: ret = sound_mixer_ioctl(audio_devs[dev >> 4]->mixer_dev, cmd, p); break; default: ret = sound_mixer_ioctl(dev >> 4, cmd, p); break; } unlock_kernel(); return ret; }
static int sound_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { int err, len = 0, dtype; int dev = MINOR(inode->i_rdev); if (_SIOC_DIR(cmd) != _SIOC_NONE && _SIOC_DIR(cmd) != 0) { /* * Have to validate the address given by the process. */ len = _SIOC_SIZE(cmd); if (len < 1 || len > 65536 || arg == 0) return -EFAULT; if (_SIOC_DIR(cmd) & _SIOC_WRITE) if ((err = verify_area(VERIFY_READ, (void *)arg, len)) < 0) return err; if (_SIOC_DIR(cmd) & _SIOC_READ) if ((err = verify_area(VERIFY_WRITE, (void *)arg, len)) < 0) return err; } DEB(printk("sound_ioctl(dev=%d, cmd=0x%x, arg=0x%x)\n", dev, cmd, arg)); if (cmd == OSS_GETVERSION) return __put_user(SOUND_VERSION, (int *)arg); if (_IOC_TYPE(cmd) == 'M' && num_mixers > 0 && /* Mixer ioctl */ (dev & 0x0f) != SND_DEV_CTL) { dtype = dev & 0x0f; switch (dtype) { #ifdef CONFIG_AUDIO case SND_DEV_DSP: case SND_DEV_DSP16: case SND_DEV_AUDIO: return sound_mixer_ioctl(audio_devs[dev >> 4]->mixer_dev, cmd, (caddr_t)arg); #endif default: return sound_mixer_ioctl(dev >> 4, cmd, (caddr_t)arg); } }