All of lore.kernel.org
 help / color / mirror / Atom feed
From: Kees Cook <keescook@chromium.org>
To: David Laight <David.Laight@ACULAB.COM>
Cc: "linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	Sargun Dhillon <sargun@sargun.me>,
	Christian Brauner <christian@brauner.io>,
	"David S. Miller" <davem@davemloft.net>,
	Christoph Hellwig <hch@lst.de>, Tycho Andersen <tycho@tycho.ws>,
	Jakub Kicinski <kuba@kernel.org>,
	Alexander Viro <viro@zeniv.linux.org.uk>,
	Aleksa Sarai <cyphar@cyphar.com>,
	Matt Denton <mpdenton@google.com>, Jann Horn <jannh@google.com>,
	Chris Palmer <palmer@google.com>,
	Robert Sesek <rsesek@google.com>,
	Giuseppe Scrivano <gscrivan@redhat.com>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Andy Lutomirski <luto@amacapital.net>,
	Will Drewry <wad@chromium.org>, Shuah Khan <shuah@kernel.org>,
	"netdev@vger.kernel.org" <netdev@vger.kernel.org>,
	"containers@lists.linux-foundation.org" 
	<containers@lists.linux-foundation.org>,
	"linux-api@vger.kernel.org" <linux-api@vger.kernel.org>,
	"linux-fsdevel@vger.kernel.org" <linux-fsdevel@vger.kernel.org>,
	"linux-kselftest@vger.kernel.org"
	<linux-kselftest@vger.kernel.org>
Subject: Re: [PATCH v4 03/11] fs: Add fd_install_received() wrapper for __fd_install_received()
Date: Wed, 17 Jun 2020 12:58:00 -0700	[thread overview]
Message-ID: <202006171141.4DA1174979@keescook> (raw)
In-Reply-To: <6de12195ec3244b99e6026b4b46e5be2@AcuMS.aculab.com>

On Wed, Jun 17, 2020 at 03:35:20PM +0000, David Laight wrote:
> From: Kees Cook
> > Sent: 16 June 2020 04:25
> > 
> > For both pidfd and seccomp, the __user pointer is not used. Update
> > __fd_install_received() to make writing to ufd optional. (ufd
> > itself cannot checked for NULL because this changes the SCM_RIGHTS
> > interface behavior.) In these cases, the new fd needs to be returned
> > on success.  Update the existing callers to handle it. Add new wrapper
> > fd_install_received() for pidfd and seccomp that does not use the ufd
> > argument.
> ...> 
> >  static inline int fd_install_received_user(struct file *file, int __user *ufd,
> >  					   unsigned int o_flags)
> >  {
> > -	return __fd_install_received(file, ufd, o_flags);
> > +	return __fd_install_received(file, true, ufd, o_flags);
> > +}
> 
> Can you get rid of the 'return user' parameter by adding
> 	if (!ufd) return -EFAULT;
> to the above wrapper, then checking for NULL in the function?
> 
> Or does that do the wrong horrid things in the fail path?

Oh, hm. No, that shouldn't break the failure path, since everything gets
unwound in __fd_install_received if the ufd write fails.

Effectively this (I'll chop it up into the correct patches):

diff --git a/fs/file.c b/fs/file.c
index b583e7c60571..3b80324a31cc 100644
--- a/fs/file.c
+++ b/fs/file.c
@@ -939,18 +939,16 @@ int replace_fd(unsigned fd, struct file *file, unsigned flags)
  *
  * @fd: fd to install into (if negative, a new fd will be allocated)
  * @file: struct file that was received from another process
- * @ufd_required: true to use @ufd for writing fd number to userspace
  * @ufd: __user pointer to write new fd number to
  * @o_flags: the O_* flags to apply to the new fd entry
  *
  * Installs a received file into the file descriptor table, with appropriate
  * checks and count updates. Optionally writes the fd number to userspace, if
- * @ufd_required is true (@ufd cannot just be tested for NULL because NULL may
- * actually get passed into SCM_RIGHTS).
+ * @ufd is non-NULL.
  *
  * Returns newly install fd or -ve on error.
  */
-int __fd_install_received(int fd, struct file *file, bool ufd_required,
+int __fd_install_received(int fd, struct file *file,
 			  int __user *ufd, unsigned int o_flags)
 {
 	struct socket *sock;
@@ -967,7 +965,7 @@ int __fd_install_received(int fd, struct file *file, bool ufd_required,
 			return new_fd;
 	}
 
-	if (ufd_required) {
+	if (ufd) {
 		error = put_user(new_fd, ufd);
 		if (error) {
 			put_unused_fd(new_fd);
diff --git a/include/linux/file.h b/include/linux/file.h
index f1d16e24a12e..2ade0d90bc5e 100644
--- a/include/linux/file.h
+++ b/include/linux/file.h
@@ -91,20 +91,22 @@ extern void put_unused_fd(unsigned int fd);
 
 extern void fd_install(unsigned int fd, struct file *file);
 
-extern int __fd_install_received(int fd, struct file *file, bool ufd_required,
+extern int __fd_install_received(int fd, struct file *file,
 				 int __user *ufd, unsigned int o_flags);
 static inline int fd_install_received_user(struct file *file, int __user *ufd,
 					   unsigned int o_flags)
 {
-	return __fd_install_received(-1, file, true, ufd, o_flags);
+	if (ufd == NULL)
+		return -EFAULT;
+	return __fd_install_received(-1, file, ufd, o_flags);
 }
 static inline int fd_install_received(struct file *file, unsigned int o_flags)
 {
-	return __fd_install_received(-1, file, false, NULL, o_flags);
+	return __fd_install_received(-1, file, NULL, o_flags);
 }
 static inline int fd_replace_received(int fd, struct file *file, unsigned int o_flags)
 {
-	return __fd_install_received(fd, file, false, NULL, o_flags);
+	return __fd_install_received(fd, file, NULL, o_flags);
 }
 
 extern void flush_delayed_fput(void);

-- 
Kees Cook

  reply	other threads:[~2020-06-17 19:58 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-06-16  3:25 [PATCH v4 00/11] Add seccomp notifier ioctl that enables adding fds Kees Cook
2020-06-16  3:25 ` [PATCH v4 01/11] net/scm: Regularize compat handling of scm_detach_fds() Kees Cook
2020-06-16  3:25 ` [PATCH v4 02/11] fs: Move __scm_install_fd() to __fd_install_received() Kees Cook
2020-06-16  5:29   ` Sargun Dhillon
2020-06-16  5:48     ` Kees Cook
2020-06-17 15:25   ` David Laight
2020-06-17 18:40     ` Kees Cook
2020-06-18  8:56   ` Christian Brauner
2020-06-18 20:05     ` Kees Cook
2020-06-16  3:25 ` [PATCH v4 03/11] fs: Add fd_install_received() wrapper for __fd_install_received() Kees Cook
2020-06-17 15:35   ` David Laight
2020-06-17 19:58     ` Kees Cook [this message]
2020-06-18  8:19       ` David Laight
2020-06-16  3:25 ` [PATCH v4 04/11] pidfd: Replace open-coded partial fd_install_received() Kees Cook
2020-06-16  3:25 ` [PATCH v4 05/11] fs: Expand __fd_install_received() to accept fd Kees Cook
2020-06-16  3:25 ` [PATCH v4 06/11] seccomp: Introduce addfd ioctl to seccomp user notifier Kees Cook
2020-06-16  3:25 ` [PATCH v4 07/11] selftests/seccomp: Test SECCOMP_IOCTL_NOTIF_ADDFD Kees Cook
2020-06-16  3:25 ` [PATCH v4 08/11] selftests/seccomp: Make kcmp() less required Kees Cook
2020-06-16 14:57   ` Tycho Andersen
2020-06-16 16:03     ` Kees Cook
2020-06-16  3:25 ` [PATCH v4 09/11] selftests/seccomp: Rename user_trap_syscall() to user_notif_syscall() Kees Cook
2020-06-16 14:56   ` Tycho Andersen
2020-06-16  3:25 ` [PATCH v4 10/11] seccomp: Switch addfd to Extensible Argument ioctl Kees Cook
2020-06-16 14:55   ` Tycho Andersen
2020-06-16 16:05     ` Kees Cook
2020-06-16 16:18       ` Tycho Andersen
2020-06-16  3:25 ` [PATCH v4 11/11] seccomp: Fix ioctl number for SECCOMP_IOCTL_NOTIF_ID_VALID Kees Cook
2020-06-18 22:16 ` [PATCH v4 00/11] Add seccomp notifier ioctl that enables adding fds Sargun Dhillon

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=202006171141.4DA1174979@keescook \
    --to=keescook@chromium.org \
    --cc=David.Laight@ACULAB.COM \
    --cc=christian@brauner.io \
    --cc=containers@lists.linux-foundation.org \
    --cc=cyphar@cyphar.com \
    --cc=davem@davemloft.net \
    --cc=gregkh@linuxfoundation.org \
    --cc=gscrivan@redhat.com \
    --cc=hch@lst.de \
    --cc=jannh@google.com \
    --cc=kuba@kernel.org \
    --cc=linux-api@vger.kernel.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-kselftest@vger.kernel.org \
    --cc=luto@amacapital.net \
    --cc=mpdenton@google.com \
    --cc=netdev@vger.kernel.org \
    --cc=palmer@google.com \
    --cc=rsesek@google.com \
    --cc=sargun@sargun.me \
    --cc=shuah@kernel.org \
    --cc=tycho@tycho.ws \
    --cc=viro@zeniv.linux.org.uk \
    --cc=wad@chromium.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.