[][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);