[Bug 1926246] Re: chrome based apps can not be run under qemu user mode

Wind Li posted 1 patch 3 years ago
Test checkpatch failed
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/qemu tags/patchew/161951314717.4719.489219171575884785.malone@gac.canonical.com
Maintainers: Laurent Vivier <laurent@vivier.eu>
[Bug 1926246] Re: chrome based apps can not be run under qemu user mode
Posted by Wind Li 3 years ago
qemu patch:  
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index 95d79ddc43..227d9b1b0e 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -8537,7 +8537,7 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1,
              * before the execve completes and makes it the other
              * program's problem.
              */
-            ret = get_errno(safe_execve(p, argp, envp));
+            ret = get_errno(safe_execve(is_proc_myself(p, "exe") ? exec_path : p, argp, envp));
             unlock_user(p, arg1, 0);
 
             goto execve_end;

-- 
You received this bug notification because you are a member of qemu-
devel-ml, which is subscribed to QEMU.
https://bugs.launchpad.net/bugs/1926246

Title:
  chrome based apps can not be run under qemu user mode

Status in QEMU:
  New

Bug description:
  chrome uses /proc/self/exe to fork render process.
  Here a simple code to reproduce the issue. It's output parent then child but failed with qemu: unknown option 'type=renderer'.

  Maybe we can modify exec syscall to replace /proc/self/exe to the real
  path.

  //gcc -o self self.c 
  #include <stdio.h>
  #include <sys/types.h>
  #include <unistd.h>
  int main(int argc, char** argv) {
    if(argc==1){
      printf ("parent\n");
  	if ( fork() == 0 )
      {
          return execl("/proc/self/exe","/proc/self/exe", "--type=renderer",NULL);
      }
    } else {
      printf ("child\n");
    }
    return 0;
  }

  similar reports:
  https://github.com/AppImage/AppImageKit/issues/965  
  https://github.com/golang/go/issues/42080  

  Workardound:
  compile chrome or your chrome based app with a patch to content/common/child_process_host_impl.cc:GetChildPath, get the realpath of /proc/self/exe:  

  diff --git a/content/common/child_process_host_impl.cc b/content/common/child_process_host_impl.cc
  index bc78aba80ac8..9fab74d3bae8 100644
  --- a/content/common/child_process_host_impl.cc
  +++ b/content/common/child_process_host_impl.cc
  @@ -60,8 +60,12 @@ base::FilePath ChildProcessHost::GetChildPath(int flags) {
   #if defined(OS_LINUX)
     // Use /proc/self/exe rather than our known binary path so updates
     // can't swap out the binary from underneath us.
  -  if (child_path.empty() && flags & CHILD_ALLOW_SELF)
  -    child_path = base::FilePath(base::kProcSelfExe);
  +  if (child_path.empty() && flags & CHILD_ALLOW_SELF) {
  +    if (!ReadSymbolicLink(base::FilePath(base::kProcSelfExe), &child_path)) {
  +      NOTREACHED() << "Unable to resolve " << base::kProcSelfExe << ".";
  +      child_path = base::FilePath(base::kProcSelfExe);
  +    }
  +  }
   #endif

     // On most platforms, the child executable is the same as the
  current

To manage notifications about this bug go to:
https://bugs.launchpad.net/qemu/+bug/1926246/+subscriptions

Re: [Bug 1926246] Re: chrome based apps can not be run under qemu user mode
Posted by no-reply@patchew.org 3 years ago
Patchew URL: https://patchew.org/QEMU/161951314717.4719.489219171575884785.malone@gac.canonical.com/



Hi,

This series seems to have some coding style problems. See output below for
more information:

Type: series
Message-id: 161951314717.4719.489219171575884785.malone@gac.canonical.com
Subject: [Bug 1926246] Re: chrome based apps can not be run under qemu user mode

=== TEST SCRIPT BEGIN ===
#!/bin/bash
git rev-parse base > /dev/null || exit 0
git config --local diff.renamelimit 0
git config --local diff.renames True
git config --local diff.algorithm histogram
./scripts/checkpatch.pl --mailback base..
=== TEST SCRIPT END ===

Updating 3c8cf5a9c21ff8782164d1def7f44bd888713384
From https://github.com/patchew-project/qemu
 * [new tag]         patchew/161951314717.4719.489219171575884785.malone@gac.canonical.com -> patchew/161951314717.4719.489219171575884785.malone@gac.canonical.com
 - [tag update]      patchew/20210423044713.3403-1-dongli.zhang@oracle.com -> patchew/20210423044713.3403-1-dongli.zhang@oracle.com
 - [tag update]      patchew/20210423083351.2096734-1-kraxel@redhat.com -> patchew/20210423083351.2096734-1-kraxel@redhat.com
 - [tag update]      patchew/cover.1617281290.git.haibo.xu@linaro.org -> patchew/cover.1617281290.git.haibo.xu@linaro.org
Switched to a new branch 'test'
7defae3 chrome based apps can not be run under qemu user mode

=== OUTPUT BEGIN ===
ERROR: line over 90 characters
#22: FILE: linux-user/syscall.c:8540:
+            ret = get_errno(safe_execve(is_proc_myself(p, "exe") ? exec_path : p, argp, envp));

ERROR: Missing Signed-off-by: line(s)

total: 2 errors, 0 warnings, 8 lines checked

Commit 7defae3f3169 (chrome based apps can not be run under qemu user mode) has style problems, please review.  If any of these errors
are false positives report them to the maintainer, see
CHECKPATCH in MAINTAINERS.
=== OUTPUT END ===

Test command exited with code: 1


The full log is available at
http://patchew.org/logs/161951314717.4719.489219171575884785.malone@gac.canonical.com/testing.checkpatch/?type=message.
---
Email generated automatically by Patchew [https://patchew.org/].
Please send your feedback to patchew-devel@redhat.com
Re: [Bug 1926246] Re: chrome based apps can not be run under qemu user mode
Posted by Laurent Vivier 3 years ago
Le 27/04/2021 à 10:45, Wind Li a écrit :
> qemu patch:  
> diff --git a/linux-user/syscall.c b/linux-user/syscall.c
> index 95d79ddc43..227d9b1b0e 100644
> --- a/linux-user/syscall.c
> +++ b/linux-user/syscall.c
> @@ -8537,7 +8537,7 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1,
>               * before the execve completes and makes it the other
>               * program's problem.
>               */
> -            ret = get_errno(safe_execve(p, argp, envp));
> +            ret = get_errno(safe_execve(is_proc_myself(p, "exe") ? exec_path : p, argp, envp));
>              unlock_user(p, arg1, 0);
>  
>              goto execve_end;
> 

I think this is the good approach to fix the problem, but exec_path can be not set in the case of
AT_EXECFD (binfmt_misc with credential flag) because we use execfd instead. You should use
do_openat() to get the file descriptor and execveat() to start the process.

Thanks,
Laurent