Stack corrupted on mipsbig BugFix
This commit is contained in:
8
package/optware/smartdns-opt.conf
Normal file
8
package/optware/smartdns-opt.conf
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
# workmode
|
||||||
|
# 0: run as port only
|
||||||
|
# 1: redirect port
|
||||||
|
# 2: replace
|
||||||
|
SMARTDNS_WORKMODE="1"
|
||||||
|
|
||||||
|
# smartdns port
|
||||||
|
SMARTDNS_PORT="535"
|
||||||
@@ -1039,6 +1039,11 @@ static int _dns_client_socket_ssl_recv(SSL *ssl, void *buf, int num)
|
|||||||
int ssl_ret = 0;
|
int ssl_ret = 0;
|
||||||
unsigned long ssl_err = 0;
|
unsigned long ssl_err = 0;
|
||||||
|
|
||||||
|
if (ssl == NULL) {
|
||||||
|
errno = EFAULT;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
ret = SSL_read(ssl, buf, num);
|
ret = SSL_read(ssl, buf, num);
|
||||||
if (ret >= 0) {
|
if (ret >= 0) {
|
||||||
return ret;
|
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)
|
static int _dns_client_send_tcp(struct dns_server_info *server_info, void *packet, unsigned short len)
|
||||||
{
|
{
|
||||||
int send_len = 0;
|
int send_len = 0;
|
||||||
unsigned char inpacket_data[DNS_IN_PACKSIZE];
|
unsigned char inpacket_data[DNS_IN_PACKSIZE * 2];
|
||||||
unsigned char *inpacket = inpacket_data;
|
unsigned char *inpacket = inpacket_data;
|
||||||
|
|
||||||
|
if (len > sizeof(inpacket_data) -2 ) {
|
||||||
|
tlog(TLOG_ERROR, "packet size is invalid.");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
/* TCP query format
|
/* TCP query format
|
||||||
* | len (short) | dns query data |
|
* | 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);
|
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);
|
send_len = send(server_info->fd, inpacket, len, MSG_NOSIGNAL);
|
||||||
if (send_len < 0) {
|
if (send_len < 0) {
|
||||||
if (errno == EAGAIN) {
|
if (errno == EAGAIN) {
|
||||||
/* save data to buffer, and retry when EPOLLOUT is available */
|
/* save data to buffer, and retry when EPOLLOUT is available */
|
||||||
return _dns_client_send_data_to_buffer(server_info, inpacket, len);
|
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;
|
return -1;
|
||||||
} else if (send_len < len) {
|
} else if (send_len < len) {
|
||||||
/* save remain data to buffer, and retry when EPOLLOUT is available */
|
/* 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)
|
static int _dns_client_send_tls(struct dns_server_info *server_info, void *packet, unsigned short len)
|
||||||
{
|
{
|
||||||
int send_len = 0;
|
int send_len = 0;
|
||||||
unsigned char inpacket_data[DNS_IN_PACKSIZE];
|
unsigned char inpacket_data[DNS_IN_PACKSIZE * 2];
|
||||||
unsigned char *inpacket = inpacket_data;
|
unsigned char *inpacket = inpacket_data;
|
||||||
|
|
||||||
|
if (len > sizeof(inpacket_data) -2 ) {
|
||||||
|
tlog(TLOG_ERROR, "packet size is invalid.");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
/* TCP query format
|
/* TCP query format
|
||||||
* | len (short) | dns query data |
|
* | 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);
|
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);
|
send_len = _dns_client_socket_ssl_send(server_info->ssl, inpacket, len);
|
||||||
if (send_len < 0) {
|
if (send_len < 0) {
|
||||||
if (errno == EAGAIN || server_info->ssl == NULL) {
|
if (errno == EAGAIN || server_info->ssl == NULL) {
|
||||||
/* save data to buffer, and retry when EPOLLOUT is available */
|
/* save data to buffer, and retry when EPOLLOUT is available */
|
||||||
return _dns_client_send_data_to_buffer(server_info, inpacket, len);
|
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;
|
return -1;
|
||||||
} else if (send_len < len) {
|
} else if (send_len < len) {
|
||||||
/* save remain data to buffer, and retry when EPOLLOUT is available */
|
/* save remain data to buffer, and retry when EPOLLOUT is available */
|
||||||
|
|||||||
Reference in New Issue
Block a user