On Tue, Apr 30, 2019 at 1:40 PM Eric Blake <ebl...@redhat.com> wrote: > > On 4/30/19 3:09 PM, Alistair Francis wrote: > > Fix this warning when building with GCC9 on Fedora 30: > > In function ‘strncpy’, > > inlined from ‘sys_uname’ at /home/alistair/qemu/linux-user/uname.c:94:3: > > /usr/include/bits/string_fortified.h:106:10: error: ‘__builtin_strncpy’ > > output may be truncated copying 64 bytes from a string of length 64 > > [-Werror=stringop-truncation] > > 106 | return __builtin___strncpy_chk (__dest, __src, __len, __bos > > (__dest)); > > | > > ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > > > > Signed-off-by: Alistair Francis <alistair.fran...@wdc.com> > > --- > > linux-user/uname.c | 8 ++++++++ > > 1 file changed, 8 insertions(+) > > > > diff --git a/linux-user/uname.c b/linux-user/uname.c > > index 313b79dbad..293b2238f2 100644 > > --- a/linux-user/uname.c > > +++ b/linux-user/uname.c > > @@ -90,6 +90,11 @@ int sys_uname(struct new_utsname *buf) > > * struct linux kernel uses). > > */ > > > > +#if defined(CONFIG_PRAGMA_DIAGNOSTIC_AVAILABLE) && QEMU_GNUC_PREREQ(9, 0) > > +#pragma GCC diagnostic push > > +#pragma GCC diagnostic ignored "-Wstringop-truncation" > > +#endif > > Why do we need the pragma? > > > + > > memset(buf, 0, sizeof(*buf)); > > We are prezeroing the entire field, at which point... > > > COPY_UTSNAME_FIELD(buf->sysname, uts_buf.sysname); > > COPY_UTSNAME_FIELD(buf->nodename, uts_buf.nodename); > > ...using strncpy() for a shorter string is wasteful (we're writing the > tail end twice), and for a long string is warning-prone. Why not > rewrite COPY_UTSNAME_FIELD() to use memcpy() for the MIN(strlen(src), > __NEW_UTS_LEN) and drop the write of the trailing NUL, since it will > already be NUL from your memset()?
I'm happy to do that, I'll change it to memcpy(). Alistair > > -- > Eric Blake, Principal Software Engineer > Red Hat, Inc. +1-919-301-3226 > Virtualization: qemu.org | libvirt.org >