@@ -96,17 +96,17 @@ static int setinterface(int socket_fd, const char* interface_name)
9696}
9797#endif
9898
99- static char * hash_key (const char * header , const int header_len , const struct sockaddr * addr )
99+ static char * hash_key (const char * header , const int header_len , const struct sockaddr_storage * addr )
100100{
101101 char key [384 ];
102102
103103 // calculate hash key
104104 // assert header_len < 256
105105 memset (key , 0 , 384 );
106- memcpy (key , addr , sizeof (struct sockaddr ));
107- memcpy (key + sizeof (struct sockaddr ), header , header_len );
106+ memcpy (key , addr , sizeof (struct sockaddr_storage ));
107+ memcpy (key + sizeof (struct sockaddr_storage ), header , header_len );
108108
109- return (char * ) enc_md5 ((const uint8_t * )key , sizeof (struct sockaddr ) + header_len , NULL );
109+ return (char * ) enc_md5 ((const uint8_t * )key , sizeof (struct sockaddr_storage ) + header_len , NULL );
110110}
111111
112112static int parse_udprealy_header (const char * buf , const int buf_len , char * host , char * port )
@@ -218,39 +218,45 @@ int create_remote_socket(int ipv6)
218218 {
219219 // Try to bind IPv6 first
220220 struct sockaddr_in6 addr ;
221- memset (& addr , 0 , sizeof (struct sockaddr_in6 ));
221+ memset (& addr , 0 , sizeof (addr ));
222+ addr .sin6_len = sizeof (addr );
222223 addr .sin6_family = AF_INET6 ;
223224 addr .sin6_addr = in6addr_any ;
224- addr .sin6_port = htons ( 0 ) ;
225+ addr .sin6_port = 0 ;
225226 remote_sock = socket (AF_INET6 , SOCK_DGRAM , 0 );
226- if (remote_sock ! = -1 )
227+ if (remote_sock = = -1 )
227228 {
228- if (bind (remote_sock , (struct sockaddr * )& addr , sizeof (addr )) != -1 )
229- {
230- return remote_sock ;
231- }
229+ ERROR ("Cannot create socket." );
230+ return -1 ;
231+ }
232+ if (bind (remote_sock , (struct sockaddr * )& addr , sizeof (addr )) != 0 )
233+ {
234+ FATAL ("Cannot bind remote." );
235+ return -1 ;
232236 }
233237 }
234-
235- // Then bind to IPv4
236- struct sockaddr_in addr ;
237- memset (& addr , 0 , sizeof (addr ));
238- addr .sin_family = AF_INET ;
239- addr .sin_addr .s_addr = htonl (INADDR_ANY );
240- addr .sin_port = htons (0 );
241- remote_sock = socket (AF_INET , SOCK_DGRAM , 0 );
242- if (remote_sock == -1 )
238+ else
243239 {
244- ERROR ("Cannot create socket." );
245- return -1 ;
246- }
240+ // Or else bind to IPv4
241+ struct sockaddr_in addr ;
242+ memset (& addr , 0 , sizeof (addr ));
243+ addr .sin_len = sizeof (addr );
244+ addr .sin_family = AF_INET ;
245+ addr .sin_addr .s_addr = INADDR_ANY ;
246+ addr .sin_port = 0 ;
247+ remote_sock = socket (AF_INET , SOCK_DGRAM , 0 );
248+ if (remote_sock == -1 )
249+ {
250+ ERROR ("Cannot create socket." );
251+ return -1 ;
252+ }
247253
248- if (bind (remote_sock , (struct sockaddr * )& addr , sizeof (addr )) != 0 )
249- {
250- FATAL ("Cannot bind remote." );
251- return -1 ;
254+ if (bind (remote_sock , (struct sockaddr * )& addr , sizeof (addr )) != 0 )
255+ {
256+ FATAL ("Cannot bind remote." );
257+ return -1 ;
258+ }
252259 }
253-
254260 return remote_sock ;
255261}
256262
@@ -451,7 +457,7 @@ static void query_resolve_cb(EV_P_ ev_io *w, int revents)
451457
452458 struct remote_ctx * remote_ctx = new_remote (remotefd , query_ctx -> server_ctx );
453459 remote_ctx -> src_addr = query_ctx -> src_addr ;
454- remote_ctx -> dst_addr = * rp -> ai_addr ;
460+ remote_ctx -> dst_addr = * (( struct sockaddr_storage * ) rp -> ai_addr ) ;
455461 remote_ctx -> server_ctx = query_ctx -> server_ctx ;
456462 remote_ctx -> addr_header_len = query_ctx -> addr_header_len ;
457463 memcpy (remote_ctx -> addr_header , query_ctx -> addr_header , query_ctx -> addr_header_len );
@@ -463,7 +469,10 @@ static void query_resolve_cb(EV_P_ ev_io *w, int revents)
463469
464470 ev_io_start (EV_A_ & remote_ctx -> io );
465471
466- int s = sendto (remote_ctx -> fd , query_ctx -> buf , query_ctx -> buf_len , 0 , & remote_ctx -> dst_addr , sizeof (remote_ctx -> dst_addr ));
472+ size_t addr_len = sizeof (struct sockaddr_in );
473+ if (remote_ctx -> dst_addr .ss_family == AF_INET6 )
474+ addr_len = sizeof (struct sockaddr_in6 );
475+ int s = sendto (remote_ctx -> fd , query_ctx -> buf , query_ctx -> buf_len , 0 , (struct sockaddr * )& remote_ctx -> dst_addr , addr_len );
467476
468477 if (s == -1 )
469478 {
@@ -574,7 +583,10 @@ static void remote_recv_cb (EV_P_ ev_io *w, int revents)
574583 buf = ss_encrypt_all (BUF_SIZE , buf , & buf_len , server_ctx -> method );
575584#endif
576585
577- int s = sendto (server_ctx -> fd , buf , buf_len , 0 , & remote_ctx -> src_addr , sizeof (remote_ctx -> src_addr ));
586+ size_t addr_len = sizeof (struct sockaddr_in );
587+ if (remote_ctx -> src_addr .ss_family == AF_INET6 )
588+ addr_len = sizeof (struct sockaddr_in6 );
589+ int s = sendto (server_ctx -> fd , buf , buf_len , 0 , (struct sockaddr * )& remote_ctx -> src_addr , addr_len );
578590
579591 if (s == -1 )
580592 {
@@ -589,13 +601,13 @@ static void remote_recv_cb (EV_P_ ev_io *w, int revents)
589601static void server_recv_cb (EV_P_ ev_io * w , int revents )
590602{
591603 struct server_ctx * server_ctx = (struct server_ctx * )w ;
592- struct sockaddr src_addr ;
604+ struct sockaddr_storage src_addr ;
593605 char * buf = malloc (BUF_SIZE );
594606
595- socklen_t src_addr_len = sizeof (src_addr );
607+ socklen_t src_addr_len = sizeof (struct sockaddr_storage );
596608 unsigned int offset = 0 ;
597609
598- ssize_t buf_len = recvfrom (server_ctx -> fd , buf , BUF_SIZE , 0 , & src_addr , & src_addr_len );
610+ ssize_t buf_len = recvfrom (server_ctx -> fd , buf , BUF_SIZE , 0 , ( struct sockaddr * ) & src_addr , & src_addr_len );
599611
600612 if (buf_len == -1 )
601613 {
@@ -727,14 +739,14 @@ static void server_recv_cb (EV_P_ ev_io *w, int revents)
727739 {
728740 if (verbose )
729741 {
730- LOGD ("[udp] cache missed: %s:%s <-> %s" , host , port , get_addr_str (& src_addr ));
742+ LOGD ("[udp] cache missed: %s:%s <-> %s" , host , port , get_addr_str (( struct sockaddr * ) & src_addr ));
731743 }
732744 }
733745 else
734746 {
735747 if (verbose )
736748 {
737- LOGD ("[udp] cache hit: %s:%s <-> %s" , host , port , get_addr_str (& src_addr ));
749+ LOGD ("[udp] cache hit: %s:%s <-> %s" , host , port , get_addr_str (( struct sockaddr * ) & src_addr ));
738750 }
739751 }
740752
@@ -788,7 +800,7 @@ static void server_recv_cb (EV_P_ ev_io *w, int revents)
788800 // Init remote_ctx
789801 remote_ctx = new_remote (remotefd , server_ctx );
790802 remote_ctx -> src_addr = src_addr ;
791- remote_ctx -> dst_addr = * result -> ai_addr ;
803+ remote_ctx -> dst_addr = * (( struct sockaddr_storage * ) result -> ai_addr ) ;
792804 remote_ctx -> addr_header_len = addr_header_len ;
793805 memcpy (remote_ctx -> addr_header , addr_header , addr_header_len );
794806
@@ -810,7 +822,10 @@ static void server_recv_cb (EV_P_ ev_io *w, int revents)
810822
811823 buf = ss_encrypt_all (BUF_SIZE , buf , & buf_len , server_ctx -> method );
812824
813- int s = sendto (remote_ctx -> fd , buf , buf_len , 0 , & remote_ctx -> dst_addr , sizeof (remote_ctx -> dst_addr ));
825+ size_t addr_len = sizeof (struct sockaddr_in );
826+ if (remote_ctx -> dst_addr .ss_family == AF_INET6 )
827+ addr_len = sizeof (struct sockaddr_in6 );
828+ int s = sendto (remote_ctx -> fd , buf , buf_len , 0 , (struct sockaddr * )& remote_ctx -> dst_addr , addr_len );
814829
815830 if (s == -1 )
816831 {
@@ -846,8 +861,11 @@ static void server_recv_cb (EV_P_ ev_io *w, int revents)
846861 }
847862 else
848863 {
864+ size_t addr_len = sizeof (struct sockaddr_in );
865+ if (remote_ctx -> dst_addr .ss_family == AF_INET6 )
866+ addr_len = sizeof (struct sockaddr_in6 );
849867 int s = sendto (remote_ctx -> fd , buf + addr_header_len ,
850- buf_len - addr_header_len , 0 , & remote_ctx -> dst_addr , sizeof ( remote_ctx -> dst_addr ) );
868+ buf_len - addr_header_len , 0 , ( struct sockaddr * ) & remote_ctx -> dst_addr , addr_len );
851869
852870 if (s == -1 )
853871 {
0 commit comments