| From 2ee791e452d74959247250773e7f235a27b1ab63 Mon Sep 17 00:00:00 2001 |
| From: tannerlove <tannerlove@google.com> |
| Date: Mon, 8 Jun 2020 15:37:15 -0400 |
| Subject: [PATCH] selftests/net: in timestamping, strncpy needs to preserve |
| null byte |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| commit 8027bc0307ce59759b90679fa5d8b22949586d20 upstream. |
| |
| 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 <tannerlove@google.com> |
| Acked-by: Willem de Bruijn <willemb@google.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/tools/testing/selftests/networking/timestamping/timestamping.c b/tools/testing/selftests/networking/timestamping/timestamping.c |
| index 0fbed67bf4f6..96473df878fa 100644 |
| --- a/tools/testing/selftests/networking/timestamping/timestamping.c |
| +++ b/tools/testing/selftests/networking/timestamping/timestamping.c |
| @@ -320,10 +320,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")) |
| @@ -357,12 +363,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.27.0 |
| |