Move buffer size checks outside of the vnode locks.

Reviewed by:    kib, cem, pfg (mentor)
Approved by:    pfg (mentor)
MFC after:      1 weeks

Differential Revision:    https://reviews.freebsd.org/D13405
This commit is contained in:
Fedor Uporov 2017-12-12 20:15:57 +00:00
parent 1806c9ab85
commit 61b214f338
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=326808

View File

@ -167,6 +167,9 @@ extattr_set_vp(struct vnode *vp, int attrnamespace, const char *attrname,
ssize_t cnt;
int error;
if (nbytes > IOSIZE_MAX)
return (EINVAL);
error = vn_start_write(vp, &mp, V_WAIT | PCATCH);
if (error)
return (error);
@ -177,10 +180,6 @@ extattr_set_vp(struct vnode *vp, int attrnamespace, const char *attrname,
auio.uio_iov = &aiov;
auio.uio_iovcnt = 1;
auio.uio_offset = 0;
if (nbytes > IOSIZE_MAX) {
error = EINVAL;
goto done;
}
auio.uio_resid = nbytes;
auio.uio_rw = UIO_WRITE;
auio.uio_segflg = UIO_USERSPACE;
@ -330,6 +329,9 @@ extattr_get_vp(struct vnode *vp, int attrnamespace, const char *attrname,
size_t size, *sizep;
int error;
if (nbytes > IOSIZE_MAX)
return (EINVAL);
vn_lock(vp, LK_SHARED | LK_RETRY);
/*
@ -346,10 +348,6 @@ extattr_get_vp(struct vnode *vp, int attrnamespace, const char *attrname,
auio.uio_iov = &aiov;
auio.uio_iovcnt = 1;
auio.uio_offset = 0;
if (nbytes > IOSIZE_MAX) {
error = EINVAL;
goto done;
}
auio.uio_resid = nbytes;
auio.uio_rw = UIO_READ;
auio.uio_segflg = UIO_USERSPACE;
@ -638,6 +636,9 @@ extattr_list_vp(struct vnode *vp, int attrnamespace, void *data,
ssize_t cnt;
int error;
if (nbytes > IOSIZE_MAX)
return (EINVAL);
vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
auiop = NULL;
@ -649,10 +650,6 @@ extattr_list_vp(struct vnode *vp, int attrnamespace, void *data,
auio.uio_iov = &aiov;
auio.uio_iovcnt = 1;
auio.uio_offset = 0;
if (nbytes > IOSIZE_MAX) {
error = EINVAL;
goto done;
}
auio.uio_resid = nbytes;
auio.uio_rw = UIO_READ;
auio.uio_segflg = UIO_USERSPACE;