svn commit: r328731 - head/sys/compat/linuxkpi/common/src

Hans Petter Selasky hselasky at FreeBSD.org
Thu Feb 1 19:57:22 UTC 2018


Author: hselasky
Date: Thu Feb  1 19:57:21 2018
New Revision: 328731
URL: https://svnweb.freebsd.org/changeset/base/328731

Log:
  Fix some recent regressions after r328436 in the LinuxKPI:
  
  1) The OPW() function macro should have the same return type like the
  function it executes.
  2) The DEVFS I/O-limit should be enforced for all character device reads
  and writes.
  3) The character device file handle should be passable, same as for
  DEVFS based file handles.
  
  Reported by:	jbeich @
  MFC after:	1 week
  Sponsored by:	Mellanox Technologies

Modified:
  head/sys/compat/linuxkpi/common/src/linux_compat.c

Modified: head/sys/compat/linuxkpi/common/src/linux_compat.c
==============================================================================
--- head/sys/compat/linuxkpi/common/src/linux_compat.c	Thu Feb  1 19:48:05 2018	(r328730)
+++ head/sys/compat/linuxkpi/common/src/linux_compat.c	Thu Feb  1 19:57:21 2018	(r328731)
@@ -669,7 +669,7 @@ static struct cdev_pager_ops linux_cdev_pager_ops[2] =
 
 #define	OPW(fp,td,code) ({			\
 	struct file *__fpop;			\
-	int __retval;				\
+	__typeof(code) __retval;		\
 						\
 	__fpop = (td)->td_fpop;			\
 	(td)->td_fpop = (fp);			\
@@ -1277,6 +1277,8 @@ linux_file_read(struct file *file, struct uio *uio, st
 	/* XXX no support for I/O vectors currently */
 	if (uio->uio_iovcnt != 1)
 		return (EOPNOTSUPP);
+	if (uio->uio_resid > DEVFS_IOSIZE_MAX)
+		return (EINVAL);
 	linux_set_current(td);
 	if (filp->f_op->read) {
 		bytes = OPW(file, td, filp->f_op->read(filp, uio->uio_iov->iov_base,
@@ -1314,6 +1316,8 @@ linux_file_write(struct file *file, struct uio *uio, s
 	/* XXX no support for I/O vectors currently */
 	if (uio->uio_iovcnt != 1)
 		return (EOPNOTSUPP);
+	if (uio->uio_resid > DEVFS_IOSIZE_MAX)
+		return (EINVAL);
 	linux_set_current(td);
 	if (filp->f_op->write) {
 		bytes = OPW(file, td, filp->f_op->write(filp, uio->uio_iov->iov_base,
@@ -1556,6 +1560,7 @@ struct fileops linuxfileops = {
 	.fo_chmod = invfo_chmod,
 	.fo_chown = invfo_chown,
 	.fo_sendfile = invfo_sendfile,
+	.fo_flags = DFLAG_PASSABLE,
 };
 
 /*


More information about the svn-src-head mailing list