coreutils
[Top][All Lists]
Advanced

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

Re: env -C lacks fchdir support


From: Pádraig Brady
Subject: Re: env -C lacks fchdir support
Date: Mon, 10 Sep 2018 21:15:43 -0700
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.8.0

On 10/09/18 08:30, Eric Blake wrote:
> On 9/9/18 7:01 PM, Pádraig Brady wrote:
>> On 07/09/18 08:24, Eric Blake wrote:
>>> There are cases where you cannot directly change directory to a given
>>> location via a path name, but where you can hold an fd to that directory
>>> and where fchdir() will work. Since we've already added 'env -C' as an
>>> extension for chdir, should we add a counterpart extension that permits
>>> fchdir to an inherited fd, even for systems that lack /proc/NNN/fd/MMM?
>>
>> Maybe. Do you have concrete examples for where this might be useful.
> 
> Not the cleanest, but I'm playing with ideas with using 'env' to 
> workaround a lack of posix_spawn_file_actions_addchdir[_np]() in libc. 
> That is, I'm trying to see if it makes sense for attempting to convert 
> this pseudocode:
> 
> fork()
> fd = openat(dir, "relative", flags)
> dup2(fd, 0)
> close(fd)
> fchdir(dir)
> exec("program", (char *const[]){"program", "args", NULL}, env)
> 
> into:
> 
> posix_spawn_file_actions_init(&act)
> fd = openat(dir, "relative", flags)
> posix_spawn_file_actions_adddup2(&act, fd, 0)
> posix_spawn_file_actions_addclose(&act, fd)
> posix_spawnp(&pid, "env", &act, NULL,
>    (char *const[]){"env", "--fchdir", to_string(dir),
>       "program", "args", NULL}, env)
> posix_spawn_file_actions_destroy(&act)
> 
> although right off the bat, I'm seeing an issue that you can set 
> FD_CLOEXEC on dir so that it doesn't leak into the child via fork/exec, 
> but it MUST leak into 'env --fchdir NNN', so we'd also need a way to 
> tell env whether to further close the fd before calling the wrapped program.
> 

Seeing that I'm inclined to think coreutils should restrict
themselves to file name level operations, leaving descriptor
level to lower level libs.

cheers,
Pádraig



reply via email to

[Prev in Thread] Current Thread [Next in Thread]