| From e6afdcd01e78716da6aaf34390062d968b2bc9ca Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Mon, 8 Jun 2020 15:37:15 -0400 |
| Subject: 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 |
| |
| From: tannerlove <tannerlove@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 <tannerlove@google.com> |
| Acked-by: Willem de Bruijn <willemb@google.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Sasha Levin <sashal@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 5cdfd743447b7..900ed4b478996 100644 |
| --- a/tools/testing/selftests/networking/timestamping/timestamping.c |
| +++ b/tools/testing/selftests/networking/timestamping/timestamping.c |
| @@ -332,10 +332,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")) |
| @@ -369,12 +375,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 |
| |