That was by inspection on my system which seems to truncate a lot earlier. It would be nice to find where in the Linux kernel it is output but I failed to grep the relevant function last night.
On Fri, 10 Apr 2020, 12:11 Philippe Mathieu-Daudé, <phi...@redhat.com> wrote: > Cc'ing Ludovic in case he can test with Guix-HPC. > > On 4/9/20 11:15 PM, Alex Bennée wrote: > > In the original bug report long files names in Guix caused > > /proc/self/stat be truncated without the trailing ") " as specified in > > proc manpage which says: > > (2) comm %s > > The filename of the executable, in parentheses. This > > is visible whether or not the executable is swapped > > out. > > > > Additionally it should only be reporting the executable name rather > > than the full path. Fix both these failings while cleaning up the code > > to use GString to build up the reported values. As the whole function > > is cleaned up also adjust the white space to the current coding style. > > > > Message-ID: <fb4c55fa-d539-67ee-c6c9-de8fb63c8...@inria.fr> > > Reported-by: Brice Goglin <brice.gog...@inria.fr> > > Cc: Philippe_Mathieu-Daudé <phi...@redhat.com> > > Signed-off-by: Alex Bennée <alex.ben...@linaro.org> > > --- > > linux-user/syscall.c | 43 +++++++++++++++++++------------------------ > > 1 file changed, 19 insertions(+), 24 deletions(-) > > > > diff --git a/linux-user/syscall.c b/linux-user/syscall.c > > index 6495ddc4cda..674f70e70a5 100644 > > --- a/linux-user/syscall.c > > +++ b/linux-user/syscall.c > > @@ -7295,34 +7295,29 @@ static int open_self_stat(void *cpu_env, int fd) > > { > > CPUState *cpu = env_cpu((CPUArchState *)cpu_env); > > TaskState *ts = cpu->opaque; > > - abi_ulong start_stack = ts->info->start_stack; > > + g_autoptr(GString) buf = g_string_new(NULL); > > int i; > > > > for (i = 0; i < 44; i++) { > > - char buf[128]; > > - int len; > > - uint64_t val = 0; > > - > > - 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' : ' '); > > - } > > + if (i == 0) { > > + /* pid */ > > + g_string_printf(buf, FMT_pid " ", getpid()); > > + } else if (i == 1) { > > + /* app name */ > > + gchar *bin = g_strrstr(ts->bprm->argv[0], "/"); > > + bin = bin ? bin + 1 : ts->bprm->argv[0]; > > + g_string_printf(buf, "(%.15s) ", bin); > > 15 or 125? 15 seems short. From your previous test I understood it was > 124, for > > sizeof("cat_with9_12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890___40"). > > > + } else if (i == 27) { > > + /* stack bottom */ > > + g_string_printf(buf, TARGET_ABI_FMT_ld " ", > ts->info->start_stack); > > + } else { > > + /* for the rest, there is MasterCard */ > > + g_string_printf(buf, "0%c", i == 43 ? '\n' : ' '); > > + } > > > > - len = strlen(buf); > > - if (write(fd, buf, len) != len) { > > - return -1; > > - } > > + if (write(fd, buf->str, buf->len) != buf->len) { > > + return -1; > > + } > > } > > > > return 0; > > > >