From: tannerlove <tannerl...@google.com>

[ Upstream commit 8027bc0307ce59759b90679fa5d8b22949586d20 ]

If user passed an interface option longer than 15 characters, then
device.ifr_name and hwtstamp.ifr_name became non-null-terminated
strings. The compiler warned about this:

timestamping.c:353:2: warning: ‘strncpy’ specified bound 16 equals \
destination size [-Wstringop-truncation]
  353 |  strncpy(device.ifr_name, interface, sizeof(device.ifr_name));

Fixes: cb9eff097831 ("net: new user space API for time stamping of incoming and 
outgoing packets")
Signed-off-by: Tanner Love <tannerl...@google.com>
Acked-by: Willem de Bruijn <will...@google.com>
Signed-off-by: David S. Miller <da...@davemloft.net>
Signed-off-by: Sasha Levin <sas...@kernel.org>
---
 .../selftests/networking/timestamping/timestamping.c   | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/tools/testing/selftests/networking/timestamping/timestamping.c 
b/tools/testing/selftests/networking/timestamping/timestamping.c
index aca3491174a1..f4bb4fef0f39 100644
--- a/tools/testing/selftests/networking/timestamping/timestamping.c
+++ b/tools/testing/selftests/networking/timestamping/timestamping.c
@@ -313,10 +313,16 @@ int main(int argc, char **argv)
        int val;
        socklen_t len;
        struct timeval next;
+       size_t if_len;
 
        if (argc < 2)
                usage(0);
        interface = argv[1];
+       if_len = strlen(interface);
+       if (if_len >= IFNAMSIZ) {
+               printf("interface name exceeds IFNAMSIZ\n");
+               exit(1);
+       }
 
        for (i = 2; i < argc; i++) {
                if (!strcasecmp(argv[i], "SO_TIMESTAMP"))
@@ -350,12 +356,12 @@ int main(int argc, char **argv)
                bail("socket");
 
        memset(&device, 0, sizeof(device));
-       strncpy(device.ifr_name, interface, sizeof(device.ifr_name));
+       memcpy(device.ifr_name, interface, if_len + 1);
        if (ioctl(sock, SIOCGIFADDR, &device) < 0)
                bail("getting interface IP address");
 
        memset(&hwtstamp, 0, sizeof(hwtstamp));
-       strncpy(hwtstamp.ifr_name, interface, sizeof(hwtstamp.ifr_name));
+       memcpy(hwtstamp.ifr_name, interface, if_len + 1);
        hwtstamp.ifr_data = (void *)&hwconfig;
        memset(&hwconfig, 0, sizeof(hwconfig));
        hwconfig.tx_type =
-- 
2.25.1

Reply via email to