> Date: Mon, 18 Jan 2016 19:12:01 +0100
> From: Stefan Kempf <[email protected]>
>
> Martin Natano wrote:
> > Below the conversion to uiomove() for kern/spec_vnops.c. This diff
> > prevents truncation of uio_resid when passed to min().
>
> Looks good. Basically the same reasoning as with the cd9660 diff.
>
> ok?
ok kettenis@
> > Index: kern/spec_vnops.c
> > ===================================================================
> > RCS file: /cvs/src/sys/kern/spec_vnops.c,v
> > retrieving revision 1.84
> > diff -u -p -u -r1.84 spec_vnops.c
> > --- kern/spec_vnops.c 5 Dec 2015 10:11:53 -0000 1.84
> > +++ kern/spec_vnops.c 13 Jan 2016 19:12:40 -0000
> > @@ -202,7 +202,8 @@ spec_read(void *v)
> > daddr_t bn, nextbn, bscale;
> > int bsize;
> > struct partinfo dpart;
> > - int n, on, majordev;
> > + size_t n;
> > + int on, majordev;
> > int (*ioctl)(dev_t, u_long, caddr_t, int, struct proc *);
> > int error = 0;
> >
> > @@ -243,7 +244,7 @@ spec_read(void *v)
> > do {
> > bn = btodb(uio->uio_offset) & ~(bscale - 1);
> > on = uio->uio_offset % bsize;
> > - n = min((bsize - on), uio->uio_resid);
> > + n = ulmin((bsize - on), uio->uio_resid);
> > if (vp->v_lastr + bscale == bn) {
> > nextbn = bn + bscale;
> > error = breadn(vp, bn, bsize, &nextbn, &bsize,
> > @@ -251,12 +252,12 @@ spec_read(void *v)
> > } else
> > error = bread(vp, bn, bsize, &bp);
> > vp->v_lastr = bn;
> > - n = min(n, bsize - bp->b_resid);
> > + n = ulmin(n, bsize - bp->b_resid);
> > if (error) {
> > brelse(bp);
> > return (error);
> > }
> > - error = uiomovei((char *)bp->b_data + on, n, uio);
> > + error = uiomove((char *)bp->b_data + on, n, uio);
> > brelse(bp);
> > } while (error == 0 && uio->uio_resid > 0 && n != 0);
> > return (error);
> > @@ -290,7 +291,8 @@ spec_write(void *v)
> > daddr_t bn, bscale;
> > int bsize;
> > struct partinfo dpart;
> > - int n, on, majordev;
> > + size_t n;
> > + int on, majordev;
> > int (*ioctl)(dev_t, u_long, caddr_t, int, struct proc *);
> > int error = 0;
> >
> > @@ -331,14 +333,14 @@ spec_write(void *v)
> > do {
> > bn = btodb(uio->uio_offset) & ~(bscale - 1);
> > on = uio->uio_offset % bsize;
> > - n = min((bsize - on), uio->uio_resid);
> > + n = ulmin((bsize - on), uio->uio_resid);
> > error = bread(vp, bn, bsize, &bp);
> > - n = min(n, bsize - bp->b_resid);
> > + n = ulmin(n, bsize - bp->b_resid);
> > if (error) {
> > brelse(bp);
> > return (error);
> > }
> > - error = uiomovei((char *)bp->b_data + on, n, uio);
> > + error = uiomove((char *)bp->b_data + on, n, uio);
> > if (n + on == bsize)
> > bawrite(bp);
> > else
> >
> > cheers,
> > natano
> >
>
>