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