All of lore.kernel.org
 help / color / mirror / Atom feed
From: Al Viro <viro@zeniv.linux.org.uk>
To: Zhiqiang Liu <liuzhiqiang26@huawei.com>
Cc: linux-fsdevel@vger.kernel.org,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	cai@redhat.com
Subject: Re: [PATCH] pipe: fix potential inode leak in create_pipe_files()
Date: Wed, 28 Oct 2020 03:54:53 +0000	[thread overview]
Message-ID: <20201028035453.GI3576660@ZenIV.linux.org.uk> (raw)
In-Reply-To: <779f767d-c08b-0c03-198e-06270100d529@huawei.com>

On Wed, Oct 28, 2020 at 11:03:52AM +0800, Zhiqiang Liu wrote:
> 
> In create_pipe_files(), if alloc_file_clone() fails, we will call
> put_pipe_info to release pipe, and call fput() to release f.
> However, we donot call iput() to free inode.

Huh?  Have you actually tried to trigger that failure exit?

> Signed-off-by: Zhiqiang Liu <liuzhiqiang26@huawei.com>
> Signed-off-by: Feilong Lin <linfeilong@huawei.com>
> ---
>  fs/pipe.c | 1 +
>  1 file changed, 1 insertion(+)
> 
> diff --git a/fs/pipe.c b/fs/pipe.c
> index 0ac197658a2d..8856607fde65 100644
> --- a/fs/pipe.c
> +++ b/fs/pipe.c
> @@ -924,6 +924,7 @@ int create_pipe_files(struct file **res, int flags)
>  	if (IS_ERR(res[0])) {
>  		put_pipe_info(inode, inode->i_pipe);
>  		fput(f);
> +		iput(inode);
>  		return PTR_ERR(res[0]);

No.  That inode is created with refcount 1.  If alloc_file_pseudo()
succeeds, the reference we'd been holding has been transferred into
dentry allocated by alloc_file_pseudo() (and attached to f).
From that point on we do *NOT* own a reference to inode and no
subsequent failure exits have any business releasing it.

In particular, alloc_file_clone() DOES NOT create extra references
to inode, whether it succeeds or fails.  Dropping the reference
to f will take care of everything.

If you tried to trigger that failure exit with your patch applied,
you would've seen double iput(), as soon as you return from sys_pipe()
to userland and task_work is processed (which is where the real
destructor of struct file will happen).

NAK.

  reply	other threads:[~2020-10-29  7:34 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-10-28  3:03 [PATCH] pipe: fix potential inode leak in create_pipe_files() Zhiqiang Liu
2020-10-28  3:54 ` Al Viro [this message]
2020-10-28  6:00   ` Zhiqiang Liu

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=20201028035453.GI3576660@ZenIV.linux.org.uk \
    --to=viro@zeniv.linux.org.uk \
    --cc=cai@redhat.com \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=liuzhiqiang26@huawei.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 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.