svn commit: r326808 - head/sys/kern

Fedor Uporov fsu at FreeBSD.org
Tue Dec 12 20:15:59 UTC 2017


Author: fsu
Date: Tue Dec 12 20:15:57 2017
New Revision: 326808
URL: https://svnweb.freebsd.org/changeset/base/326808

Log:
  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

Modified:
  head/sys/kern/vfs_extattr.c

Modified: head/sys/kern/vfs_extattr.c
==============================================================================
--- head/sys/kern/vfs_extattr.c	Tue Dec 12 20:02:48 2017	(r326807)
+++ head/sys/kern/vfs_extattr.c	Tue Dec 12 20:15:57 2017	(r326808)
@@ -167,6 +167,9 @@ extattr_set_vp(struct vnode *vp, int attrnamespace, co
 	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, co
 	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, co
 	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, co
 		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, v
 	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, v
 		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;


More information about the svn-src-head mailing list