| From ad5c82469ba955a6d3daf4eaf6b4d594155dfe53 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 30 Apr 2020 23:30:49 +0200 |
| Subject: drop_monitor: work around gcc-10 stringop-overflow warning |
| |
| From: Arnd Bergmann <arnd@arndb.de> |
| |
| [ Upstream commit dc30b4059f6e2abf3712ab537c8718562b21c45d ] |
| |
| The current gcc-10 snapshot produces a false-positive warning: |
| |
| net/core/drop_monitor.c: In function 'trace_drop_common.constprop': |
| cc1: error: writing 8 bytes into a region of size 0 [-Werror=stringop-overflow=] |
| In file included from net/core/drop_monitor.c:23: |
| include/uapi/linux/net_dropmon.h:36:8: note: at offset 0 to object 'entries' with size 4 declared here |
| 36 | __u32 entries; |
| | ^~~~~~~ |
| |
| I reported this in the gcc bugzilla, but in case it does not get |
| fixed in the release, work around it by using a temporary variable. |
| |
| Fixes: 9a8afc8d3962 ("Network Drop Monitor: Adding drop monitor implementation & Netlink protocol") |
| Link: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94881 |
| Signed-off-by: Arnd Bergmann <arnd@arndb.de> |
| Acked-by: Neil Horman <nhorman@tuxdriver.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| net/core/drop_monitor.c | 11 +++++++---- |
| 1 file changed, 7 insertions(+), 4 deletions(-) |
| |
| diff --git a/net/core/drop_monitor.c b/net/core/drop_monitor.c |
| index 31700e0c39283..04d8e8779384d 100644 |
| --- a/net/core/drop_monitor.c |
| +++ b/net/core/drop_monitor.c |
| @@ -212,6 +212,7 @@ static void sched_send_work(struct timer_list *t) |
| static void trace_drop_common(struct sk_buff *skb, void *location) |
| { |
| struct net_dm_alert_msg *msg; |
| + struct net_dm_drop_point *point; |
| struct nlmsghdr *nlh; |
| struct nlattr *nla; |
| int i; |
| @@ -230,11 +231,13 @@ static void trace_drop_common(struct sk_buff *skb, void *location) |
| nlh = (struct nlmsghdr *)dskb->data; |
| nla = genlmsg_data(nlmsg_data(nlh)); |
| msg = nla_data(nla); |
| + point = msg->points; |
| for (i = 0; i < msg->entries; i++) { |
| - if (!memcmp(&location, msg->points[i].pc, sizeof(void *))) { |
| - msg->points[i].count++; |
| + if (!memcmp(&location, &point->pc, sizeof(void *))) { |
| + point->count++; |
| goto out; |
| } |
| + point++; |
| } |
| if (msg->entries == dm_hit_limit) |
| goto out; |
| @@ -243,8 +246,8 @@ static void trace_drop_common(struct sk_buff *skb, void *location) |
| */ |
| __nla_reserve_nohdr(dskb, sizeof(struct net_dm_drop_point)); |
| nla->nla_len += NLA_ALIGN(sizeof(struct net_dm_drop_point)); |
| - memcpy(msg->points[msg->entries].pc, &location, sizeof(void *)); |
| - msg->points[msg->entries].count = 1; |
| + memcpy(point->pc, &location, sizeof(void *)); |
| + point->count = 1; |
| msg->entries++; |
| |
| if (!timer_pending(&data->send_timer)) { |
| -- |
| 2.20.1 |
| |