Re: msdosfs uiomove() conversion

2016-01-23 Thread Stefan Kempf
Martin Natano wrote:
> Below the uiomove() conversion for msdosfs. This diff prevents
> truncation of uio_resid in both msdosfs_read() and msdosfs_write().

Yes. That's similar to the cd9660 diff.
 
> Index: msdosfs/msdosfs_vnops.c
> ===
> RCS file: /cvs/src/sys/msdosfs/msdosfs_vnops.c,v
> retrieving revision 1.105
> diff -u -p -u -r1.105 msdosfs_vnops.c
> --- msdosfs/msdosfs_vnops.c   13 Jan 2016 10:00:55 -  1.105
> +++ msdosfs/msdosfs_vnops.c   21 Jan 2016 15:52:04 -
> @@ -516,10 +516,9 @@ msdosfs_read(void *v)
>   struct msdosfsmount *pmp = dep->de_pmp;
>   struct uio *uio = ap->a_uio;
>   int isadir, error = 0;
> - uint32_t n, diff, size;
> + uint32_t n, diff, size, on;
>   struct buf *bp;
>   daddr_t cn;
> - long on;
>  
>   /*
>* If they didn't ask for any data, then we are done.
> @@ -537,7 +536,7 @@ msdosfs_read(void *v)
>   cn = de_cluster(pmp, uio->uio_offset);
>   size = pmp->pm_bpcluster;
>   on = uio->uio_offset & pmp->pm_crbomask;
> - n = min((uint32_t) (pmp->pm_bpcluster - on), uio->uio_resid);
> + n = ulmin(pmp->pm_bpcluster - on, uio->uio_resid);
>  
>   /*
>* de_FileSize is uint32_t, and we know that uio_offset <
> @@ -569,7 +568,7 @@ msdosfs_read(void *v)
>   brelse(bp);
>   return (error);
>   }
> - error = uiomovei(bp->b_data + on, (int) n, uio);
> + error = uiomove(bp->b_data + on, n, uio);
>   brelse(bp);
>   } while (error == 0 && uio->uio_resid > 0 && n != 0);
>   if (!isadir && !(vp->v_mount->mnt_flag & MNT_NOATIME))
> @@ -584,9 +583,8 @@ int
>  msdosfs_write(void *v)
>  {
>   struct vop_write_args *ap = v;
> - int n;
> - int croffset;
> - int resid;
> + uint32_t n, croffset;
> + size_t resid;
>   ssize_t overrun;
>   int extended = 0;
>   uint32_t osize;
> @@ -715,7 +713,7 @@ msdosfs_write(void *v)
>   }
>   }
>  
> - n = min(uio->uio_resid, pmp->pm_bpcluster - croffset);
> + n = ulmin(uio->uio_resid, pmp->pm_bpcluster - croffset);
>   if (uio->uio_offset + n > dep->de_FileSize) {
>   dep->de_FileSize = uio->uio_offset + n;
>   uvm_vnp_setsize(vp, dep->de_FileSize);
> @@ -729,7 +727,7 @@ msdosfs_write(void *v)
>   /*
>* Copy the data from user space into the buf header.
>*/
> - error = uiomovei(bp->b_data + croffset, n, uio);
> + error = uiomove(bp->b_data + croffset, n, uio);
>  
>   /*
>* If they want this synchronous then write it and wait for
> @@ -1554,7 +1552,7 @@ msdosfs_readdir(void *v)
>   sizeof(struct direntry);
>   if (uio->uio_resid < dirbuf.d_reclen)
>   goto out;
> - error = uiomovei(&dirbuf, dirbuf.d_reclen, uio);
> + error = uiomove(&dirbuf, dirbuf.d_reclen, uio);
>   if (error)
>   goto out;
>   offset = dirbuf.d_off;
> @@ -1682,7 +1680,7 @@ msdosfs_readdir(void *v)
>   goto out;
>   }
>   wlast = -1;
> - error = uiomovei(&dirbuf, dirbuf.d_reclen, uio);
> + error = uiomove(&dirbuf, dirbuf.d_reclen, uio);
>   if (error) {
>   brelse(bp);
>   goto out;
> 
> cheers,
> natano
> 



msdosfs uiomove() conversion

2016-01-21 Thread Martin Natano
Below the uiomove() conversion for msdosfs. This diff prevents
truncation of uio_resid in both msdosfs_read() and msdosfs_write().

Index: msdosfs/msdosfs_vnops.c
===
RCS file: /cvs/src/sys/msdosfs/msdosfs_vnops.c,v
retrieving revision 1.105
diff -u -p -u -r1.105 msdosfs_vnops.c
--- msdosfs/msdosfs_vnops.c 13 Jan 2016 10:00:55 -  1.105
+++ msdosfs/msdosfs_vnops.c 21 Jan 2016 15:52:04 -
@@ -516,10 +516,9 @@ msdosfs_read(void *v)
struct msdosfsmount *pmp = dep->de_pmp;
struct uio *uio = ap->a_uio;
int isadir, error = 0;
-   uint32_t n, diff, size;
+   uint32_t n, diff, size, on;
struct buf *bp;
daddr_t cn;
-   long on;
 
/*
 * If they didn't ask for any data, then we are done.
@@ -537,7 +536,7 @@ msdosfs_read(void *v)
cn = de_cluster(pmp, uio->uio_offset);
size = pmp->pm_bpcluster;
on = uio->uio_offset & pmp->pm_crbomask;
-   n = min((uint32_t) (pmp->pm_bpcluster - on), uio->uio_resid);
+   n = ulmin(pmp->pm_bpcluster - on, uio->uio_resid);
 
/*
 * de_FileSize is uint32_t, and we know that uio_offset <
@@ -569,7 +568,7 @@ msdosfs_read(void *v)
brelse(bp);
return (error);
}
-   error = uiomovei(bp->b_data + on, (int) n, uio);
+   error = uiomove(bp->b_data + on, n, uio);
brelse(bp);
} while (error == 0 && uio->uio_resid > 0 && n != 0);
if (!isadir && !(vp->v_mount->mnt_flag & MNT_NOATIME))
@@ -584,9 +583,8 @@ int
 msdosfs_write(void *v)
 {
struct vop_write_args *ap = v;
-   int n;
-   int croffset;
-   int resid;
+   uint32_t n, croffset;
+   size_t resid;
ssize_t overrun;
int extended = 0;
uint32_t osize;
@@ -715,7 +713,7 @@ msdosfs_write(void *v)
}
}
 
-   n = min(uio->uio_resid, pmp->pm_bpcluster - croffset);
+   n = ulmin(uio->uio_resid, pmp->pm_bpcluster - croffset);
if (uio->uio_offset + n > dep->de_FileSize) {
dep->de_FileSize = uio->uio_offset + n;
uvm_vnp_setsize(vp, dep->de_FileSize);
@@ -729,7 +727,7 @@ msdosfs_write(void *v)
/*
 * Copy the data from user space into the buf header.
 */
-   error = uiomovei(bp->b_data + croffset, n, uio);
+   error = uiomove(bp->b_data + croffset, n, uio);
 
/*
 * If they want this synchronous then write it and wait for
@@ -1554,7 +1552,7 @@ msdosfs_readdir(void *v)
sizeof(struct direntry);
if (uio->uio_resid < dirbuf.d_reclen)
goto out;
-   error = uiomovei(&dirbuf, dirbuf.d_reclen, uio);
+   error = uiomove(&dirbuf, dirbuf.d_reclen, uio);
if (error)
goto out;
offset = dirbuf.d_off;
@@ -1682,7 +1680,7 @@ msdosfs_readdir(void *v)
goto out;
}
wlast = -1;
-   error = uiomovei(&dirbuf, dirbuf.d_reclen, uio);
+   error = uiomove(&dirbuf, dirbuf.d_reclen, uio);
if (error) {
brelse(bp);
goto out;

cheers,
natano