On Wed, Nov 6, 2024 at 3:38 AM Richard Henderson
<richard.hender...@linaro.org> wrote:
>
> On 11/5/24 23:54, Noah Goldstein wrote:
> >>> You still need to handle is_proc_myself, for the guest binary.
> >
> > Would this by handled by basically do:
> >
> > ```
> > if (is_proc_myself(p, "exe")) {
> >          exe = exec_path;
> >          if (through_qemu)
> >              argp[argp_offset] = exec_path;
> > }
> > ```
> > Or am I missing something?
>
> Something like that, yes.
>
> >>> I wonder if those two cases are related.  Do we need to also add an 
> >>> argument so that we
> >>> can pass the executable to the next qemu via file descriptor?  I.e. 
> >>> execvat becomes
> >>>
> >>>       f = openat()
> >>>       execv(qemu, "-execfd", f)
> >>>
> >>> and is_proc_myself uses execfd, which we already have open.
> >
> > How does passing a fd from one process to another work?
> As long as the fd is not marked O_CLOEXEC, it stays open in the new process.  
> Providing
> the number via command-line, or whatever, is sufficient for the new process 
> to know what
> is going on.

Err I guess I was thinking its a bit weird having an option that is
only really applicable
if qemu is a child process. I.e the `-execfd` argument is not usable
from commandline.

>
> I now realize this is necessary for the AT_EMPTY_PATH flag, where we only 
> have the file
> descriptor.

We could also do something along the lines of:

```
fd = openat(dirfd, exe);
char new_exe[PATH_MAX];
char fd_path[PATH_MAX];
sprintf(fd_path, "/proc/self/fd/%d", fd);
readlink(fd_path, new_exe, PATH_MAX);
exe = new_exe;
```
>
>
> r~

Reply via email to