net: hns: fix ethtool_get_strings overflow in hns driver
authorTimmy Li <lixiaoping3@huawei.com>
Tue, 2 May 2017 02:46:52 +0000 (10:46 +0800)
committerDavid S. Miller <davem@davemloft.net>
Tue, 2 May 2017 19:08:21 +0000 (15:08 -0400)
hns_get_sset_count() returns HNS_NET_STATS_CNT and the data space allocated
is not enough for ethtool_get_strings(), which will cause random memory
corruption.

When SLAB and DEBUG_SLAB are both enabled, memory corruptions like the
the following can be observed without this patch:
[   43.115200] Slab corruption (Not tainted): Acpi-ParseExt start=ffff801fb0b69030, len=80
[   43.115206] Redzone: 0x9f911029d006462/0x5f78745f31657070.
[   43.115208] Last user: [<5f7272655f746b70>](0x5f7272655f746b70)
[   43.115214] 010: 70 70 65 31 5f 74 78 5f 70 6b 74 00 6b 6b 6b 6b  ppe1_tx_pkt.kkkk
[   43.115217] 030: 70 70 65 31 5f 74 78 5f 70 6b 74 5f 6f 6b 00 6b  ppe1_tx_pkt_ok.k
[   43.115218] Next obj: start=ffff801fb0b69098, len=80
[   43.115220] Redzone: 0x706d655f6f666966/0x9f911029d74e35b.
[   43.115229] Last user: [<ffff0000084b11b0>](acpi_os_release_object+0x28/0x38)
[   43.115231] 000: 74 79 00 6b 6b 6b 6b 6b 70 70 65 31 5f 74 78 5f  ty.kkkkkppe1_tx_
[   43.115232] 010: 70 6b 74 5f 65 72 72 5f 63 73 75 6d 5f 66 61 69  pkt_err_csum_fai

Signed-off-by: Timmy Li <lixiaoping3@huawei.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/hisilicon/hns/hns_dsaf_gmac.c
drivers/net/ethernet/hisilicon/hns/hns_dsaf_ppe.c
drivers/net/ethernet/hisilicon/hns/hns_dsaf_rcb.c
drivers/net/ethernet/hisilicon/hns/hns_dsaf_xgmac.c

index 74bd260ca02a887869a507f8746dfc928522d4be..86944bc3b273fd97232a60e68f25046e68042882 100644 (file)
@@ -666,7 +666,7 @@ static void hns_gmac_get_strings(u32 stringset, u8 *data)
 
 static int hns_gmac_get_sset_count(int stringset)
 {
-       if (stringset == ETH_SS_STATS)
+       if (stringset == ETH_SS_STATS || stringset == ETH_SS_PRIV_FLAGS)
                return ARRAY_SIZE(g_gmac_stats_string);
 
        return 0;
index 93e71e27401b4da815e899753dc7be1a83ff3f14..b62816c1574eb840f74a334b904f9fd993733116 100644 (file)
@@ -422,7 +422,7 @@ void hns_ppe_update_stats(struct hns_ppe_cb *ppe_cb)
 
 int hns_ppe_get_sset_count(int stringset)
 {
-       if (stringset == ETH_SS_STATS)
+       if (stringset == ETH_SS_STATS || stringset == ETH_SS_PRIV_FLAGS)
                return ETH_PPE_STATIC_NUM;
        return 0;
 }
index e2e28532e4dc2d03cf15330c621f8fb49469e382..6f3570cfb501604bea3f22d73374dd8dc28d756f 100644 (file)
@@ -876,7 +876,7 @@ void hns_rcb_get_stats(struct hnae_queue *queue, u64 *data)
  */
 int hns_rcb_get_ring_sset_count(int stringset)
 {
-       if (stringset == ETH_SS_STATS)
+       if (stringset == ETH_SS_STATS || stringset == ETH_SS_PRIV_FLAGS)
                return HNS_RING_STATIC_REG_NUM;
 
        return 0;
index 37a2fc35148f7f4201f529baa85563a56165114e..51e7e9f5af4992b3a21f3cbfd4d27bed06d092e0 100644 (file)
@@ -781,7 +781,7 @@ static void hns_xgmac_get_strings(u32 stringset, u8 *data)
  */
 static int hns_xgmac_get_sset_count(int stringset)
 {
-       if (stringset == ETH_SS_STATS)
+       if (stringset == ETH_SS_STATS || stringset == ETH_SS_PRIV_FLAGS)
                return ARRAY_SIZE(g_xgmac_stats_string);
 
        return 0;