1195972f6Sopenharmony_ciFrom b4a2b2799c199fb2955ecaae72e7b7dbe79e593b Mon Sep 17 00:00:00 2001
2195972f6Sopenharmony_ciFrom: jiangheng <jiangheng14@huawei.com>
3195972f6Sopenharmony_ciDate: Thu, 15 Jun 2023 21:42:04 +0800
4195972f6Sopenharmony_ciSubject: [PATCH] fix null pointer when all zero address listen
5195972f6Sopenharmony_ci
6195972f6Sopenharmony_ci---
7195972f6Sopenharmony_ci src/core/tcp_in.c | 58 ++++++++++++++++++++++++++++-------------------
8195972f6Sopenharmony_ci 1 file changed, 35 insertions(+), 23 deletions(-)
9195972f6Sopenharmony_ci
10195972f6Sopenharmony_cidiff --git a/src/core/tcp_in.c b/src/core/tcp_in.c
11195972f6Sopenharmony_ciindex 0abee30..c20c9b5 100644
12195972f6Sopenharmony_ci--- a/src/core/tcp_in.c
13195972f6Sopenharmony_ci+++ b/src/core/tcp_in.c
14195972f6Sopenharmony_ci@@ -114,6 +114,36 @@ static void tcp_remove_sacks_gt(struct tcp_pcb *pcb, u32_t seq);
15195972f6Sopenharmony_ci #endif /* TCP_OOSEQ_BYTES_LIMIT || TCP_OOSEQ_PBUFS_LIMIT */
16195972f6Sopenharmony_ci #endif /* LWIP_TCP_SACK_OUT */
17195972f6Sopenharmony_ci 
18195972f6Sopenharmony_ci+#if GAZELLE_TCP_REUSE_IPPORT
19195972f6Sopenharmony_ci+struct tcp_pcb_listen *min_cnts_lpcb_get(struct tcp_pcb_listen *lpcb)
20195972f6Sopenharmony_ci+{
21195972f6Sopenharmony_ci+  struct tcp_pcb_listen *min_cnts_lpcb;
22195972f6Sopenharmony_ci+  struct tcp_pcb_listen *tmp_lpcb = lpcb;
23195972f6Sopenharmony_ci+  u16_t min_conn_num = GAZELLE_TCP_MAX_CONN_PER_THREAD;
24195972f6Sopenharmony_ci+  u8_t have_master_fd = 0;
25195972f6Sopenharmony_ci+
26195972f6Sopenharmony_ci+  while (tmp_lpcb != NULL) {
27195972f6Sopenharmony_ci+    if (tmp_lpcb->master_lpcb) {
28195972f6Sopenharmony_ci+      have_master_fd = 1;
29195972f6Sopenharmony_ci+    }
30195972f6Sopenharmony_ci+    tmp_lpcb = tmp_lpcb->next_same_port_pcb;
31195972f6Sopenharmony_ci+  }
32195972f6Sopenharmony_ci+
33195972f6Sopenharmony_ci+  tmp_lpcb = lpcb;
34195972f6Sopenharmony_ci+  min_cnts_lpcb = lpcb;
35195972f6Sopenharmony_ci+  while (tmp_lpcb != NULL) {
36195972f6Sopenharmony_ci+    if (!have_master_fd || tmp_lpcb->master_lpcb) {
37195972f6Sopenharmony_ci+      if (tmp_lpcb->connect_num < min_conn_num) {
38195972f6Sopenharmony_ci+        min_cnts_lpcb = tmp_lpcb;
39195972f6Sopenharmony_ci+        min_conn_num = tmp_lpcb->connect_num;
40195972f6Sopenharmony_ci+      }
41195972f6Sopenharmony_ci+      tmp_lpcb = tmp_lpcb->next_same_port_pcb;
42195972f6Sopenharmony_ci+    }
43195972f6Sopenharmony_ci+  }
44195972f6Sopenharmony_ci+  return min_cnts_lpcb;
45195972f6Sopenharmony_ci+}
46195972f6Sopenharmony_ci+#endif
47195972f6Sopenharmony_ci+
48195972f6Sopenharmony_ci /**
49195972f6Sopenharmony_ci  * The initial input processing of TCP. It verifies the TCP header, demultiplexes
50195972f6Sopenharmony_ci  * the segment between the PCBs and passes it on to tcp_process(), which implements
51195972f6Sopenharmony_ci@@ -384,33 +414,15 @@ tcp_input(struct pbuf *p, struct netif *inp)
52195972f6Sopenharmony_ci           if (ip_addr_cmp(&lpcb->local_ip, ip_current_dest_addr())) {
53195972f6Sopenharmony_ci             /* found an exact match */
54195972f6Sopenharmony_ci #if GAZELLE_TCP_REUSE_IPPORT
55195972f6Sopenharmony_ci-            // check master fd
56195972f6Sopenharmony_ci-            struct tcp_pcb_listen *tmp_lpcb = lpcb;
57195972f6Sopenharmony_ci-            u8_t have_master_fd = 0;
58195972f6Sopenharmony_ci-            while (tmp_lpcb != NULL) {
59195972f6Sopenharmony_ci-              if (tmp_lpcb->master_lpcb) {
60195972f6Sopenharmony_ci-	        have_master_fd = 1;
61195972f6Sopenharmony_ci-	      }
62195972f6Sopenharmony_ci-              tmp_lpcb = tmp_lpcb->next_same_port_pcb;
63195972f6Sopenharmony_ci-	    }
64195972f6Sopenharmony_ci-
65195972f6Sopenharmony_ci-            tmp_lpcb = lpcb;
66195972f6Sopenharmony_ci-            min_cnts_lpcb = lpcb;
67195972f6Sopenharmony_ci-            u16_t min_conn_num = GAZELLE_TCP_MAX_CONN_PER_THREAD;
68195972f6Sopenharmony_ci-            while (tmp_lpcb != NULL) {
69195972f6Sopenharmony_ci-              if (!have_master_fd || tmp_lpcb->master_lpcb) {
70195972f6Sopenharmony_ci-                if (tmp_lpcb->connect_num < min_conn_num) {
71195972f6Sopenharmony_ci-                  min_cnts_lpcb = tmp_lpcb;
72195972f6Sopenharmony_ci-		  min_conn_num = tmp_lpcb->connect_num;
73195972f6Sopenharmony_ci-	        }
74195972f6Sopenharmony_ci-	      }
75195972f6Sopenharmony_ci-              tmp_lpcb = tmp_lpcb->next_same_port_pcb;
76195972f6Sopenharmony_ci-	    }
77195972f6Sopenharmony_ci+            min_cnts_lpcb = min_cnts_lpcb_get(lpcb);
78195972f6Sopenharmony_ci #endif
79195972f6Sopenharmony_ci             break;
80195972f6Sopenharmony_ci           } else if (ip_addr_isany(&lpcb->local_ip)) {
81195972f6Sopenharmony_ci             /* found an ANY-match */
82195972f6Sopenharmony_ci #if SO_REUSE
83195972f6Sopenharmony_ci+#if GAZELLE_TCP_REUSE_IPPORT
84195972f6Sopenharmony_ci+            min_cnts_lpcb = min_cnts_lpcb_get(lpcb);
85195972f6Sopenharmony_ci+#endif
86195972f6Sopenharmony_ci             lpcb_any = lpcb;
87195972f6Sopenharmony_ci             lpcb_prev = prev;
88195972f6Sopenharmony_ci #else /* SO_REUSE */
89195972f6Sopenharmony_ci@@ -458,7 +470,7 @@ tcp_input(struct pbuf *p, struct netif *inp)
90195972f6Sopenharmony_ci       {
91195972f6Sopenharmony_ci #if GAZELLE_TCP_REUSE_IPPORT
92195972f6Sopenharmony_ci         tcp_listen_input(min_cnts_lpcb);
93195972f6Sopenharmony_ci-	min_cnts_lpcb->connect_num++;
94195972f6Sopenharmony_ci+        min_cnts_lpcb->connect_num++;
95195972f6Sopenharmony_ci #else
96195972f6Sopenharmony_ci         tcp_listen_input(lpcb);
97195972f6Sopenharmony_ci #endif
98195972f6Sopenharmony_ci-- 
99195972f6Sopenharmony_ci2.27.0
100195972f6Sopenharmony_ci
101