Martin Natano wrote: > Below the conversion to uiomove() for isofs/udf/. Note that converting > size to size_t is not possible in udf_read(), as udf_readatoffset() > requires a pointer to an integer variable. Changing that would cause a > lot of code churn, so i chose to truncate uio_resid to INT_MAX instead. > udf_readatoffset() wouldn't transfer more than MAXBSIZE bytes anyway.
Looks good. If we have to trust udf_readatoffset already that it does reasonable things with size, then passing MAXBSIZE to the ulmin would also be an option. But I'm fine with the diff as-is also. > Index: udf_vnops.c > =================================================================== > RCS file: /cvs/src/sys/isofs/udf/udf_vnops.c,v > retrieving revision 1.61 > diff -u -p -u -r1.61 udf_vnops.c > --- udf_vnops.c 23 Sep 2015 15:37:26 -0000 1.61 > +++ udf_vnops.c 20 Jan 2016 08:54:21 -0000 > @@ -445,13 +445,12 @@ udf_read(void *v) > > while (uio->uio_offset < fsize && uio->uio_resid > 0) { > offset = uio->uio_offset; > - if (uio->uio_resid + offset <= fsize) > - size = uio->uio_resid; > - else > + size = ulmin(uio->uio_resid, INT_MAX); > + if (size > fsize - offset) > size = fsize - offset; > error = udf_readatoffset(up, &size, offset, &bp, &data); > if (error == 0) > - error = uiomovei(data, size, uio); > + error = uiomove(data, (size_t)size, uio); > if (bp != NULL) { > brelse(bp); > bp = NULL; > @@ -543,7 +542,7 @@ struct udf_uiodir { > static int > udf_uiodir(struct udf_uiodir *uiodir, struct uio *uio, long off) > { > - int de_size = DIRENT_SIZE(uiodir->dirent); > + size_t de_size = DIRENT_SIZE(uiodir->dirent); > > if (uio->uio_resid < de_size) { > uiodir->eofflag = 0; > @@ -552,7 +551,7 @@ udf_uiodir(struct udf_uiodir *uiodir, st > uiodir->dirent->d_off = off; > uiodir->dirent->d_reclen = de_size; > > - return (uiomovei(uiodir->dirent, de_size, uio)); > + return (uiomove(uiodir->dirent, de_size, uio)); > } > > static struct udf_dirstream * > > cheers, > natano >