Discussion:
msdosfs uiomove() conversion
Martin Natano
2016-01-21 16:02:33 UTC
Permalink
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 -0000 1.105
+++ msdosfs/msdosfs_vnops.c 21 Jan 2016 15:52:04 -0000
@@ -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
Stefan Kempf
2016-01-23 18:08:40 UTC
Permalink
Post by Martin Natano
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.
Post by Martin Natano
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 -0000 1.105
+++ msdosfs/msdosfs_vnops.c 21 Jan 2016 15:52:04 -0000
@@ -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
Loading...