X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sound%2Foss%2Femu10k1%2Faudio.c;h=9cf30ab2ff429301cc8261c87914493bed7cbf77;hb=9bf4aaab3e101692164d49b7ca357651eb691cb6;hp=42fae03b16a7e6745de4920304058fbef9f484c4;hpb=5273a3df6485dc2ad6aa7ddd441b9a21970f003b;p=linux-2.6.git diff --git a/sound/oss/emu10k1/audio.c b/sound/oss/emu10k1/audio.c index 42fae03b1..9cf30ab2f 100644 --- a/sound/oss/emu10k1/audio.c +++ b/sound/oss/emu10k1/audio.c @@ -50,7 +50,7 @@ static void calculate_ofrag(struct woinst *); static void calculate_ifrag(struct wiinst *); /* Audio file operations */ -static ssize_t emu10k1_audio_read(struct file *file, char *buffer, size_t count, loff_t * ppos) +static ssize_t emu10k1_audio_read(struct file *file, char __user *buffer, size_t count, loff_t * ppos) { struct emu10k1_wavedevice *wave_dev = (struct emu10k1_wavedevice *) file->private_data; struct wiinst *wiinst = wave_dev->wiinst; @@ -59,9 +59,6 @@ static ssize_t emu10k1_audio_read(struct file *file, char *buffer, size_t count, DPD(3, "emu10k1_audio_read(), buffer=%p, count=%d\n", buffer, (u32) count); - if (ppos != &file->f_pos) - return -ESPIPE; - if (!access_ok(VERIFY_WRITE, buffer, count)) return -EFAULT; @@ -112,7 +109,7 @@ static ssize_t emu10k1_audio_read(struct file *file, char *buffer, size_t count, || (bytestocopy >= count)) { bytestocopy = min_t(u32, bytestocopy, count); - emu10k1_wavein_xferdata(wiinst, (u8 *) buffer, &bytestocopy); + emu10k1_wavein_xferdata(wiinst, (u8 __user *)buffer, &bytestocopy); count -= bytestocopy; buffer += bytestocopy; @@ -137,7 +134,7 @@ static ssize_t emu10k1_audio_read(struct file *file, char *buffer, size_t count, return ret; } -static ssize_t emu10k1_audio_write(struct file *file, const char *buffer, size_t count, loff_t * ppos) +static ssize_t emu10k1_audio_write(struct file *file, const char __user *buffer, size_t count, loff_t * ppos) { struct emu10k1_wavedevice *wave_dev = (struct emu10k1_wavedevice *) file->private_data; struct woinst *woinst = wave_dev->woinst; @@ -146,9 +143,6 @@ static ssize_t emu10k1_audio_write(struct file *file, const char *buffer, size_t DPD(3, "emu10k1_audio_write(), buffer=%p, count=%d\n", buffer, (u32) count); - if (ppos != &file->f_pos) - return -ESPIPE; - if (!access_ok(VERIFY_READ, buffer, count)) return -EFAULT; @@ -212,7 +206,7 @@ static ssize_t emu10k1_audio_write(struct file *file, const char *buffer, size_t bytestocopy = min_t(u32, bytestocopy, count); - emu10k1_waveout_xferdata(woinst, (u8 *) buffer, &bytestocopy); + emu10k1_waveout_xferdata(woinst, (u8 __user *) buffer, &bytestocopy); count -= bytestocopy; buffer += bytestocopy * woinst->num_voices; @@ -254,6 +248,7 @@ static int emu10k1_audio_ioctl(struct inode *inode, struct file *file, unsigned int val = 0; u32 bytestocopy; unsigned long flags; + int __user *p = (int __user *)arg; DPF(4, "emu10k1_audio_ioctl()\n"); @@ -266,7 +261,7 @@ static int emu10k1_audio_ioctl(struct inode *inode, struct file *file, unsigned switch (cmd) { case OSS_GETVERSION: DPF(2, "OSS_GETVERSION:\n"); - return put_user(SOUND_VERSION, (int *) arg); + return put_user(SOUND_VERSION, p); case SNDCTL_DSP_RESET: DPF(2, "SNDCTL_DSP_RESET:\n"); @@ -352,11 +347,11 @@ static int emu10k1_audio_ioctl(struct inode *inode, struct file *file, unsigned DPF(2, "SNDCTL_DSP_GETCAPS:\n"); return put_user(DSP_CAP_DUPLEX | DSP_CAP_REALTIME | DSP_CAP_TRIGGER | DSP_CAP_MMAP | - DSP_CAP_COPROC| DSP_CAP_MULTI, (int *) arg); + DSP_CAP_COPROC| DSP_CAP_MULTI, p); case SNDCTL_DSP_SPEED: DPF(2, "SNDCTL_DSP_SPEED:\n"); - if (get_user(val, (int *) arg)) + if (get_user(val, p)) return -EFAULT; DPD(2, "val is %d\n", val); @@ -402,21 +397,21 @@ static int emu10k1_audio_ioctl(struct inode *inode, struct file *file, unsigned DPD(2, "set playback sampling rate -> %d\n", val); } - return put_user(val, (int *) arg); + return put_user(val, p); } else { if (file->f_mode & FMODE_READ) val = wiinst->format.samplingrate; else if (file->f_mode & FMODE_WRITE) val = woinst->format.samplingrate; - return put_user(val, (int *) arg); + return put_user(val, p); } break; case SNDCTL_DSP_STEREO: DPF(2, "SNDCTL_DSP_STEREO:\n"); - if (get_user(val, (int *) arg)) + if (get_user(val, p)) return -EFAULT; DPD(2, " val is %d\n", val); @@ -460,14 +455,14 @@ static int emu10k1_audio_ioctl(struct inode *inode, struct file *file, unsigned DPD(2, "set playback stereo -> %d\n", val); } - return put_user(val, (int *) arg); + return put_user(val, p); break; case SNDCTL_DSP_CHANNELS: DPF(2, "SNDCTL_DSP_CHANNELS:\n"); - if (get_user(val, (int *) arg)) + if (get_user(val, p)) return -EFAULT; DPD(2, " val is %d\n", val); @@ -510,14 +505,14 @@ static int emu10k1_audio_ioctl(struct inode *inode, struct file *file, unsigned DPD(2, "set playback number of channels -> %d\n", val); } - return put_user(val, (int *) arg); + return put_user(val, p); } else { if (file->f_mode & FMODE_READ) val = wiinst->format.channels; else if (file->f_mode & FMODE_WRITE) val = woinst->format.channels; - return put_user(val, (int *) arg); + return put_user(val, p); } break; @@ -533,12 +528,12 @@ static int emu10k1_audio_ioctl(struct inode *inode, struct file *file, unsigned wave_dev->card->pt.enable_gpr_name) >= 0) val |= AFMT_AC3; } - return put_user(val, (int *) arg); + return put_user(val, p); case SNDCTL_DSP_SETFMT: /* Same as SNDCTL_DSP_SAMPLESIZE */ DPF(2, "SNDCTL_DSP_SETFMT:\n"); - if (get_user(val, (int *) arg)) + if (get_user(val, p)) return -EFAULT; DPD(2, " val is %d\n", val); @@ -582,14 +577,14 @@ static int emu10k1_audio_ioctl(struct inode *inode, struct file *file, unsigned DPD(2, "set playback format -> %d\n", val); } - return put_user(val, (int *) arg); + return put_user(val, p); } else { if (file->f_mode & FMODE_READ) val = wiinst->format.id; else if (file->f_mode & FMODE_WRITE) val = woinst->format.id; - return put_user(val, (int *) arg); + return put_user(val, p); } break; @@ -600,7 +595,7 @@ static int emu10k1_audio_ioctl(struct inode *inode, struct file *file, unsigned else if (file->f_mode & FMODE_WRITE) val = woinst->format.bitsperchannel; - return put_user(val, (int *) arg); + return put_user(val, p); case SOUND_PCM_READ_RATE: @@ -609,7 +604,7 @@ static int emu10k1_audio_ioctl(struct inode *inode, struct file *file, unsigned else if (file->f_mode & FMODE_WRITE) val = woinst->format.samplingrate; - return put_user(val, (int *) arg); + return put_user(val, p); case SOUND_PCM_READ_CHANNELS: @@ -618,7 +613,7 @@ static int emu10k1_audio_ioctl(struct inode *inode, struct file *file, unsigned else if (file->f_mode & FMODE_WRITE) val = woinst->format.channels; - return put_user(val, (int *) arg); + return put_user(val, p); case SOUND_PCM_WRITE_FILTER: DPF(2, "SOUND_PCM_WRITE_FILTER: not implemented\n"); @@ -641,12 +636,12 @@ static int emu10k1_audio_ioctl(struct inode *inode, struct file *file, unsigned if (file->f_mode & FMODE_READ && (wave_dev->enablebits & PCM_ENABLE_INPUT)) val |= PCM_ENABLE_INPUT; - return put_user(val, (int *) arg); + return put_user(val, p); case SNDCTL_DSP_SETTRIGGER: DPF(2, "SNDCTL_DSP_SETTRIGGER:\n"); - if (get_user(val, (int *) arg)) + if (get_user(val, p)) return -EFAULT; if (file->f_mode & FMODE_WRITE) { @@ -708,7 +703,7 @@ static int emu10k1_audio_ioctl(struct inode *inode, struct file *file, unsigned info.fragstotal = woinst->buffer.numfrags * woinst->num_voices; info.fragments = info.bytes / info.fragsize; - if (copy_to_user((int *) arg, &info, sizeof(info))) + if (copy_to_user(p, &info, sizeof(info))) return -EFAULT; } break; @@ -737,7 +732,7 @@ static int emu10k1_audio_ioctl(struct inode *inode, struct file *file, unsigned info.fragments = info.bytes / wiinst->buffer.fragment_size; info.fragsize = wiinst->buffer.fragment_size; - if (copy_to_user((int *) arg, &info, sizeof(info))) + if (copy_to_user(p, &info, sizeof(info))) return -EFAULT; } break; @@ -765,7 +760,7 @@ static int emu10k1_audio_ioctl(struct inode *inode, struct file *file, unsigned val *= woinst->num_voices; spin_unlock_irqrestore(&woinst->lock, flags); - return put_user(val, (int *) arg); + return put_user(val, p); case SNDCTL_DSP_GETIPTR: { @@ -795,7 +790,7 @@ static int emu10k1_audio_ioctl(struct inode *inode, struct file *file, unsigned spin_unlock_irqrestore(&wiinst->lock, flags); - if (copy_to_user((void *) arg, &cinfo, sizeof(cinfo))) + if (copy_to_user(p, &cinfo, sizeof(cinfo))) return -EFAULT; } break; @@ -841,7 +836,7 @@ static int emu10k1_audio_ioctl(struct inode *inode, struct file *file, unsigned spin_unlock_irqrestore(&woinst->lock, flags); - if (copy_to_user((void *) arg, &cinfo, sizeof(cinfo))) + if (copy_to_user(p, &cinfo, sizeof(cinfo))) return -EFAULT; } break; @@ -867,7 +862,7 @@ static int emu10k1_audio_ioctl(struct inode *inode, struct file *file, unsigned spin_unlock_irqrestore(&wiinst->lock, flags); } - return put_user(val, (int *) arg); + return put_user(val, p); break; @@ -892,7 +887,7 @@ static int emu10k1_audio_ioctl(struct inode *inode, struct file *file, unsigned case SNDCTL_DSP_SETFRAGMENT: DPF(2, "SNDCTL_DSP_SETFRAGMENT:\n"); - if (get_user(val, (int *) arg)) + if (get_user(val, p)) return -EFAULT; DPD(2, "val is %#x\n", val); @@ -930,7 +925,7 @@ static int emu10k1_audio_ioctl(struct inode *inode, struct file *file, unsigned if (!buf) return -ENOMEM; - if (copy_from_user(buf, (copr_buffer *) arg, sizeof(copr_buffer))) { + if (copy_from_user(buf, p, sizeof(copr_buffer))) { kfree (buf); return -EFAULT; } @@ -969,7 +964,7 @@ static int emu10k1_audio_ioctl(struct inode *inode, struct file *file, unsigned for (i = 0; i < buf->len; i++) ((u32 *) buf->data)[i] = sblive_readptr(wave_dev->card, buf->offs + i, buf->flags); - if (copy_to_user((copr_buffer *) arg, buf, sizeof(copr_buffer))) { + if (copy_to_user(p, buf, sizeof(copr_buffer))) { kfree(buf); return -EFAULT; } @@ -1248,7 +1243,7 @@ match: file->private_data = (void *) wave_dev; - return 0; + return nonseekable_open(inode, file); } static int emu10k1_audio_release(struct inode *inode, struct file *file)