[][Fix coverity check errors for Eth/HNAT driver]
[Description]
Fix coverity check errors for Eth/HNAT driver.
(145 errors corrected)
[Release-log]
N/A
Change-Id: I1f9839918a6bf93c6af4efb07acb82c89b4d8ea2
Reviewed-on: https://gerrit.mediatek.inc/c/openwrt/feeds/mtk_openwrt_feeds/+/5264218
diff --git a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_eth_dbg.c b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_eth_dbg.c
index e2bf16f..574440d 100755
--- a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_eth_dbg.c
+++ b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_eth_dbg.c
@@ -1220,12 +1220,11 @@
char *p_token = NULL;
char *p_delimiter = " \t";
long x = 0, y = 0;
- int len = count;
+ u32 len = count;
int ret;
if (len >= sizeof(buf)) {
pr_info("Input handling fail!\n");
- len = sizeof(buf) - 1;
return -1;
}
diff --git a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_eth_soc.c
index d204cc8..658f1ab 100755
--- a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_eth_soc.c
+++ b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_eth_soc.c
@@ -3393,6 +3393,8 @@
if(eth->soc->has_sram) {
struct resource *res;
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ if (unlikely(!res))
+ return -EINVAL;
eth->phy_scratch_ring = res->start + MTK_ETH_SRAM_OFFSET;
}
diff --git a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat.c b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat.c
index 5646a3a..c10e7ed 100644
--- a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat.c
+++ b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat.c
@@ -285,12 +285,15 @@
pr_info("hnat roaming work disable\n");
}
-static int hnat_start(int ppe_id)
+static int hnat_start(u32 ppe_id)
{
u32 foe_table_sz;
u32 foe_mib_tb_sz;
int etry_num_cfg;
+ if (ppe_id >= CFG_PPE_NUM)
+ return -EINVAL;
+
/* mapp the FOE table */
for (etry_num_cfg = DEF_ETRY_NUM_CFG ; etry_num_cfg >= 0 ; etry_num_cfg--, hnat_priv->foe_etry_num /= 2) {
foe_table_sz = hnat_priv->foe_etry_num * sizeof(struct foe_entry);
@@ -409,11 +412,14 @@
return 0;
}
-static int ppe_busy_wait(int ppe_id)
+static int ppe_busy_wait(u32 ppe_id)
{
unsigned long t_start = jiffies;
u32 r = 0;
+ if (ppe_id >= CFG_PPE_NUM)
+ return -EINVAL;
+
while (1) {
r = readl((hnat_priv->ppe_base[ppe_id] + 0x0));
if (!(r & BIT(31)))
@@ -428,13 +434,16 @@
return -1;
}
-static void hnat_stop(int ppe_id)
+static void hnat_stop(u32 ppe_id)
{
u32 foe_table_sz;
u32 foe_mib_tb_sz;
struct foe_entry *entry, *end;
u32 r1 = 0, r2 = 0;
+ if (ppe_id >= CFG_PPE_NUM)
+ return;
+
/* send all traffic back to the DMA engine */
set_gmac_ppe_fwd(0, 0);
set_gmac_ppe_fwd(1, 0);
@@ -617,6 +626,9 @@
hnat_priv->foe_etry_num = DEF_ETRY_NUM;
match = of_match_device(of_hnat_match, &pdev->dev);
+ if (unlikely(!match))
+ return -EINVAL;
+
hnat_priv->data = (struct mtk_hnat_data *)match->data;
hnat_priv->dev = &pdev->dev;
@@ -626,21 +638,21 @@
if (err < 0)
return -EINVAL;
- strncpy(hnat_priv->wan, (char *)name, IFNAMSIZ);
+ strncpy(hnat_priv->wan, (char *)name, IFNAMSIZ - 1);
dev_info(&pdev->dev, "wan = %s\n", hnat_priv->wan);
err = of_property_read_string(np, "mtketh-lan", &name);
if (err < 0)
strncpy(hnat_priv->lan, "eth0", IFNAMSIZ);
else
- strncpy(hnat_priv->lan, (char *)name, IFNAMSIZ);
+ strncpy(hnat_priv->lan, (char *)name, IFNAMSIZ - 1);
dev_info(&pdev->dev, "lan = %s\n", hnat_priv->lan);
err = of_property_read_string(np, "mtketh-ppd", &name);
if (err < 0)
strncpy(hnat_priv->ppd, "eth0", IFNAMSIZ);
else
- strncpy(hnat_priv->ppd, (char *)name, IFNAMSIZ);
+ strncpy(hnat_priv->ppd, (char *)name, IFNAMSIZ - 1);
dev_info(&pdev->dev, "ppd = %s\n", hnat_priv->ppd);
/*get total gmac num in hnat*/
@@ -701,7 +713,7 @@
err = -ENOMEM;
goto err_out1;
}
- strncpy(ext_entry->name, (char *)name, IFNAMSIZ);
+ strncpy(ext_entry->name, (char *)name, IFNAMSIZ - 1);
ext_if_add(ext_entry);
}
diff --git a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat.h b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat.h
index 19482e5..ce5af47 100644
--- a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat.h
+++ b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat.h
@@ -941,10 +941,10 @@
int hnat_disable_hook(void);
void hnat_cache_ebl(int enable);
void set_gmac_ppe_fwd(int gmac_no, int enable);
-int entry_detail(int ppe_id, int index);
+int entry_detail(u32 ppe_id, int index);
int entry_delete_by_mac(u8 *mac);
-int entry_delete(int ppe_id, int index);
-struct hnat_accounting *hnat_get_count(struct mtk_hnat *h, int ppe_id,
+int entry_delete(u32 ppe_id, int index);
+struct hnat_accounting *hnat_get_count(struct mtk_hnat *h, u32 ppe_id,
u32 index, struct hnat_accounting *diff);
static inline u16 foe_timestamp(struct mtk_hnat *h)
diff --git a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat_debugfs.c b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat_debugfs.c
index 4b9006a..4a95c10 100644
--- a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat_debugfs.c
+++ b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat_debugfs.c
@@ -332,7 +332,7 @@
return 0;
}
-int entry_detail(int ppe_id, int index)
+int entry_detail(u32 ppe_id, int index)
{
struct foe_entry *entry;
struct mtk_hnat *h = hnat_priv;
@@ -525,7 +525,7 @@
return 0;
}
-int entry_delete(int ppe_id, int index)
+int entry_delete(u32 ppe_id, int index)
{
struct foe_entry *entry;
struct mtk_hnat *h = hnat_priv;
@@ -703,11 +703,15 @@
[6] = udp_keep_alive, [7] = set_nf_update_toggle,
};
-int read_mib(struct mtk_hnat *h, int ppe_id,
+int read_mib(struct mtk_hnat *h, u32 ppe_id,
u32 index, u64 *bytes, u64 *packets)
{
int ret;
u32 val, cnt_r0, cnt_r1, cnt_r2;
+
+ if (ppe_id >= CFG_PPE_NUM)
+ return -EINVAL;
+
writel(index | (1 << 16), h->ppe_base[ppe_id] + PPE_MIB_SER_CR);
ret = readx_poll_timeout_atomic(readl, h->ppe_base[ppe_id] + PPE_MIB_SER_CR, val,
!(val & BIT_MIB_BUSY), 20, 10000);
@@ -726,12 +730,15 @@
}
-struct hnat_accounting *hnat_get_count(struct mtk_hnat *h, int ppe_id,
+struct hnat_accounting *hnat_get_count(struct mtk_hnat *h, u32 ppe_id,
u32 index, struct hnat_accounting *diff)
{
u64 bytes, packets;
+ if (ppe_id >= CFG_PPE_NUM)
+ return NULL;
+
if (!hnat_priv->data->per_flow_accounting)
return NULL;
@@ -753,7 +760,7 @@
#define PRINT_COUNT(m, acct) {if (acct) \
seq_printf(m, "bytes=%llu|packets=%llu|", \
acct->bytes, acct->packets); }
-static int __hnat_debug_show(struct seq_file *m, void *private, int ppe_id)
+static int __hnat_debug_show(struct seq_file *m, void *private, u32 ppe_id)
{
struct mtk_hnat *h = hnat_priv;
struct foe_entry *entry, *end;
@@ -762,6 +769,9 @@
struct hnat_accounting *acct;
u32 entry_index = 0;
+ if (ppe_id >= CFG_PPE_NUM)
+ return -EINVAL;
+
entry = h->foe_table_cpu[ppe_id];
end = h->foe_table_cpu[ppe_id] + hnat_priv->foe_etry_num;
while (entry < end) {
@@ -1092,7 +1102,7 @@
{
char buf[32];
char *p_buf;
- int len = count;
+ u32 len = count;
long arg0 = 0, arg1 = 0;
char *p_token = NULL;
char *p_delimiter = " \t";
@@ -1100,7 +1110,6 @@
if (len >= sizeof(buf)) {
pr_info("input handling fail!\n");
- len = sizeof(buf) - 1;
return -1;
}
@@ -1237,13 +1246,16 @@
}
}
-int __hnat_entry_read(struct seq_file *m, void *private, int ppe_id)
+int __hnat_entry_read(struct seq_file *m, void *private, u32 ppe_id)
{
struct mtk_hnat *h = hnat_priv;
struct foe_entry *entry, *end;
int hash_index;
int cnt;
+ if (ppe_id >= CFG_PPE_NUM)
+ return -EINVAL;
+
hash_index = 0;
cnt = 0;
entry = h->foe_table_cpu[ppe_id];
@@ -1286,7 +1298,7 @@
{
char buf[32];
char *p_buf;
- int len = count;
+ u32 len = count;
long arg0 = 0, arg1 = 0;
char *p_token = NULL;
char *p_delimiter = " \t";
@@ -1294,7 +1306,6 @@
if (len >= sizeof(buf)) {
pr_info("input handling fail!\n");
- len = sizeof(buf) - 1;
return -1;
}
@@ -1348,12 +1359,15 @@
.release = single_release,
};
-int __hnat_setting_read(struct seq_file *m, void *private, int ppe_id)
+int __hnat_setting_read(struct seq_file *m, void *private, u32 ppe_id)
{
struct mtk_hnat *h = hnat_priv;
int i;
int cr_max;
+ if (ppe_id >= CFG_PPE_NUM)
+ return -EINVAL;
+
cr_max = 319 * 4;
for (i = 0; i < cr_max; i = i + 0x10) {
pr_info("0x%p : 0x%08x 0x%08x 0x%08x 0x%08x\n",
@@ -1387,7 +1401,7 @@
{
char buf[32];
char *p_buf;
- int len = count;
+ u32 len = count;
long arg0 = 0, arg1 = 0;
char *p_token = NULL;
char *p_delimiter = " \t";
@@ -1395,7 +1409,6 @@
if (len >= sizeof(buf)) {
pr_info("input handling fail!\n");
- len = sizeof(buf) - 1;
return -1;
}
@@ -1446,7 +1459,7 @@
.release = single_release,
};
-int __mcast_table_dump(struct seq_file *m, void *private, int ppe_id)
+int __mcast_table_dump(struct seq_file *m, void *private, u32 ppe_id)
{
struct mtk_hnat *h = hnat_priv;
struct ppe_mcast_h mcast_h;
@@ -1454,6 +1467,9 @@
u8 i, max;
void __iomem *reg;
+ if (ppe_id >= CFG_PPE_NUM)
+ return -EINVAL;
+
if (!h->pmcast)
return 0;
@@ -1607,7 +1623,7 @@
{
long id = (long)file->private_data;
struct mtk_hnat *h = hnat_priv;
- char line[64];
+ char line[64] = {0};
int enable, rate, exp = 0, shift = 0;
char scheduling[32];
size_t size;
@@ -1751,7 +1767,7 @@
{
long id = (long)file->private_data;
struct mtk_hnat *h = hnat_priv;
- char line[64];
+ char line[64] = {0};
int max_enable, max_rate, max_exp = 0;
int min_enable, min_rate, min_exp = 0;
int weight;
@@ -1842,7 +1858,7 @@
dev_put(hnat_priv->g_ppdev);
hnat_priv->g_ppdev = dev;
- strncpy(hnat_priv->ppd, p, IFNAMSIZ);
+ strncpy(hnat_priv->ppd, p, IFNAMSIZ - 1);
pr_info("hnat_priv ppd = %s\n", hnat_priv->ppd);
} else {
pr_info("no such device!\n");
@@ -1893,7 +1909,7 @@
static ssize_t hnat_mape_toggle_write(struct file *file, const char __user *buffer,
size_t count, loff_t *data)
{
- char buf;
+ char buf = 0;
int len = count;
if (copy_from_user(&buf, buffer, len))
@@ -1933,7 +1949,7 @@
static ssize_t hnat_hook_toggle_write(struct file *file, const char __user *buffer,
size_t count, loff_t *data)
{
- char buf[8];
+ char buf[8] = {0};
int len = count;
if ((len > 8) || copy_from_user(buf, buffer, len))
@@ -2020,14 +2036,14 @@
.release = single_release,
};
-int get_ppe_mib(int ppe_id, int index, u64 *pkt_cnt, u64 *byte_cnt)
+int get_ppe_mib(u32 ppe_id, int index, u64 *pkt_cnt, u64 *byte_cnt)
{
struct mtk_hnat *h = hnat_priv;
struct hnat_accounting *acct;
struct foe_entry *entry;
if (ppe_id >= CFG_PPE_NUM)
- return -1;
+ return -EINVAL;
if (index < 0 || index >= h->foe_etry_num) {
pr_info("Invalid entry index\n");
@@ -2050,13 +2066,13 @@
}
EXPORT_SYMBOL(get_ppe_mib);
-int is_entry_binding(int ppe_id, int index)
+int is_entry_binding(u32 ppe_id, int index)
{
struct mtk_hnat *h = hnat_priv;
struct foe_entry *entry;
if (ppe_id >= CFG_PPE_NUM)
- return -1;
+ return -EINVAL;
if (index < 0 || index >= h->foe_etry_num) {
pr_info("Invalid entry index\n");
@@ -2192,7 +2208,11 @@
void hnat_deinit_debugfs(struct mtk_hnat *h)
{
+ int i;
+
debugfs_remove_recursive(h->root);
h->root = NULL;
- kfree(h->regset);
+
+ for (i = 0; i < CFG_PPE_NUM; i++)
+ kfree(h->regset[i]);
}
diff --git a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat_mcast.c b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat_mcast.c
index d11dfcd..512c845 100644
--- a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat_mcast.c
+++ b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat_mcast.c
@@ -61,7 +61,7 @@
}
/*set_hnat_mtbl - set ppe multicast register*/
-static int set_hnat_mtbl(struct ppe_mcast_group *group, int ppe_id, int index)
+static int set_hnat_mtbl(struct ppe_mcast_group *group, u32 ppe_id, int index)
{
struct ppe_mcast_h mcast_h;
struct ppe_mcast_l mcast_l;
@@ -70,6 +70,9 @@
u8 mc_port = group->mc_port;
void __iomem *reg;
+ if (ppe_id >= CFG_PPE_NUM)
+ return -EINVAL;
+
mcast_h.u.value = 0;
mcast_l.addr = 0;
if (mac_lo == 0x0100)
@@ -110,8 +113,8 @@
static int hnat_mcast_table_update(int type, struct br_mdb_entry *entry)
{
struct net_device *dev;
- u32 mac_hi;
- u16 mac_lo;
+ u32 mac_hi = 0;
+ u16 mac_lo = 0;
int i, index;
struct ppe_mcast_group *group;
@@ -275,13 +278,16 @@
mod_timer(&hnat_priv->hnat_mcast_check_timer, jiffies + 10 * HZ);
}
-int hnat_mcast_enable(int ppe_id)
+int hnat_mcast_enable(u32 ppe_id)
{
struct ppe_mcast_table *pmcast;
+ if (ppe_id >= CFG_PPE_NUM)
+ return -EINVAL;
+
pmcast = kzalloc(sizeof(*pmcast), GFP_KERNEL);
if (!pmcast)
- goto err;
+ return -1;
if (hnat_priv->data->version == MTK_HNAT_V1)
pmcast->max_entry = 0x10;
@@ -332,19 +338,17 @@
int hnat_mcast_disable(void)
{
struct ppe_mcast_table *pmcast = hnat_priv->pmcast;
- struct socket *sock = pmcast->msock;
- struct workqueue_struct *queue = pmcast->queue;
- struct work_struct *work = &pmcast->work;
+
+ if (!pmcast)
+ return -EINVAL;
if (hnat_priv->data->version == MTK_HNAT_V3)
del_timer_sync(&hnat_priv->hnat_mcast_check_timer);
- if (pmcast) {
- flush_work(work);
- destroy_workqueue(queue);
- sock_release(sock);
- kfree(pmcast);
- }
+ flush_work(&pmcast->work);
+ destroy_workqueue(pmcast->queue);
+ sock_release(pmcast->msock);
+ kfree(pmcast);
return 0;
}
diff --git a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat_mcast.h b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat_mcast.h
index f6993a5..ad5b5d1 100644
--- a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat_mcast.h
+++ b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat_mcast.h
@@ -63,7 +63,7 @@
u32 addr;
};
-int hnat_mcast_enable(int ppe_id);
+int hnat_mcast_enable(u32 ppe_id);
int hnat_mcast_disable(void);
#endif
diff --git a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat_nf_hook.c b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat_nf_hook.c
index c36ee98..fe81bf3 100644
--- a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat_nf_hook.c
+++ b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat_nf_hook.c
@@ -161,7 +161,9 @@
{
int len = get_ext_device_number();
- hnat_priv->ext_if[len++] = ext_entry;
+ if (len < MAX_EXT_DEVS)
+ hnat_priv->ext_if[len++] = ext_entry;
+
return len;
}
@@ -611,6 +613,9 @@
/* WAN -> LAN/WLAN MapE. */
if (mape_toggle && (ip6h->nexthdr == NEXTHDR_IPIP)) {
iph = skb_header_pointer(skb, IPV6_HDR_LEN, sizeof(_iphdr), &_iphdr);
+ if (unlikely(!iph))
+ return -1;
+
switch (iph->protocol) {
case IPPROTO_UDP:
case IPPROTO_TCP:
@@ -682,6 +687,8 @@
} else if (ip6h->nexthdr == NEXTHDR_IPIP) {
iph = skb_header_pointer(skb, IPV6_HDR_LEN,
sizeof(_iphdr), &_iphdr);
+ if (unlikely(!iph))
+ return 0;
if ((iph->protocol == IPPROTO_TCP) ||
(iph->protocol == IPPROTO_UDP)) {
@@ -1139,6 +1146,8 @@
iph->ihl * 4,
sizeof(_ports),
&_ports);
+ if (unlikely(!pptr))
+ return -1;
entry.ipv4_dslite.new_sip =
ntohl(iph->saddr);
@@ -1205,6 +1214,9 @@
pptr = skb_header_pointer(skb, iph->ihl * 4,
sizeof(_ports),
&_ports);
+ if (unlikely(!pptr))
+ return -1;
+
entry.ipv4_hnapt.new_sport = ntohs(pptr->src);
entry.ipv4_hnapt.new_dport = ntohs(pptr->dst);
}
@@ -1384,7 +1396,6 @@
break;
default:
- ip6h = ipv6_hdr(skb);
iph = ip_hdr(skb);
switch (entry.bfib1.pkt_type) {
case IPV6_6RD: /* 6RD LAN->WAN */
@@ -1800,7 +1811,7 @@
if (!ext_entry)
return;
- strncpy(ext_entry->name, dev->name, IFNAMSIZ);
+ strncpy(ext_entry->name, dev->name, IFNAMSIZ - 1);
dev_hold(dev);
ext_entry->dev = dev;
ext_if_add(ext_entry);
@@ -2011,6 +2022,9 @@
if (mape_toggle) {
iph = skb_header_pointer(skb, IPV6_HDR_LEN,
sizeof(_iphdr), &_iphdr);
+ if (unlikely(!iph))
+ return NF_ACCEPT;
+
switch (iph->protocol) {
case IPPROTO_UDP:
udp = 1;
@@ -2023,6 +2037,9 @@
pptr = skb_header_pointer(skb, IPV6_HDR_LEN + iph->ihl * 4,
sizeof(_ports), &_ports);
+ if (unlikely(!pptr))
+ return NF_ACCEPT;
+
entry->bfib1.udp = udp;
#if defined(CONFIG_MEDIATEK_NETSYS_V2)
@@ -2268,9 +2285,6 @@
struct nf_hook_ops *hook = mtk_hnat_nf_ops;
unsigned int n = ARRAY_SIZE(mtk_hnat_nf_ops);
- if (!hook)
- return -1;
-
while (n-- > 0) {
if (hook[n].hook == mtk_hnat_br_nf_local_in) {
hook[n].hooknum = NF_BR_PRE_ROUTING;
diff --git a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat_stag.c b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat_stag.c
index aa40d99..6e96429 100644
--- a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat_stag.c
+++ b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat_stag.c
@@ -25,6 +25,9 @@
ndev = netdev;
port_reg = of_get_property(ndev->dev.of_node, "reg", NULL);
+ if (unlikely(!port_reg))
+ return;
+
port_index = be32_to_cpup(port_reg);
sp_tag = BIT(port_index);