wifi: mt76: fix clang-specific fortify warnings
authorDmitry Antipov <dmantipov@yandex.ru>
Tue, 29 Aug 2023 09:43:49 +0000 (12:43 +0300)
committerFelix Fietkau <nbd@nbd.name>
Sat, 30 Sep 2023 18:03:04 +0000 (20:03 +0200)
When compiling with clang 16.0.6 and CONFIG_FORTIFY_SOURCE=y, I've
noticed the following (somewhat confusing due to absence of an actual
source code location):

In file included from drivers/net/wireless/mediatek/mt76/mt792x_core.c:4:
In file included from ./include/linux/module.h:13:
In file included from ./include/linux/stat.h:19:
In file included from ./include/linux/time.h:60:
In file included from ./include/linux/time32.h:13:
In file included from ./include/linux/timex.h:67:
In file included from ./arch/x86/include/asm/timex.h:5:
In file included from ./arch/x86/include/asm/processor.h:23:
In file included from ./arch/x86/include/asm/msr.h:11:
In file included from ./arch/x86/include/asm/cpumask.h:5:
In file included from ./include/linux/cpumask.h:12:
In file included from ./include/linux/bitmap.h:11:
In file included from ./include/linux/string.h:254:
./include/linux/fortify-string.h:592:4: warning: call to '__read_overflow2_field'
declared with 'warning' attribute: detected read beyond size of field (2nd
parameter); maybe use struct_group()? [-Wattribute-warning]
                        __read_overflow2_field(q_size_field, size);

In file included from drivers/net/wireless/mediatek/mt76/mt7915/main.c:4:
In file included from ./include/linux/etherdevice.h:20:
In file included from ./include/linux/if_ether.h:19:
In file included from ./include/linux/skbuff.h:15:
In file included from ./include/linux/time.h:60:
In file included from ./include/linux/time32.h:13:
In file included from ./include/linux/timex.h:67:
In file included from ./arch/x86/include/asm/timex.h:5:
In file included from ./arch/x86/include/asm/processor.h:23:
In file included from ./arch/x86/include/asm/msr.h:11:
In file included from ./arch/x86/include/asm/cpumask.h:5:
In file included from ./include/linux/cpumask.h:12:
In file included from ./include/linux/bitmap.h:11:
In file included from ./include/linux/string.h:254:
./include/linux/fortify-string.h:592:4: warning: call to '__read_overflow2_field'
declared with 'warning' attribute: detected read beyond size of field (2nd
parameter); maybe use struct_group()? [-Wattribute-warning]
                        __read_overflow2_field(q_size_field, size);

In file included from drivers/net/wireless/mediatek/mt76/mt7996/main.c:6:
In file included from drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h:9:
In file included from ./include/linux/interrupt.h:8:
In file included from ./include/linux/cpumask.h:12:
In file included from ./include/linux/bitmap.h:11:
In file included from ./include/linux/string.h:254:
./include/linux/fortify-string.h:592:4: warning: call to '__read_overflow2_field'
declared with 'warning' attribute: detected read beyond size of field (2nd
parameter); maybe use struct_group()? [-Wattribute-warning]
                        __read_overflow2_field(q_size_field, size);

The compiler actually complains on 'mt7915_get_et_strings()',
'mt792x_get_et_strings()' and 'mt7996_get_et_strings()' due to the same
reason: fortification logic inteprets call to 'memcpy()' as an attempt
to copy the whole array from its first member and so issues an overread
warning. These warnings may be silenced by passing an address of the whole
array and not the first member to 'memcpy()'.

Signed-off-by: Dmitry Antipov <dmantipov@yandex.ru>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt7915/main.c
drivers/net/wireless/mediatek/mt76/mt792x_core.c
drivers/net/wireless/mediatek/mt76/mt7996/main.c

index 240483154faad9f6ba9538214391cf8e131a2d9d..e8e02d1420fddfc10fe7f07c10c08bcfdaeb3751 100644 (file)
@@ -1398,7 +1398,7 @@ void mt7915_get_et_strings(struct ieee80211_hw *hw,
        if (sset != ETH_SS_STATS)
                return;
 
-       memcpy(data, *mt7915_gstrings_stats, sizeof(mt7915_gstrings_stats));
+       memcpy(data, mt7915_gstrings_stats, sizeof(mt7915_gstrings_stats));
        data += sizeof(mt7915_gstrings_stats);
        page_pool_ethtool_stats_get_strings(data);
 }
index 5648b7328b8c208f78575262e9c5f41621aba422..8c97ac007d9ca092b9ce8a0665f6e329c91d7a83 100644 (file)
@@ -358,7 +358,7 @@ void mt792x_get_et_strings(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
        if (sset != ETH_SS_STATS)
                return;
 
-       memcpy(data, *mt792x_gstrings_stats, sizeof(mt792x_gstrings_stats));
+       memcpy(data, mt792x_gstrings_stats, sizeof(mt792x_gstrings_stats));
 
        data += sizeof(mt792x_gstrings_stats);
        page_pool_ethtool_stats_get_strings(data);
index fc9061e3f481db4cec9c09b0679f68ec1c808c8d..b0f0159384d4177ed494174160c786cbeef8ce4e 100644 (file)
@@ -1189,7 +1189,7 @@ void mt7996_get_et_strings(struct ieee80211_hw *hw,
                           u32 sset, u8 *data)
 {
        if (sset == ETH_SS_STATS)
-               memcpy(data, *mt7996_gstrings_stats,
+               memcpy(data, mt7996_gstrings_stats,
                       sizeof(mt7996_gstrings_stats));
 }