2
0
Эх сурвалжийг харах

Stack corrupted on mipsbig BugFix

Nick Peng 6 жил өмнө
parent
commit
c3ac0c2f17

+ 8 - 0
package/optware/smartdns-opt.conf

@@ -0,0 +1,8 @@
+# workmode 
+# 0: run as port only
+# 1: redirect port
+# 2: replace 
+SMARTDNS_WORKMODE="1"
+
+# smartdns port
+SMARTDNS_PORT="535"

+ 29 - 6
src/dns_client.c

@@ -1039,6 +1039,11 @@ static int _dns_client_socket_ssl_recv(SSL *ssl, void *buf, int num)
 	int ssl_ret = 0;
 	unsigned long ssl_err = 0;
 
+	if (ssl == NULL) {
+		errno = EFAULT;
+		return -1;
+	}
+
 	ret = SSL_read(ssl, buf, num);
 	if (ret >= 0) {
 		return ret;
@@ -1470,9 +1475,14 @@ static int _dns_client_send_data_to_buffer(struct dns_server_info *server_info,
 static int _dns_client_send_tcp(struct dns_server_info *server_info, void *packet, unsigned short len)
 {
 	int send_len = 0;
-	unsigned char inpacket_data[DNS_IN_PACKSIZE];
+	unsigned char inpacket_data[DNS_IN_PACKSIZE * 2];
 	unsigned char *inpacket = inpacket_data;
 
+	if (len > sizeof(inpacket_data) -2 ) {
+		tlog(TLOG_ERROR, "packet size is invalid.");
+		return -1;
+	}
+
 	/* TCP query format
 	 * | len (short) | dns query data |
 	 */
@@ -1484,14 +1494,18 @@ static int _dns_client_send_tcp(struct dns_server_info *server_info, void *packe
 		return _dns_client_send_data_to_buffer(server_info, inpacket, len);
 	}
 
+	if (server_info->fd <= 0) {
+		return -1;
+	}
+
 	send_len = send(server_info->fd, inpacket, len, MSG_NOSIGNAL);
 	if (send_len < 0) {
 		if (errno == EAGAIN) {
 			/* save data to buffer, and retry when EPOLLOUT is available */
 			return _dns_client_send_data_to_buffer(server_info, inpacket, len);
+		} else if (errno == EPIPE) {
+			shutdown(server_info->fd, SHUT_RDWR);
 		}
-
-		_dns_client_close_socket(server_info);
 		return -1;
 	} else if (send_len < len) {
 		/* save remain data to buffer, and retry when EPOLLOUT is available */
@@ -1504,9 +1518,14 @@ static int _dns_client_send_tcp(struct dns_server_info *server_info, void *packe
 static int _dns_client_send_tls(struct dns_server_info *server_info, void *packet, unsigned short len)
 {
 	int send_len = 0;
-	unsigned char inpacket_data[DNS_IN_PACKSIZE];
+	unsigned char inpacket_data[DNS_IN_PACKSIZE * 2];
 	unsigned char *inpacket = inpacket_data;
 
+	if (len > sizeof(inpacket_data) -2 ) {
+		tlog(TLOG_ERROR, "packet size is invalid.");
+		return -1;
+	}
+
 	/* TCP query format
 	 * | len (short) | dns query data |
 	 */
@@ -1518,14 +1537,18 @@ static int _dns_client_send_tls(struct dns_server_info *server_info, void *packe
 		return _dns_client_send_data_to_buffer(server_info, inpacket, len);
 	}
 
+	if (server_info->ssl == NULL) {
+		return -1;
+	}
+
 	send_len = _dns_client_socket_ssl_send(server_info->ssl, inpacket, len);
 	if (send_len < 0) {
 		if (errno == EAGAIN || server_info->ssl == NULL) {
 			/* save data to buffer, and retry when EPOLLOUT is available */
 			return _dns_client_send_data_to_buffer(server_info, inpacket, len);
+		} else if (server_info->ssl) {
+			SSL_shutdown(server_info->ssl);
 		}
-
-		_dns_client_close_socket(server_info);
 		return -1;
 	} else if (send_len < len) {
 		/* save remain data to buffer, and retry when EPOLLOUT is available */