|
|
| version 1.5, 2003/07/22 17:03:33 | version 1.6, 2004/02/09 21:51:28 |
|---|---|
| Line 16 | Line 16 |
| * 4. Modifications may be freely made to this file if the above conditions | * 4. Modifications may be freely made to this file if the above conditions |
| * are met. | * are met. |
| * | * |
| * $FreeBSD: src/sys/kern/kern_physio.c,v 1.46.2.3 2003/05/29 06:15:35 alc Exp $ | * $FreeBSD: src/sys/kern/kern_physio.c,v 1.46.2.4 2003/11/14 09:51:47 simokawa Exp $ |
| * $DragonFly$ | * $DragonFly$ |
| */ | */ |
| Line 43 physio(dev_t dev, struct uio *uio, int i | Line 43 physio(dev_t dev, struct uio *uio, int i |
| int i; | int i; |
| int error; | int error; |
| int spl; | int spl; |
| int chk_blockno; | |
| caddr_t sa; | caddr_t sa; |
| off_t blockno; | off_t blockno; |
| u_int iolen; | u_int iolen; |
| Line 65 physio(dev_t dev, struct uio *uio, int i | Line 66 physio(dev_t dev, struct uio *uio, int i |
| dev->si_iosize_max = DFLTPHYS; | dev->si_iosize_max = DFLTPHYS; |
| } | } |
| /* Don't check block number overflow for D_MEM */ | |
| if ((devsw(dev)->d_flags & D_TYPEMASK) == D_MEM) | |
| chk_blockno = 0; | |
| else | |
| chk_blockno = 1; | |
| for (i = 0; i < uio->uio_iovcnt; i++) { | for (i = 0; i < uio->uio_iovcnt; i++) { |
| while (uio->uio_iov[i].iov_len) { | while (uio->uio_iov[i].iov_len) { |
| if (uio->uio_rw == UIO_READ) | if (uio->uio_rw == UIO_READ) |
| Line 97 physio(dev_t dev, struct uio *uio, int i | Line 104 physio(dev_t dev, struct uio *uio, int i |
| bp->b_bufsize = bp->b_bcount; | bp->b_bufsize = bp->b_bcount; |
| blockno = bp->b_offset >> DEV_BSHIFT; | blockno = bp->b_offset >> DEV_BSHIFT; |
| if ((daddr_t)blockno != blockno) { | if (chk_blockno && (daddr_t)blockno != blockno) { |
| error = EINVAL; /* blockno overflow */ | error = EINVAL; /* blockno overflow */ |
| goto doerror; | goto doerror; |
| } | } |