Re: [PATCH][RFC] fs/exec.c: provide the correct process pid to the pipe helper

Eric W. Biederman
2010-09-16T20:12:44Z

Oleg Nesterov <oleg@redhat.com> writes:

> On 09/16, Will Drewry wrote:
>>
>> --- a/fs/exec.c
>> +++ b/fs/exec.c
>> @@ -1467,6 +1467,13 @@ static int format_corename(char *corename, long signr)
>> char *const out_end = corename + CORENAME_MAX_SIZE;
>> int rc;
>> int pid_in_pattern = 0;
>> + pid_t pid = task_tgid_vnr(current);
>> +
>> + /* The pipe helper runs in the init namespace and should
>> + * receive the matching pid until that changes.
>> + */
>> + if (ispipe)
>> + pid = task_tgid_nr(current);
>
> Agreed, it doesn't make sense to pass the "local" pid to the init ns.

Yes, passing the local pid to the init pid namespace doesn't make a lot
of sense. I have recently fixed unix domain sockets to avoid doing that
kind of silliness.

That said I don't think this is a complete fix. We also potentially
have the same issue with the uts namespace and the user namespace.

I believe the core file holds all of this information relative to the
process that is dying, one elf note or other so we don't need to worry
about information loss.

As for how to implement this for the pid case can we simply grab the
namespace at the ispipe stage and use task_tgid_nr_ns. Something like:
pid_ns = current->nsproxy->pid_ns;
if (is_pipe)
pid_ns = &init_pid_ns;

....
/* pid */
case 'p':
pid_in_pattern = 1;
rc = snprintf(out_ptr, out_end - out_ptr,
"%d", task_tgid_pid_nr_ns(pid_ns, current));
if (rc > out_end - out_ptr)
goto out;
out_ptr += rc;
break;

Will you were saying something about complex namespacing (in particular
the network namespace giving you problems). The network namespace has
no influence over pipes so how does that come into play?

I can imagine that it would be nice to have different core patterns
depending on where you are in the process tree, so a container can
do something different than the system outside of the container. Are
you thinking along those lines, or are you imagining something else?

Eric