Stack corrupted on mipsbig BugFix

This commit is contained in:
Nick Peng
2019-01-29 00:14:34 +08:00
parent 210e0a9a6f
commit c3ac0c2f17
2 changed files with 37 additions and 6 deletions

View File

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

View File

@@ -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 */