Skip to content

Commit 1ef2cd2

Browse files
committed
dns_server: fix potential crash issue.
1 parent 406daf7 commit 1ef2cd2

File tree

3 files changed

+50
-43
lines changed

3 files changed

+50
-43
lines changed

src/dns_client.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4817,6 +4817,11 @@ static int _dns_client_send_https(struct dns_server_info *server_info, void *pac
48174817
"Content-Length: %d\r\n"
48184818
"\r\n",
48194819
https_flag->path, https_flag->httphost, len);
4820+
if (http_len < 0 || http_len >= DNS_IN_PACKSIZE) {
4821+
tlog(TLOG_ERROR, "http header size is invalid.");
4822+
return -1;
4823+
}
4824+
48204825
memcpy(inpacket + http_len, packet, len);
48214826
http_len += len;
48224827

src/dns_conf.c

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6570,12 +6570,6 @@ static void _dns_conf_group_post(void)
65706570

65716571
hash_for_each_safe(dns_conf_rule.group, i, tmp, group, node)
65726572
{
6573-
if (dns_conf.cachesize == 0 && group->dns_response_mode == DNS_RESPONSE_MODE_FASTEST_RESPONSE) {
6574-
group->dns_response_mode = DNS_RESPONSE_MODE_FASTEST_IP;
6575-
tlog(TLOG_WARN, "force set response of group %s to %s as cache size is 0", group->group_name,
6576-
dns_conf_response_mode_enum[group->dns_response_mode].name);
6577-
}
6578-
65796573
if ((group->dns_rr_ttl_min > group->dns_rr_ttl_max) && group->dns_rr_ttl_max > 0) {
65806574
group->dns_rr_ttl_min = group->dns_rr_ttl_max;
65816575
}

src/dns_server.c

Lines changed: 45 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
76847698
static 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

Comments
 (0)