From 6695c200bd5f0cbe65647fcdafa2f1dbed4b6a64 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Tue, 7 May 2019 15:10:58 +0200 Subject: [PATCH] shared/utmp-wtmp: silence gcc warning about strncpy truncation Unfortunately the warning must be known, or otherwise the pragma generates a warning or an error. So let's do a meson check for it. Is it worth doing this to silence the warning? I think so, because apparently the warning was already emitted by gcc-8.1, and with the recent push in gcc to catch more such cases, we'll most likely only get more of those. --- meson.build | 3 +++ src/basic/macro.h | 9 +++++++++ src/basic/string-util.h | 6 ++++++ src/shared/utmp-wtmp.c | 2 +- 4 files changed, 19 insertions(+), 1 deletion(-) diff --git a/meson.build b/meson.build index 24ef643..b5d06e4 100644 --- a/meson.build +++ b/meson.build @@ -411,11 +411,14 @@ endif cpp = ' '.join(cc.cmd_array()) + ' -E' +has_wstringop_truncation = cc.has_argument('-Wstringop-truncation') + ##################################################################### # compilation result tests conf.set('_GNU_SOURCE', true) conf.set('__SANE_USERSPACE_TYPES__', true) +conf.set10('HAVE_WSTRINGOP_TRUNCATION', has_wstringop_truncation) conf.set('SIZEOF_PID_T', cc.sizeof('pid_t', prefix : '#include ')) conf.set('SIZEOF_UID_T', cc.sizeof('uid_t', prefix : '#include ')) diff --git a/src/basic/macro.h b/src/basic/macro.h index 1971e91..ae8907d 100644 --- a/src/basic/macro.h +++ b/src/basic/macro.h @@ -105,6 +105,15 @@ _Pragma("GCC diagnostic push"); \ _Pragma("GCC diagnostic ignored \"-Wincompatible-pointer-types\"") +#if HAVE_WSTRINGOP_TRUNCATION +# define DISABLE_WARNING_STRINGOP_TRUNCATION \ + _Pragma("GCC diagnostic push"); \ + _Pragma("GCC diagnostic ignored \"-Wstringop-truncation\"") +#else +# define DISABLE_WARNING_STRINGOP_TRUNCATION \ + _Pragma("GCC diagnostic push") +#endif + #define REENABLE_WARNING \ _Pragma("GCC diagnostic pop") diff --git a/src/basic/string-util.h b/src/basic/string-util.h index b23f4c8..a630856 100644 --- a/src/basic/string-util.h +++ b/src/basic/string-util.h @@ -212,6 +212,12 @@ static inline size_t strlen_ptr(const char *s) { return strlen(s); } +DISABLE_WARNING_STRINGOP_TRUNCATION; +static inline void strncpy_exact(char *buf, const char *src, size_t buf_len) { + strncpy(buf, src, buf_len); +} +REENABLE_WARNING; + /* Like startswith(), but operates on arbitrary memory blocks */ static inline void *memory_startswith(const void *p, size_t sz, const char *token) { size_t n; diff --git a/src/shared/utmp-wtmp.c b/src/shared/utmp-wtmp.c index db4811b..646f449 100644 --- a/src/shared/utmp-wtmp.c +++ b/src/shared/utmp-wtmp.c @@ -209,7 +209,7 @@ int utmp_put_init_process(const char *id, pid_t pid, pid_t sid, const char *line copy_suffix(store.ut_id, sizeof(store.ut_id), id); if (line) - strncpy(store.ut_line, basename(line), sizeof(store.ut_line)); + strncpy_exact(store.ut_line, line, sizeof(store.ut_line)); r = write_entry_both(&store); if (r < 0) -- 2.7.4