shared/dm-util: use strncpy_exact() to silence gcc
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Wed, 10 Jul 2019 08:22:48 +0000 (10:22 +0200)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Wed, 10 Jul 2019 08:32:39 +0000 (10:32 +0200)
With gcc-9.1.1-2.fc31.x86_64 and -Doptimization=2:
../src/shared/dm-util.c: In function ‘dm_deferred_remove’:
../src/shared/dm-util.c:35:9: warning: ‘strncpy’ specified bound 128 equals destination size [-Wstringop-truncation]
   35 |         strncpy(dm.name, name, sizeof(dm.name));
      |         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

gcc is plain wrong here, because we checked strlen(name) a few lines above, so
there can be no truncation and even the terminator always fits. But let's avoid
the warning.

src/shared/dm-util.c

index a17b85b..f73bf93 100644 (file)
@@ -5,6 +5,7 @@
 
 #include "dm-util.h"
 #include "fd-util.h"
+#include "string-util.h"
 
 int dm_deferred_remove(const char *name) {
 
@@ -25,14 +26,14 @@ int dm_deferred_remove(const char *name) {
         /* Unfortunately, libcryptsetup doesn't provide a proper API for this, hence call the ioctl()
          * directly. */
 
-        if (strlen(name) > sizeof(dm.name)-1)
+        if (strlen(name) >= sizeof(dm.name))
                 return -ENODEV; /* A device with a name longer than this cannot possibly exist */
 
         fd = open("/dev/mapper/control", O_RDWR|O_CLOEXEC);
         if (fd < 0)
                 return -errno;
 
-        strncpy(dm.name, name, sizeof(dm.name));
+        strncpy_exact(dm.name, name, sizeof(dm.name));
 
         if (ioctl(fd, DM_DEV_REMOVE, &dm))
                 return -errno;