struct buf *bp;
struct uio *uio;
int error;
- int offset;
- int n;
+ off_t loffset;
+ size_t offset;
+ size_t n;
vp = ap->a_vp;
ip = vp->v_data;
/*
* Check for illegal write offsets. Valid range is 0...2^63-1
*/
- if (uio->uio_offset < 0 || uio->uio_offset + uio->uio_resid <= 0)
+ loffset = uio->uio_offset;
+ if (loffset < 0)
return (EFBIG);
+ if (uio->uio_resid) {
+ /* GCC4 - workaround optimization */
+ loffset += uio->uio_resid;
+ if (loffset <= 0)
+ return (EFBIG);
+ }
kprintf("userfs_write\n");
error = 0;
*
* XXX No need to read if strictly appending.
*/
- offset = (int)uio->uio_offset & USERFS_BMASK;
+ offset = (size_t)uio->uio_offset & USERFS_BMASK;
/* if offset == ip->filesize use getblk instead */
error = bread(vp, uio->uio_offset - offset, USERFS_BSIZE, &bp);
if (error) {
if (n > uio->uio_resid)
n = uio->uio_resid;
if (n > ip->filesize - uio->uio_offset)
- n = (int)(ip->filesize - uio->uio_offset);
+ n = (size_t)(ip->filesize - uio->uio_offset);
error = uiomove((char *)bp->b_data + offset, n, uio);
if (error) {