diff options
| author | Linus Torvalds <torvalds@home.transmeta.com> | 2002-05-19 18:54:17 -0700 |
|---|---|---|
| committer | Linus Torvalds <torvalds@home.transmeta.com> | 2002-05-19 18:54:17 -0700 |
| commit | 80be221757caf0b316622eb1852ecabd77e1163d (patch) | |
| tree | a2bfcfc09051f845dda5cbe9eb44c9b6f82ceab3 | |
| parent | 20131c106c10d60abc8d5a8c8399f75d1231fd4b (diff) | |
| parent | 2d7d1c4ec4a7ac76240170ec2ffa30eb124da36a (diff) | |
Merge http://kernel-acme.bkbits.net:8080/char-copy_tofrom_user-2.5
into home.transmeta.com:/home/torvalds/v2.5/linux
| -rw-r--r-- | drivers/char/epca.c | 49 | ||||
| -rw-r--r-- | drivers/char/istallion.c | 15 | ||||
| -rw-r--r-- | drivers/char/machzwd.c | 11 | ||||
| -rw-r--r-- | drivers/char/mxser.c | 6 | ||||
| -rw-r--r-- | drivers/char/n_r3964.c | 2 | ||||
| -rw-r--r-- | drivers/char/nwflash.c | 3 | ||||
| -rw-r--r-- | drivers/char/raw.c | 7 | ||||
| -rw-r--r-- | drivers/char/stallion.c | 36 | ||||
| -rw-r--r-- | drivers/char/sx.c | 7 | ||||
| -rw-r--r-- | drivers/char/tpqic02.c | 10 |
10 files changed, 71 insertions, 75 deletions
diff --git a/drivers/char/epca.c b/drivers/char/epca.c index 21f270d0d14d..d90d0d973380 100644 --- a/drivers/char/epca.c +++ b/drivers/char/epca.c @@ -907,7 +907,9 @@ static int pc_write(struct tty_struct * tty, int from_user, ----------------------------------------------------------------- */ - copy_from_user(ch->tmp_buf, buf, bytesAvailable); + if (copy_from_user(ch->tmp_buf, buf, + bytesAvailable)) + return -EFAULT; } /* End if area verified */ @@ -2999,7 +3001,8 @@ static int pc_ioctl(struct tty_struct *tty, struct file * file, di.port = boards[brd].port ; di.membase = boards[brd].membase ; - copy_to_user((char *)arg, &di, sizeof (di)); + if (copy_to_user((char *)arg, &di, sizeof (di))) + return -EFAULT; break; } /* End case DIGI_GETINFO */ @@ -3068,14 +3071,9 @@ static int pc_ioctl(struct tty_struct *tty, struct file * file, { /* Begin switch cmd */ case TCGETS: - retval = verify_area(VERIFY_WRITE, (void *)arg, - sizeof(struct termios)); - - if (retval) - return(retval); - - copy_to_user((struct termios *)arg, - tty->termios, sizeof(struct termios)); + if (copy_to_user((struct termios *)arg, + tty->termios, sizeof(struct termios))) + return -EFAULT; return(0); case TCGETA: @@ -3235,14 +3233,9 @@ static int pc_ioctl(struct tty_struct *tty, struct file * file, break; case DIGI_GETA: - if ((error= - verify_area(VERIFY_WRITE, (char*)arg, sizeof(digi_t)))) - { - printk(KERN_ERR "<Error> - Digi GETA failed\n"); - return(error); - } - - copy_to_user((char*)arg, &ch->digiext, sizeof(digi_t)); + if (copy_to_user((char*)arg, &ch->digiext, + sizeof(digi_t))) + return -EFAULT; break; case DIGI_SETAW: @@ -3263,11 +3256,9 @@ static int pc_ioctl(struct tty_struct *tty, struct file * file, /* Fall Thru */ case DIGI_SETA: - if ((error = - verify_area(VERIFY_READ, (char*)arg,sizeof(digi_t)))) - return(error); - - copy_from_user(&ch->digiext, (char*)arg, sizeof(digi_t)); + if (copy_from_user(&ch->digiext, (char*)arg, + sizeof(digi_t))) + return -EFAULT; if (ch->digiext.digi_flags & DIGI_ALTPIN) { @@ -3310,10 +3301,8 @@ static int pc_ioctl(struct tty_struct *tty, struct file * file, memoff(ch); restore_flags(flags); - if ((error = verify_area(VERIFY_WRITE, (char*)arg,sizeof(dflow)))) - return(error); - - copy_to_user((char*)arg, &dflow, sizeof(dflow)); + if (copy_to_user((char*)arg, &dflow, sizeof(dflow))) + return -EFAULT; break; case DIGI_SETAFLOW: @@ -3329,10 +3318,8 @@ static int pc_ioctl(struct tty_struct *tty, struct file * file, stopc = ch->stopca; } - if ((error = verify_area(VERIFY_READ, (char*)arg,sizeof(dflow)))) - return(error); - - copy_from_user(&dflow, (char*)arg, sizeof(dflow)); + if (copy_from_user(&dflow, (char*)arg, sizeof(dflow))) + return -EFAULT; if (dflow.startc != startc || dflow.stopc != stopc) { /* Begin if setflow toggled */ diff --git a/drivers/char/istallion.c b/drivers/char/istallion.c index e50dd36f4ad7..eab51921c986 100644 --- a/drivers/char/istallion.c +++ b/drivers/char/istallion.c @@ -2022,7 +2022,8 @@ static int stli_setserial(stliport_t *portp, struct serial_struct *sp) printk("stli_setserial(portp=%x,sp=%x)\n", (int) portp, (int) sp); #endif - copy_from_user(&sio, sp, sizeof(struct serial_struct)); + if (copy_from_user(&sio, sp, sizeof(struct serial_struct))) + return -EFAULT; if (!capable(CAP_SYS_ADMIN)) { if ((sio.baud_base != portp->baud_base) || (sio.close_delay != portp->close_delay) || @@ -4878,11 +4879,15 @@ static ssize_t stli_memread(struct file *fp, char *buf, size_t count, loff_t *of while (size > 0) { memptr = (void *) EBRDGETMEMPTR(brdp, fp->f_pos); n = MIN(size, (brdp->pagesize - (((unsigned long) fp->f_pos) % brdp->pagesize))); - copy_to_user(buf, memptr, n); + if (copy_to_user(buf, memptr, n)) { + count = -EFAULT; + goto out; + } fp->f_pos += n; buf += n; size -= n; } +out: EBRDDISABLE(brdp); restore_flags(flags); @@ -4930,11 +4935,15 @@ static ssize_t stli_memwrite(struct file *fp, const char *buf, size_t count, lof while (size > 0) { memptr = (void *) EBRDGETMEMPTR(brdp, fp->f_pos); n = MIN(size, (brdp->pagesize - (((unsigned long) fp->f_pos) % brdp->pagesize))); - copy_from_user(memptr, chbuf, n); + if (copy_from_user(memptr, chbuf, n)) { + count = -EFAULT; + goto out; + } fp->f_pos += n; chbuf += n; size -= n; } +out: EBRDDISABLE(brdp); restore_flags(flags); diff --git a/drivers/char/machzwd.c b/drivers/char/machzwd.c index 85ba8321a564..4145913cf5fc 100644 --- a/drivers/char/machzwd.c +++ b/drivers/char/machzwd.c @@ -359,20 +359,15 @@ static ssize_t zf_read(struct file *file, char *buf, size_t count, static int zf_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { - int ret; - switch(cmd){ case WDIOC_GETSUPPORT: - ret = copy_to_user((struct watchdog_info *)arg, - &zf_info, sizeof(zf_info)); - if(ret) + if (copy_to_user((struct watchdog_info *)arg, + &zf_info, sizeof(zf_info))) return -EFAULT; break; case WDIOC_GETSTATUS: - ret = copy_to_user((int *)arg, &zf_is_open, - sizeof(int)); - if(ret) + if (copy_to_user((int *)arg, &zf_is_open, sizeof(int))) return -EFAULT; break; diff --git a/drivers/char/mxser.c b/drivers/char/mxser.c index f6e059693c6b..b6d3ea88ebac 100644 --- a/drivers/char/mxser.c +++ b/drivers/char/mxser.c @@ -2175,8 +2175,7 @@ static int mxser_get_serial_info(struct mxser_struct *info, tmp.closing_wait = info->closing_wait; tmp.custom_divisor = info->custom_divisor; tmp.hub6 = 0; - copy_to_user(retinfo, &tmp, sizeof(*retinfo)); - return (0); + return copy_to_user(retinfo, &tmp, sizeof(*retinfo)) ? -EFAULT : 0; } static int mxser_set_serial_info(struct mxser_struct *info, @@ -2188,7 +2187,8 @@ static int mxser_set_serial_info(struct mxser_struct *info, if (!new_info || !info->base) return (-EFAULT); - copy_from_user(&new_serial, new_info, sizeof(new_serial)); + if (copy_from_user(&new_serial, new_info, sizeof(new_serial))) + return -EFAULT; if ((new_serial.irq != info->irq) || (new_serial.port != info->base) || diff --git a/drivers/char/n_r3964.c b/drivers/char/n_r3964.c index 849b91296412..47effb41f46e 100644 --- a/drivers/char/n_r3964.c +++ b/drivers/char/n_r3964.c @@ -1364,7 +1364,7 @@ static ssize_t r3964_write(struct tty_struct * tty, struct file * file, pHeader->owner = pClient; } - copy_from_user (pHeader->data, data, count); /* We already verified this */ + __copy_from_user(pHeader->data, data, count); /* We already verified this */ if(pInfo->flags & R3964_DEBUG) { diff --git a/drivers/char/nwflash.c b/drivers/char/nwflash.c index 4022345238f1..a5055576aaf3 100644 --- a/drivers/char/nwflash.c +++ b/drivers/char/nwflash.c @@ -159,7 +159,8 @@ static ssize_t flash_read(struct file *file, char *buf, size_t size, loff_t * pp if (ret == 0) { ret = count; *ppos += count; - } + } else + ret = -EFAULT; up(&nwflash_sem); } return ret; diff --git a/drivers/char/raw.c b/drivers/char/raw.c index 7b0c47fc129a..a901f7b1bdbe 100644 --- a/drivers/char/raw.c +++ b/drivers/char/raw.c @@ -163,9 +163,10 @@ int raw_ctl_ioctl(struct inode *inode, /* First, find out which raw minor we want */ - err = copy_from_user(&rq, (void *) arg, sizeof(rq)); - if (err) + if (copy_from_user(&rq, (void *) arg, sizeof(rq))) { + err = -EFAULT; break; + } minor = rq.raw_minor; if (minor <= 0 || minor > MINORMASK) { @@ -222,6 +223,8 @@ int raw_ctl_ioctl(struct inode *inode, rq.block_major = rq.block_minor = 0; } err = copy_to_user((void *) arg, &rq, sizeof(rq)); + if (err) + err = -EFAULT; } break; diff --git a/drivers/char/stallion.c b/drivers/char/stallion.c index db06f5ad2b10..c19aa59a62b1 100644 --- a/drivers/char/stallion.c +++ b/drivers/char/stallion.c @@ -1553,7 +1553,8 @@ static int stl_setserial(stlport_t *portp, struct serial_struct *sp) printk("stl_setserial(portp=%x,sp=%x)\n", (int) portp, (int) sp); #endif - copy_from_user(&sio, sp, sizeof(struct serial_struct)); + if (copy_from_user(&sio, sp, sizeof(struct serial_struct))) + return -EFAULT; if (!capable(CAP_SYS_ADMIN)) { if ((sio.baud_base != portp->baud_base) || (sio.close_delay != portp->close_delay) || @@ -2949,7 +2950,8 @@ static int stl_getbrdstats(combrd_t *bp) stlpanel_t *panelp; int i; - copy_from_user(&stl_brdstats, bp, sizeof(combrd_t)); + if (copy_from_user(&stl_brdstats, bp, sizeof(combrd_t))) + return -EFAULT; if (stl_brdstats.brd >= STL_MAXBRDS) return(-ENODEV); brdp = stl_brds[stl_brdstats.brd]; @@ -2973,8 +2975,7 @@ static int stl_getbrdstats(combrd_t *bp) stl_brdstats.panels[i].nrports = panelp->nrports; } - copy_to_user(bp, &stl_brdstats, sizeof(combrd_t)); - return(0); + return copy_to_user(bp, &stl_brdstats, sizeof(combrd_t)) ? -EFAULT : 0; } /*****************************************************************************/ @@ -3017,7 +3018,8 @@ static int stl_getportstats(stlport_t *portp, comstats_t *cp) unsigned long flags; if (portp == (stlport_t *) NULL) { - copy_from_user(&stl_comstats, cp, sizeof(comstats_t)); + if (copy_from_user(&stl_comstats, cp, sizeof(comstats_t))) + return -EFAULT; portp = stl_getport(stl_comstats.brd, stl_comstats.panel, stl_comstats.port); if (portp == (stlport_t *) NULL) @@ -3058,8 +3060,8 @@ static int stl_getportstats(stlport_t *portp, comstats_t *cp) portp->stats.signals = (unsigned long) stl_getsignals(portp); - copy_to_user(cp, &portp->stats, sizeof(comstats_t)); - return(0); + return copy_to_user(cp, &portp->stats, + sizeof(comstats_t)) ? -EFAULT : 0; } /*****************************************************************************/ @@ -3071,7 +3073,8 @@ static int stl_getportstats(stlport_t *portp, comstats_t *cp) static int stl_clrportstats(stlport_t *portp, comstats_t *cp) { if (portp == (stlport_t *) NULL) { - copy_from_user(&stl_comstats, cp, sizeof(comstats_t)); + if (copy_from_user(&stl_comstats, cp, sizeof(comstats_t))) + return -EFAULT; portp = stl_getport(stl_comstats.brd, stl_comstats.panel, stl_comstats.port); if (portp == (stlport_t *) NULL) @@ -3082,8 +3085,8 @@ static int stl_clrportstats(stlport_t *portp, comstats_t *cp) portp->stats.brd = portp->brdnr; portp->stats.panel = portp->panelnr; portp->stats.port = portp->portnr; - copy_to_user(cp, &portp->stats, sizeof(comstats_t)); - return(0); + return copy_to_user(cp, &portp->stats, + sizeof(comstats_t)) ? -EFAULT : 0; } /*****************************************************************************/ @@ -3096,13 +3099,14 @@ static int stl_getportstruct(unsigned long arg) { stlport_t *portp; - copy_from_user(&stl_dummyport, (void *) arg, sizeof(stlport_t)); + if (copy_from_user(&stl_dummyport, (void *) arg, sizeof(stlport_t))) + return -EFAULT; portp = stl_getport(stl_dummyport.brdnr, stl_dummyport.panelnr, stl_dummyport.portnr); if (portp == (stlport_t *) NULL) return(-ENODEV); - copy_to_user((void *) arg, portp, sizeof(stlport_t)); - return(0); + return copy_to_user((void *)arg, portp, + sizeof(stlport_t)) ? -EFAULT : 0; } /*****************************************************************************/ @@ -3115,14 +3119,14 @@ static int stl_getbrdstruct(unsigned long arg) { stlbrd_t *brdp; - copy_from_user(&stl_dummybrd, (void *) arg, sizeof(stlbrd_t)); + if (copy_from_user(&stl_dummybrd, (void *) arg, sizeof(stlbrd_t))) + return -EFAULT; if ((stl_dummybrd.brdnr < 0) || (stl_dummybrd.brdnr >= STL_MAXBRDS)) return(-ENODEV); brdp = stl_brds[stl_dummybrd.brdnr]; if (brdp == (stlbrd_t *) NULL) return(-ENODEV); - copy_to_user((void *) arg, brdp, sizeof(stlbrd_t)); - return(0); + return copy_to_user((void *)arg, brdp, sizeof(stlbrd_t)) ? -EFAULT : 0; } /*****************************************************************************/ diff --git a/drivers/char/sx.c b/drivers/char/sx.c index 947f76a60898..694b0e1e9283 100644 --- a/drivers/char/sx.c +++ b/drivers/char/sx.c @@ -1720,8 +1720,11 @@ static int sx_fw_ioctl (struct inode *inode, struct file *filp, Get_user (data, descr++); while (nbytes && data) { for (i=0;i<nbytes;i += SX_CHUNK_SIZE) { - copy_from_user (tmp, (char *)data+i, - (i+SX_CHUNK_SIZE>nbytes)?nbytes-i:SX_CHUNK_SIZE); + if (copy_from_user(tmp, (char *)data + i, + (i + SX_CHUNK_SIZE > + nbytes) ? nbytes - i : + SX_CHUNK_SIZE)) + return -EFAULT; memcpy_toio ((char *) (board->base2 + offset + i), tmp, (i+SX_CHUNK_SIZE>nbytes)?nbytes-i:SX_CHUNK_SIZE); } diff --git a/drivers/char/tpqic02.c b/drivers/char/tpqic02.c index 24b490623b14..b2c1ce6a2487 100644 --- a/drivers/char/tpqic02.c +++ b/drivers/char/tpqic02.c @@ -1944,12 +1944,8 @@ static ssize_t qic02_tape_read(struct file *filp, char *buf, size_t count, } /* copy buffer to user-space in one go */ if (bytes_done > 0) { - err = - copy_to_user(buf, buffaddr, - bytes_done); - if (err) { + if (copy_to_user(buf, buffaddr, bytes_done)) return -EFAULT; - } } #if 1 /* Checks Ton's patch below */ @@ -2085,10 +2081,8 @@ static ssize_t qic02_tape_write(struct file *filp, const char *buf, /* copy from user to DMA buffer and initiate transfer. */ if (bytes_todo > 0) { - err = copy_from_user(buffaddr, buf, bytes_todo); - if (err) { + if (copy_from_user(buffaddr, buf, bytes_todo)) return -EFAULT; - } /****************** similar problem with read() at FM could happen here at EOT. ******************/ |
