Re: SCTP_SOCKOPT_PEELOFF is missing SOCK_CLOEXEC (and SOCK_NONBLOCK)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Jun 20, 2017 at 03:00:46PM -0400, Neil Horman wrote:
> On Tue, Jun 20, 2017 at 12:41:47PM -0300, Marcelo Ricardo Leitner wrote:
...
> > Maybe by extending sctp_peeloff_arg_t to have a flags attribute in
> > there, we can allow the application to specify it and feed into
> > get_unused_fd_flags() call in sctp_getsockopt_peeloff() instead, or even
> > just overload the sd, which is currently an output-only value, to
> > contain flags as the patch below. (We probably should add some sanity
> > checking in there, though)
> > 
> Thinking about this some more, I'm a bit hesitant to change the
> sctp_peeloff_arg_t, since thats exposed to user space.  Instead, what if we use

+1

> the sd value in the peeloff arg to fetch the close_on_exec flag in the new fd?
> Something like this (untested) patch:

Yes. :-) That's similar to what I proposed, though you used peeloff.sd
to find the old fd and copy the flag from it and I used it as a pure
'flags' field instead.

I'm still not comfortable on hardwiring this copy. What if the
application doesn't want to inherit the flag?
accept() calls accept4(... , flags=0)
dup2() calls dup3(... , flags=0)
I don't see this direct inheritance anywhere else.

  Marcelo

> 
> 
> diff --git a/net/sctp/socket.c b/net/sctp/socket.c
> index f16c8d9..6386ac4 100644
> --- a/net/sctp/socket.c
> +++ b/net/sctp/socket.c
> @@ -4939,6 +4939,8 @@ static int sctp_getsockopt_peeloff(struct sock *sk, int len, char __user *optval
>  	sctp_peeloff_arg_t peeloff;
>  	struct socket *newsock;
>  	struct file *newfile;
> +	struct file *oldfile
> +	unsigned flags = 0;
>  	int retval = 0;
>  
>  	if (len < sizeof(sctp_peeloff_arg_t))
> @@ -4951,8 +4953,17 @@ static int sctp_getsockopt_peeloff(struct sock *sk, int len, char __user *optval
>  	if (retval < 0)
>  		goto out;
>  
> +	if (get_close_on_exec(peeloff.sd))
> +		flags |= O_CLOEXEC;
> +
> +	oldfile = fget(peelof.sd);
> +	if (oldfile) {
> +		flags |= oldfile->f_flags & O_NONBLOCK;
> +		fput(oldfile);
> +	}
> +
>  	/* Map the socket to an unused fd that can be returned to the user.  */
> -	retval = get_unused_fd_flags(0);
> +	retval = get_unused_fd_flags(flags);
>  	if (retval < 0) {
>  		sock_release(newsock);
>  		goto out;
> --
> To unsubscribe from this list: send the line "unsubscribe linux-sctp" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-sctp" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux Networking Development]     [Linux OMAP]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux