On 03.01.2012, at 20:20, Fabio Erculiani wrote: > 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 <lx...@sabayon.org> > --- > linux-user/syscall.c | 21 ++++++++++++++++----- > 1 files changed, 16 insertions(+), 5 deletions(-) > > diff --git a/linux-user/syscall.c b/linux-user/syscall.c > index 9ba51bf..e563c00 100644 > --- a/linux-user/syscall.c > +++ b/linux-user/syscall.c > @@ -4678,14 +4678,25 @@ 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; > + return -1;
This looks suspicious :). The rest looks good! Alex