linux-user: remove all traces of qemu from /proc/self/cmdline
PATCH 1/1 linux-user: remove all traces of qemu from /proc/self/cmdline
Instead of post-processing the real contents use the remembered target argv. That removes all traces of qemu, including command line options, and handles QEMU_ARGV0.
Signed-off-by Andreas Schwab <[email protected]>
--- linux-user/syscall.c | 47 +++++++---------------------------------------- 1 file changed, 7 insertions(+), 40 deletions(-)
linux-user/syscall.c +7 -40
@@ -7358,52 +7358,19 @@ int host_to_target_waitstatus(int status)static int open_self_cmdline (void *cpu_env,int fd) { -int fd_orig =-1 ; -bool word_skipped = false; - - fd_orig =open ("/proc/self/cmdline" ,O_RDONLY ); -if (fd_orig <0 ) { -return fd_orig; - } +CPUState *cpu =ENV_GET_CPU ((CPUArchState *)cpu_env); +struct linux_binprm *bprm = ((TaskState *)cpu->opaque)->bprm; +int i; -while (true) { -ssize_t nb_read; -char buf[128 ]; -char *cp_buf = buf; +for (i =0 ; i < bprm->argc; i++) { +size_t len =strlen (bprm->argv[i]) +1 ; - nb_read =read (fd_orig, buf,sizeof (buf)); -if (nb_read <0 ) { -int e = errno; - fd_orig =close (fd_orig); - errno = e; +if (write (fd, bprm->argv[i], len) != len) {return -1 ; - }else if (nb_read ==0 ) { -break ; - } - -if (!word_skipped) { -/* Skip the first string, which is the path to qemu-*-static -instead of the actual command. */ - cp_buf =memchr (buf,0 , nb_read); -if (cp_buf) { -/* Null byte found, skip one string */ - cp_buf++; - nb_read -= cp_buf - buf; - word_skipped = true; - } - } - -if (word_skipped) { -if (write (fd, cp_buf, nb_read) != nb_read) { -int e = errno; -close (fd_orig); - errno = e; -return -1 ; - } } } -return close (fd_orig); +return 0 ; }static int open_self_maps (void *cpu_env,int fd)
Signature · 7 lines
2.12.0 -- Andreas Schwab, SUSE Labs, [email protected] GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE 1748 E4D4 88E3 0EEA B9D7 "And now for something completely different."
Riku Voipio
AppliedQuoted 3 lines · Andreas Schwab
Instead of post-processing the real contents use the remembered target argv. That removes all traces of qemu, including command line options, and handles
QEMU_ARGV0.
Applied to Linux-user, thanks
Riku
Quoted 77 lines
Signed-off-by Andreas Schwab <[email protected]>--- linux-user/syscall.c | 47 +++++++---------------------------------------- 1 file changed, 7 insertions(+), 40 deletions(-)linux-user/syscall.c +7
-40@@ -7358,52 +7358,19 @@ int host_to_target_waitstatus(int status)static int open_self_cmdline (void *cpu_env,int fd) { -int fd_orig =-1 ; -bool word_skipped = false; - - fd_orig =open ("/proc/self/cmdline" ,O_RDONLY ); -if (fd_orig <0 ) { -return fd_orig; - } +CPUState *cpu =ENV_GET_CPU ((CPUArchState *)cpu_env); +struct linux_binprm *bprm = ((TaskState *)cpu->opaque)->bprm; +int i; -while (true) { -ssize_t nb_read; -char buf[128 ]; -char *cp_buf = buf; +for (i =0 ; i < bprm->argc; i++) { +size_t len =strlen (bprm->argv[i]) +1 ; - nb_read =read (fd_orig, buf,sizeof (buf)); -if (nb_read <0 ) { -int e = errno; - fd_orig =close (fd_orig); - errno = e; +if (write (fd, bprm->argv[i], len) != len) {return -1 ; - }else if (nb_read ==0 ) { -break ; - } - -if (!word_skipped) { -/* Skip the first string, which is the path to qemu-*-static -instead of the actual command. */ - cp_buf =memchr (buf,0 , nb_read); -if (cp_buf) { -/* Null byte found, skip one string */ - cp_buf++; - nb_read -= cp_buf - buf; - word_skipped = true; - } - } - -if (word_skipped) { -if (write (fd, cp_buf, nb_read) != nb_read) { -int e = errno; -close (fd_orig); - errno = e; -return -1 ; - } } } -return close (fd_orig); +return 0 ; }static int open_self_maps (void *cpu_env,int fd)Signature · 7 lines
2.12.0 -- Andreas Schwab, SUSE Labs, [email protected] GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE 1748 E4D4 88E3 0EEA B9D7 "And now for something completely different."