Skip to content

Commit ee37617

Browse files
committed
Addressd copilot's relevant comments
1 parent 9f60fc9 commit ee37617

1 file changed

Lines changed: 43 additions & 6 deletions

File tree

ns2dohd/ns2dohd.c

Lines changed: 43 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
#define DNS_BUFFER_MAXSIZE 4096
4141
#define DNS_HEADER_MIN 12
4242
#define TLS_IO_TIMEOUT_SEC 5
43+
#define DOH_EXCHANGE_TIMEOUT_SEC 20
4344
#define DEFAULT_CA_BUNDLE "/etc/ssl/certs/ca-certificates.crt"
4445
#define DEFAULT_BOOTSTRAP_DNS_IP "1.1.1.1"
4546
#define DEFAULT_BOOTSTRAP_DNS_PORT 53
@@ -344,6 +345,17 @@ static int make_servfail(const uint8_t *in, size_t inlen, uint8_t *out, size_t *
344345
return 0;
345346
}
346347

348+
static unsigned long long monotonic_ms(void)
349+
{
350+
struct timespec ts;
351+
352+
if (clock_gettime(CLOCK_MONOTONIC, &ts) != 0)
353+
return 0;
354+
355+
return ((unsigned long long)ts.tv_sec * 1000ULL) +
356+
((unsigned long long)ts.tv_nsec / 1000000ULL);
357+
}
358+
347359
static uint16_t rd_u16(const uint8_t *p)
348360
{
349361
return (uint16_t)((p[0] << 8) | p[1]);
@@ -428,8 +440,11 @@ static int resolve_host_bootstrap_type(const char *host, uint16_t qtype,
428440

429441
tv.tv_sec = DNS_TIMEOUT_SEC;
430442
tv.tv_usec = 0;
431-
setsockopt(sd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));
432-
setsockopt(sd, SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(tv));
443+
if (setsockopt(sd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)) < 0 ||
444+
setsockopt(sd, SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(tv)) < 0) {
445+
close(sd);
446+
return -1;
447+
}
433448

434449
id = (uint16_t)(((unsigned)getpid() ^ (unsigned)time(NULL)) & 0xFFFF);
435450
qbuf[0] = (uint8_t)(id >> 8);
@@ -582,8 +597,11 @@ static int tcp_connect_timeout(const struct doh_upstream *up)
582597
if (fd < 0)
583598
return -1;
584599

585-
setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));
586-
setsockopt(fd, SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(tv));
600+
if (setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)) < 0 ||
601+
setsockopt(fd, SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(tv)) < 0) {
602+
close(fd);
603+
return -1;
604+
}
587605

588606
if (connect(fd, (struct sockaddr *)&resolved, resolved_len) != 0) {
589607
close(fd);
@@ -758,8 +776,10 @@ static int doh_query_roundtrip(WOLFSSL_CTX *wctx,
758776
uint8_t tlsbuf[DNS_BUFFER_MAXSIZE];
759777
char clength[32];
760778
char errbuf[160];
779+
unsigned long long deadline_ms;
761780

762781
*reply_len = 0;
782+
deadline_ms = monotonic_ms() + (DOH_EXCHANGE_TIMEOUT_SEC * 1000ULL);
763783

764784
fd = tcp_connect_timeout(up);
765785
if (fd < 0) {
@@ -849,6 +869,13 @@ static int doh_query_roundtrip(WOLFSSL_CTX *wctx,
849869
}
850870

851871
while (!x.stream_closed && !x.failed) {
872+
unsigned long long now_ms = monotonic_ms();
873+
if (now_ms > 0 && now_ms >= deadline_ms) {
874+
dohprint(DOH_DEBUG, "DoH exchange timed out");
875+
x.failed = 1;
876+
break;
877+
}
878+
852879
ret = nghttp2_session_send(session);
853880
if (ret != 0) {
854881
dohprint(DOH_DEBUG, "nghttp2_session_send failed (%s)", nghttp2_strerror(ret));
@@ -1024,14 +1051,24 @@ int main(int argc, char *argv[])
10241051
int pid = fork();
10251052
if (pid < 0)
10261053
return 1;
1027-
if (pid > 0)
1054+
if (pid > 0) {
1055+
free(user);
1056+
free(resolver_ip);
1057+
free(cafile);
1058+
free(url);
10281059
return 0;
1060+
}
10291061

10301062
pid = fork();
10311063
if (pid < 0)
10321064
return 1;
1033-
if (pid > 0)
1065+
if (pid > 0) {
1066+
free(user);
1067+
free(resolver_ip);
1068+
free(cafile);
1069+
free(url);
10341070
return 0;
1071+
}
10351072

10361073
setsid();
10371074
close(STDIN_FILENO);

0 commit comments

Comments
 (0)