From: Al Viro <viro@ZenIV.linux.org.uk>
To: Alex Dubov <alex.dubov@gmail.com>
Cc: linux-kernel@vger.kernel.org, Alex Dubov <oakad@yahoo.com>
Subject: Re: [PATCH 1/2] fs: introduce sendfd() syscall
Date: Tue, 2 Dec 2014 17:00:38 +0000 [thread overview]
Message-ID: <20141202170037.GG29748@ZenIV.linux.org.uk> (raw)
In-Reply-To: <1417494919-4577-2-git-send-email-oakad@yahoo.com>
On Tue, Dec 02, 2014 at 03:35:18PM +1100, Alex Dubov wrote:
> + dst_files = get_files_struct(dst_task);
> + if (!dst_files) {
> + rc = -EMFILE;
> + goto out_put_dst_task;
> + }
> +
> + if (!lock_task_sighand(dst_task, &flags)) {
> + rc = -EMFILE;
> + goto out_put_dst_files;
> + }
> +
> + rlim = task_rlimit(dst_task, RLIMIT_NOFILE);
> +
> + unlock_task_sighand(dst_task, &flags);
> +
> + rc = __alloc_fd(dst_task->files, 0, rlim, O_CLOEXEC);
> + if (rc < 0)
> + goto out_put_dst_files;
> +
> + s_info.si_int = rc;
> +
> + get_file(src_file);
> + __fd_install(dst_files, rc, src_file);
> + rc = kill_pid_info(sig, &s_info, task_pid(dst_task));
> +
> + if (rc < 0)
> + __close_fd(dst_files, s_info.si_int);
Oh, lovely... And we are guaranteed that it still the same file, because...?
Not to mention anything else, this stuff violates the assumption used in a lot
of places - that the *only* way for a process to modify a descriptor table is
to have a reference to it obtained by something that had it as its current
descriptor table and not dropped since then. The way you do it might actually
turn out to be OK, but there's no way I'll take that without detailed analysis;
start with refcounting of struct file, for one thing - it does rely on the
assumption above in non-trivial ways.
Binder, shite as it is, satisfies that assumption. Your "simpler" variant
does not. Which means that you get to prove that you won't open any races
around fs/file.c.
And that's aside of the points other folks had brought up.
next prev parent reply other threads:[~2014-12-02 17:00 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-12-02 4:35 Minimal effort/low overhead file descriptor duplication over Posix.1b s Alex Dubov
2014-12-02 4:35 ` [PATCH 1/2] fs: introduce sendfd() syscall Alex Dubov
2014-12-02 12:50 ` Eric Dumazet
2014-12-02 14:47 ` Alex Dubov
2014-12-02 15:33 ` Eric Dumazet
2014-12-02 16:23 ` Alex Dubov
2014-12-02 16:42 ` Eric Dumazet
2014-12-03 2:11 ` Alex Dubov
2014-12-03 6:48 ` Eric Dumazet
2014-12-02 17:00 ` Al Viro [this message]
2014-12-03 2:22 ` Alex Dubov
2014-12-03 3:40 ` Al Viro
2014-12-03 4:14 ` Alex Dubov
2014-12-03 6:50 ` Eric Dumazet
2014-12-03 8:08 ` Richard Cochran
2014-12-03 8:17 ` Richard Weinberger
2014-12-03 10:41 ` Richard Cochran
2014-12-03 14:08 ` Alex Dubov
2014-12-05 13:37 ` One Thousand Gnomes
2014-12-02 4:35 ` [PATCH 2/2] fs: Wire up sendfd() syscall (all architectures) Alex Dubov
2014-12-02 8:01 ` Geert Uytterhoeven
2014-12-02 8:31 ` Alex Dubov
2014-12-02 11:42 ` Michal Simek
2014-12-02 14:31 ` Alex Dubov
2014-12-02 14:38 ` Geert Uytterhoeven
2014-12-02 15:26 ` Minimal effort/low overhead file descriptor duplication over Posix.1b s Jonathan Corbet
2014-12-02 16:15 ` Alex Dubov
2014-12-17 13:11 ` Kevin Easton
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=20141202170037.GG29748@ZenIV.linux.org.uk \
--to=viro@zeniv.linux.org.uk \
--cc=alex.dubov@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=oakad@yahoo.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox