Merge branch 'work.misc' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull misc vfs updates from Al Viro: "All kinds of misc stuff, without any unifying topic, from various people. Neil's d_anon patch, several bugfixes, introduction of kvmalloc analogue of kmemdup_user(), extending bitfield.h to deal with fixed-endians, assorted cleanups all over the place..." * 'work.misc' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: (28 commits) alpha: osf_sys.c: use timespec64 where appropriate alpha: osf_sys.c: fix put_tv32 regression jffs2: Fix use-after-free bug in jffs2_iget()'s error handling path dcache: delete unused d_hash_mask dcache: subtract d_hash_shift from 32 in advance fs/buffer.c: fold init_buffer() into init_page_buffers() fs: fold __inode_permission() into inode_permission() fs: add RWF_APPEND sctp: use vmemdup_user() rather than badly open-coding memdup_user() snd_ctl_elem_init_enum_names(): switch to vmemdup_user() replace_user_tlv(): switch to vmemdup_user() new primitive: vmemdup_user() memdup_user(): switch to GFP_USER eventfd: fold eventfd_ctx_get() into eventfd_ctx_fileget() eventfd: fold eventfd_ctx_read() into eventfd_read() eventfd: convert to use anon_inode_getfd() nfs4file: get rid of pointless include of btrfs.h uvc_v4l2: clean copyin/copyout up vme_user: don't use __copy_..._user() usx2y: don't bother with memdup_user() for 16-byte structure ...
This commit is contained in:
@@ -378,7 +378,7 @@ out:
|
||||
static int usb_stream_hwdep_ioctl(struct snd_hwdep *hw, struct file *file,
|
||||
unsigned cmd, unsigned long arg)
|
||||
{
|
||||
struct usb_stream_config *cfg;
|
||||
struct usb_stream_config cfg;
|
||||
struct us122l *us122l = hw->private_data;
|
||||
struct usb_stream *s;
|
||||
unsigned min_period_frames;
|
||||
@@ -388,24 +388,21 @@ static int usb_stream_hwdep_ioctl(struct snd_hwdep *hw, struct file *file,
|
||||
if (cmd != SNDRV_USB_STREAM_IOCTL_SET_PARAMS)
|
||||
return -ENOTTY;
|
||||
|
||||
cfg = memdup_user((void *)arg, sizeof(*cfg));
|
||||
if (IS_ERR(cfg))
|
||||
return PTR_ERR(cfg);
|
||||
if (copy_from_user(&cfg, (void __user *)arg, sizeof(cfg)))
|
||||
return -EFAULT;
|
||||
|
||||
if (cfg.version != USB_STREAM_INTERFACE_VERSION)
|
||||
return -ENXIO;
|
||||
|
||||
if (cfg->version != USB_STREAM_INTERFACE_VERSION) {
|
||||
err = -ENXIO;
|
||||
goto free;
|
||||
}
|
||||
high_speed = us122l->dev->speed == USB_SPEED_HIGH;
|
||||
if ((cfg->sample_rate != 44100 && cfg->sample_rate != 48000 &&
|
||||
if ((cfg.sample_rate != 44100 && cfg.sample_rate != 48000 &&
|
||||
(!high_speed ||
|
||||
(cfg->sample_rate != 88200 && cfg->sample_rate != 96000))) ||
|
||||
cfg->frame_size != 6 ||
|
||||
cfg->period_frames > 0x3000) {
|
||||
err = -EINVAL;
|
||||
goto free;
|
||||
}
|
||||
switch (cfg->sample_rate) {
|
||||
(cfg.sample_rate != 88200 && cfg.sample_rate != 96000))) ||
|
||||
cfg.frame_size != 6 ||
|
||||
cfg.period_frames > 0x3000)
|
||||
return -EINVAL;
|
||||
|
||||
switch (cfg.sample_rate) {
|
||||
case 44100:
|
||||
min_period_frames = 48;
|
||||
break;
|
||||
@@ -418,10 +415,8 @@ static int usb_stream_hwdep_ioctl(struct snd_hwdep *hw, struct file *file,
|
||||
}
|
||||
if (!high_speed)
|
||||
min_period_frames <<= 1;
|
||||
if (cfg->period_frames < min_period_frames) {
|
||||
err = -EINVAL;
|
||||
goto free;
|
||||
}
|
||||
if (cfg.period_frames < min_period_frames)
|
||||
return -EINVAL;
|
||||
|
||||
snd_power_wait(hw->card, SNDRV_CTL_POWER_D0);
|
||||
|
||||
@@ -430,24 +425,22 @@ static int usb_stream_hwdep_ioctl(struct snd_hwdep *hw, struct file *file,
|
||||
if (!us122l->master)
|
||||
us122l->master = file;
|
||||
else if (us122l->master != file) {
|
||||
if (!s || memcmp(cfg, &s->cfg, sizeof(*cfg))) {
|
||||
if (!s || memcmp(&cfg, &s->cfg, sizeof(cfg))) {
|
||||
err = -EIO;
|
||||
goto unlock;
|
||||
}
|
||||
us122l->slave = file;
|
||||
}
|
||||
if (!s || memcmp(cfg, &s->cfg, sizeof(*cfg)) ||
|
||||
if (!s || memcmp(&cfg, &s->cfg, sizeof(cfg)) ||
|
||||
s->state == usb_stream_xrun) {
|
||||
us122l_stop(us122l);
|
||||
if (!us122l_start(us122l, cfg->sample_rate, cfg->period_frames))
|
||||
if (!us122l_start(us122l, cfg.sample_rate, cfg.period_frames))
|
||||
err = -EIO;
|
||||
else
|
||||
err = 1;
|
||||
}
|
||||
unlock:
|
||||
mutex_unlock(&us122l->mutex);
|
||||
free:
|
||||
kfree(cfg);
|
||||
wake_up_all(&us122l->sk.sleep);
|
||||
return err;
|
||||
}
|
||||
|
@@ -198,24 +198,22 @@ static int snd_usX2Y_hwdep_dsp_load(struct snd_hwdep *hw,
|
||||
struct snd_hwdep_dsp_image *dsp)
|
||||
{
|
||||
struct usX2Ydev *priv = hw->private_data;
|
||||
int lret, err = -EINVAL;
|
||||
struct usb_device* dev = priv->dev;
|
||||
int lret, err;
|
||||
char *buf;
|
||||
|
||||
snd_printdd( "dsp_load %s\n", dsp->name);
|
||||
|
||||
if (access_ok(VERIFY_READ, dsp->image, dsp->length)) {
|
||||
struct usb_device* dev = priv->dev;
|
||||
char *buf;
|
||||
buf = memdup_user(dsp->image, dsp->length);
|
||||
if (IS_ERR(buf))
|
||||
return PTR_ERR(buf);
|
||||
|
||||
buf = memdup_user(dsp->image, dsp->length);
|
||||
if (IS_ERR(buf))
|
||||
return PTR_ERR(buf);
|
||||
|
||||
err = usb_set_interface(dev, 0, 1);
|
||||
if (err)
|
||||
snd_printk(KERN_ERR "usb_set_interface error \n");
|
||||
else
|
||||
err = usb_bulk_msg(dev, usb_sndbulkpipe(dev, 2), buf, dsp->length, &lret, 6000);
|
||||
kfree(buf);
|
||||
}
|
||||
err = usb_set_interface(dev, 0, 1);
|
||||
if (err)
|
||||
snd_printk(KERN_ERR "usb_set_interface error \n");
|
||||
else
|
||||
err = usb_bulk_msg(dev, usb_sndbulkpipe(dev, 2), buf, dsp->length, &lret, 6000);
|
||||
kfree(buf);
|
||||
if (err)
|
||||
return err;
|
||||
if (dsp->index == 1) {
|
||||
|
Reference in New Issue
Block a user