Index: kern/vfs_extattr.c =================================================================== --- kern/vfs_extattr.c +++ kern/vfs_extattr.c @@ -227,6 +227,9 @@ cap_rights_t rights; int error; + if (uap->nbytes > IOSIZE_MAX) + return (EINVAL); + AUDIT_ARG_FD(uap->fd); AUDIT_ARG_VALUE(uap->attrnamespace); error = copyinstr(uap->attrname, attrname, EXTATTR_MAXNAMELEN, NULL); @@ -269,6 +272,9 @@ char *data; int error; + if (uap->nbytes > IOSIZE_MAX) + return (EINVAL); + AUDIT_ARG_VALUE(uap->attrnamespace); error = copyinstr(uap->attrname, attrname, EXTATTR_MAXNAMELEN, NULL); if (error) @@ -312,6 +318,9 @@ char *data; int error; + if (uap->nbytes > IOSIZE_MAX) + return (EINVAL); + AUDIT_ARG_VALUE(uap->attrnamespace); error = copyinstr(uap->attrname, attrname, EXTATTR_MAXNAMELEN, NULL); if (error) @@ -432,6 +441,9 @@ data = NULL; + if (uap->nbytes > IOSIZE_MAX) + return (EINVAL); + AUDIT_ARG_FD(uap->fd); AUDIT_ARG_VALUE(uap->attrnamespace); error = copyinstr(uap->attrname, attrname, EXTATTR_MAXNAMELEN, NULL); @@ -476,6 +488,9 @@ data = NULL; + if (uap->nbytes > IOSIZE_MAX) + return (EINVAL); + AUDIT_ARG_VALUE(uap->attrnamespace); error = copyinstr(uap->attrname, attrname, EXTATTR_MAXNAMELEN, NULL); if (error) @@ -520,6 +535,9 @@ data = NULL; + if (uap->nbytes > IOSIZE_MAX) + return (EINVAL); + AUDIT_ARG_VALUE(uap->attrnamespace); error = copyinstr(uap->attrname, attrname, EXTATTR_MAXNAMELEN, NULL); if (error) @@ -770,6 +788,9 @@ data = NULL; + if (uap->nbytes > IOSIZE_MAX) + return (EINVAL); + AUDIT_ARG_FD(uap->fd); AUDIT_ARG_VALUE(uap->attrnamespace); error = getvnode(td, uap->fd, @@ -807,6 +828,9 @@ data = NULL; + if (uap->nbytes > IOSIZE_MAX) + return (EINVAL); + AUDIT_ARG_VALUE(uap->attrnamespace); NDINIT(&nd, LOOKUP, FOLLOW | AUDITVNODE1, UIO_USERSPACE, uap->path, td); error = namei(&nd); @@ -844,6 +868,9 @@ data = NULL; + if (uap->nbytes > IOSIZE_MAX) + return (EINVAL); + AUDIT_ARG_VALUE(uap->attrnamespace); NDINIT(&nd, LOOKUP, NOFOLLOW | AUDITVNODE1, UIO_USERSPACE, uap->path, td);