mirror of https://github.com/xemu-project/xemu.git
linux-user: improve fake /proc/self/stat making `ps` not segfault.
With the current fake /proc/self/stat implementation `ps` is segfaulting because it expects to read PID and argv[0] as first and second field respectively, with the latter being enclosed between backets. Reproducing is as easy as running: `ps` inside qemu-user chroot with /proc mounted. Signed-off-by: Fabio Erculiani <lxnay@sabayon.org> Acked-by: Alexander Graf <agraf@suse.de> Signed-off-by: Alexander Graf <agraf@suse.de> Signed-off-by: Riku Voipio <riku.voipio@linaro.org>
This commit is contained in:
parent
8f8d364f24
commit
e0e65bee16
|
@ -4662,11 +4662,22 @@ static int open_self_stat(void *cpu_env, int fd)
|
|||
int len;
|
||||
uint64_t val = 0;
|
||||
|
||||
if (i == 27) {
|
||||
/* stack bottom */
|
||||
val = start_stack;
|
||||
if (i == 0) {
|
||||
/* pid */
|
||||
val = getpid();
|
||||
snprintf(buf, sizeof(buf), "%"PRId64 " ", val);
|
||||
} else if (i == 1) {
|
||||
/* app name */
|
||||
snprintf(buf, sizeof(buf), "(%s) ", ts->bprm->argv[0]);
|
||||
} else if (i == 27) {
|
||||
/* stack bottom */
|
||||
val = start_stack;
|
||||
snprintf(buf, sizeof(buf), "%"PRId64 " ", val);
|
||||
} else {
|
||||
/* for the rest, there is MasterCard */
|
||||
snprintf(buf, sizeof(buf), "0%c", i == 43 ? '\n' : ' ');
|
||||
}
|
||||
snprintf(buf, sizeof(buf), "%"PRId64 "%c", val, i == 43 ? '\n' : ' ');
|
||||
|
||||
len = strlen(buf);
|
||||
if (write(fd, buf, len) != len) {
|
||||
return -1;
|
||||
|
|
Loading…
Reference in New Issue