@@ -1434,6 +1434,11 @@ static int _dns_server_reply_https(struct dns_request *request, struct dns_serve
14341434 "Content-Length: %d\r\n"
14351435 "\r\n" ,
14361436 len );
1437+ if (http_len < 0 || http_len >= DNS_IN_PACKSIZE ) {
1438+ tlog (TLOG_ERROR , "http header size is invalid." );
1439+ return -1 ;
1440+ }
1441+
14371442 memcpy (inpacket + http_len , packet , len );
14381443 http_len += len ;
14391444
@@ -7681,6 +7686,15 @@ static int _dns_server_update_request_connection_timeout(struct dns_server_conn_
76817686 return 0 ;
76827687}
76837688
7689+ static void _dns_server_conn_head_init (struct dns_server_conn_head * conn , int fd , int type )
7690+ {
7691+ memset (conn , 0 , sizeof (* conn ));
7692+ conn -> fd = fd ;
7693+ conn -> type = type ;
7694+ atomic_set (& conn -> refcnt , 0 );
7695+ INIT_LIST_HEAD (& conn -> list );
7696+ }
7697+
76847698static int _dns_server_tcp_accept (struct dns_server_conn_tcp_server * tcpserver , struct epoll_event * event ,
76857699 unsigned long now )
76867700{
@@ -7701,15 +7715,12 @@ static int _dns_server_tcp_accept(struct dns_server_conn_tcp_server *tcpserver,
77017715 goto errout ;
77027716 }
77037717 memset (tcpclient , 0 , sizeof (* tcpclient ));
7704-
7705- tcpclient -> head .fd = fd ;
7706- tcpclient -> head .type = DNS_CONN_TYPE_TCP_CLIENT ;
7718+ _dns_server_conn_head_init (& tcpclient -> head , fd , DNS_CONN_TYPE_TCP_CLIENT );
77077719 tcpclient -> head .server_flags = tcpserver -> head .server_flags ;
77087720 tcpclient -> head .dns_group = tcpserver -> head .dns_group ;
77097721 tcpclient -> head .ipset_nftset_rule = tcpserver -> head .ipset_nftset_rule ;
77107722 tcpclient -> conn_idle_timeout = dns_conf .tcp_idle_time ;
77117723
7712- atomic_set (& tcpclient -> head .refcnt , 0 );
77137724 memcpy (& tcpclient -> addr , & addr , addr_len );
77147725 tcpclient -> addr_len = addr_len ;
77157726 tcpclient -> localaddr_len = sizeof (struct sockaddr_storage );
@@ -8062,7 +8073,7 @@ static int _dns_server_tcp_process_one_request(struct dns_server_conn_tcp_client
80628073 goto out ;
80638074 } else if (len == -3 ) {
80648075 tcpclient -> recvbuff .size = 0 ;
8065- tlog (TLOG_DEBUG , "recv buffer is not enough." );
8076+ tlog (TLOG_DEBUG , "recv buffer is not enough." );
80668077 goto errout ;
80678078 }
80688079
@@ -8313,6 +8324,7 @@ static int _dns_server_tls_accept(struct dns_server_conn_tls_server *tls_server,
83138324{
83148325 struct sockaddr_storage addr ;
83158326 struct dns_server_conn_tls_client * tls_client = NULL ;
8327+ DNS_CONN_TYPE conn_type ;
83168328 socklen_t addr_len = sizeof (addr );
83178329 int fd = -1 ;
83188330 SSL * ssl = NULL ;
@@ -8323,22 +8335,22 @@ static int _dns_server_tls_accept(struct dns_server_conn_tls_server *tls_server,
83238335 return -1 ;
83248336 }
83258337
8326- tls_client = malloc (sizeof (* tls_client ));
8327- if (tls_client == NULL ) {
8328- tlog (TLOG_ERROR , "malloc for tls_client failed." );
8329- goto errout ;
8330- }
8331- memset (tls_client , 0 , sizeof (* tls_client ));
8332-
8333- tls_client -> tcp .head .fd = fd ;
83348338 if (tls_server -> head .type == DNS_CONN_TYPE_TLS_SERVER ) {
8335- tls_client -> tcp . head . type = DNS_CONN_TYPE_TLS_CLIENT ;
8339+ conn_type = DNS_CONN_TYPE_TLS_CLIENT ;
83368340 } else if (tls_server -> head .type == DNS_CONN_TYPE_HTTPS_SERVER ) {
8337- tls_client -> tcp . head . type = DNS_CONN_TYPE_HTTPS_CLIENT ;
8341+ conn_type = DNS_CONN_TYPE_HTTPS_CLIENT ;
83388342 } else {
83398343 tlog (TLOG_ERROR , "invalid http server type." );
83408344 goto errout ;
83418345 }
8346+
8347+ tls_client = malloc (sizeof (* tls_client ));
8348+ if (tls_client == NULL ) {
8349+ tlog (TLOG_ERROR , "malloc for tls_client failed." );
8350+ goto errout ;
8351+ }
8352+ memset (tls_client , 0 , sizeof (* tls_client ));
8353+ _dns_server_conn_head_init (& tls_client -> tcp .head , fd , conn_type );
83428354 tls_client -> tcp .head .server_flags = tls_server -> head .server_flags ;
83438355 tls_client -> tcp .head .dns_group = tls_server -> head .dns_group ;
83448356 tls_client -> tcp .head .ipset_nftset_rule = tls_server -> head .ipset_nftset_rule ;
@@ -9087,19 +9099,18 @@ static int _dns_server_socket_udp(struct dns_bind_ip *bind_ip)
90879099 int fd = -1 ;
90889100
90899101 host_ip = bind_ip -> ip ;
9090- conn = malloc ( sizeof ( struct dns_server_conn_udp ) );
9091- if (conn == NULL ) {
9102+ fd = _dns_create_socket ( host_ip , SOCK_DGRAM );
9103+ if (fd <= 0 ) {
90929104 goto errout ;
90939105 }
9094- INIT_LIST_HEAD (& conn -> head .list );
90959106
9096- fd = _dns_create_socket ( host_ip , SOCK_DGRAM );
9097- if (fd <= 0 ) {
9107+ conn = malloc ( sizeof ( struct dns_server_conn_udp ) );
9108+ if (conn == NULL ) {
90989109 goto errout ;
90999110 }
9111+ memset (conn , 0 , sizeof (struct dns_server_conn_udp ));
91009112
9101- conn -> head .type = DNS_CONN_TYPE_UDP_SERVER ;
9102- conn -> head .fd = fd ;
9113+ _dns_server_conn_head_init (& conn -> head , fd , DNS_CONN_TYPE_UDP_SERVER );
91039114 _dns_server_set_flags (& conn -> head , bind_ip );
91049115 _dns_server_conn_get (& conn -> head );
91059116
@@ -9124,11 +9135,6 @@ static int _dns_server_socket_tcp(struct dns_bind_ip *bind_ip)
91249135 const int on = 1 ;
91259136
91269137 host_ip = bind_ip -> ip ;
9127- conn = malloc (sizeof (struct dns_server_conn_tcp_server ));
9128- if (conn == NULL ) {
9129- goto errout ;
9130- }
9131- INIT_LIST_HEAD (& conn -> head .list );
91329138
91339139 fd = _dns_create_socket (host_ip , SOCK_STREAM );
91349140 if (fd <= 0 ) {
@@ -9137,8 +9143,12 @@ static int _dns_server_socket_tcp(struct dns_bind_ip *bind_ip)
91379143
91389144 setsockopt (fd , SOL_TCP , TCP_FASTOPEN , & on , sizeof (on ));
91399145
9140- conn -> head .type = DNS_CONN_TYPE_TCP_SERVER ;
9141- conn -> head .fd = fd ;
9146+ conn = malloc (sizeof (struct dns_server_conn_tcp_server ));
9147+ if (conn == NULL ) {
9148+ goto errout ;
9149+ }
9150+ memset (conn , 0 , sizeof (struct dns_server_conn_tcp_server ));
9151+ _dns_server_conn_head_init (& conn -> head , fd , DNS_CONN_TYPE_TCP_SERVER );
91429152 _dns_server_set_flags (& conn -> head , bind_ip );
91439153 _dns_server_conn_get (& conn -> head );
91449154
@@ -9191,12 +9201,6 @@ static int _dns_server_socket_tls(struct dns_bind_ip *bind_ip, DNS_CONN_TYPE con
91919201 goto errout ;
91929202 }
91939203
9194- conn = malloc (sizeof (struct dns_server_conn_tls_server ));
9195- if (conn == NULL ) {
9196- goto errout ;
9197- }
9198- INIT_LIST_HEAD (& conn -> head .list );
9199-
92009204 fd = _dns_create_socket (host_ip , SOCK_STREAM );
92019205 if (fd <= 0 ) {
92029206 goto errout ;
@@ -9235,8 +9239,12 @@ static int _dns_server_socket_tls(struct dns_bind_ip *bind_ip, DNS_CONN_TYPE con
92359239 goto errout ;
92369240 }
92379241
9238- conn -> head .type = conn_type ;
9239- conn -> head .fd = fd ;
9242+ conn = malloc (sizeof (struct dns_server_conn_tls_server ));
9243+ if (conn == NULL ) {
9244+ goto errout ;
9245+ }
9246+ memset (conn , 0 , sizeof (struct dns_server_conn_tls_server ));
9247+ _dns_server_conn_head_init (& conn -> head , fd , conn_type );
92409248 conn -> ssl_ctx = ssl_ctx ;
92419249 _dns_server_set_flags (& conn -> head , bind_ip );
92429250 _dns_server_conn_get (& conn -> head );
0 commit comments