qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH] linux-user: Use *at functions to implement inte


From: Richard Henderson
Subject: Re: [Qemu-devel] [PATCH] linux-user: Use *at functions to implement interp_prefix
Date: Tue, 13 Feb 2018 07:31:21 -0800
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.6.0

On 02/13/2018 04:12 AM, Peter Maydell wrote:
>> +const char *linux_user_path(const char *pathname)
>> +{
>> +    static THREAD size_t save_len;
>> +    static THREAD char *save_buf;
> 
> I think THREAD is a remnant of when we used to support configuration
> with and without NPTL, so we should be looking to get rid of it,
> and just use __thread instead.

Fair.

>> +    size_t len, prefix_len, path_len;
>> +    int e;
>> +
>> +    /* Only consider absolute paths.  */
>> +    if (pathname[0] != '/' || interp_dirfd < 0) {
>> +        return pathname;
>> +    }
>> +
>> +    /* Test if the path within interp_dir exists.  */
>> +    e = faccessat(interp_dirfd, pathname + 1, F_OK, AT_SYMLINK_NOFOLLOW);
>> +    if (e < 0 && errno != ENOENT) {
>> +        return pathname;
>> +    }
>> +
>> +    /* It does -- form the new absolute path.  */
>> +    prefix_len = strlen(interp_prefix);
>> +    path_len = strlen(pathname) + 1;
>> +    len = prefix_len + path_len;
>> +    if (len <= save_len) {
>> +        save_len = len;
>> +        save_buf = realloc(save_buf, len);
>> +    }
>> +    memcpy(save_buf, interp_prefix, prefix_len);
>> +    memcpy(save_buf + prefix_len, pathname, path_len);
>> +
>> +    return save_buf;
>> +}
> 
> The split of an atomic syscall into a two-part thing involving
> an existence/access check and then the syscall makes me a bit
> nervous about races, but I guess there's nothing terrible that
> would happen here...

It's no different from what we have now except that currently the existence
check is done *much* earlier.

> I had a look at where we still need this function:
>  * NR_acct
>  * NR_statfs (various flavours)
>  * NR_inotify_add_watch
> 
> For inotify_add_watch, we can first try the syscall on the
> path inside the interp_dir, and if that fails ENOENT then
> try it with the normal path.

Fair.

>>      /* Scan interp_prefix dir for replacement files. */
>> -    init_paths(interp_prefix);
>> +    interp_dirfd = open(interp_prefix, O_CLOEXEC | O_DIRECTORY | O_PATH);
>>
>>      init_qemu_uname_release();
> 
> I wonder if there are guest programs that make assumptions about
> file descriptor numbers such that it would be worthwhile dup2'ing
> the interp_dirfd away from the presumably low number fd it will
> get by default into something larger...

Hmm.  Using dup2(probe, probe) to test if the new (high) fd itself has not been
allocated?

> Have you tried an LTP test run with this patchset to see whether
> we get any new passes/fails ?

No.  All I've really done is point -L at a debian rootfs and see that mainline
qemu is unusable in that state.


r~



reply via email to

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