mirror of
https://github.com/lucannez64/darling-lol.git
synced 2026-10-27 19:54:38 +00:00
33 lines
1.0 KiB
Diff
33 lines
1.0 KiB
Diff
diff --git a/res_send.c b/res_send.c
|
|
index f391fb4..8de4637 100644
|
|
--- a/res_send.c
|
|
+++ b/res_send.c
|
|
@@ -959,6 +959,27 @@ vc_same_ns:
|
|
return DNS_RES_STATUS_CONNECTION_REFUSED;
|
|
}
|
|
|
|
+#ifdef DARLING
|
|
+ /*
|
|
+ * darling-lol: the TCP (VC) reply read below is a plain
|
|
+ * blocking read() with no deadline. If the server is slow or
|
|
+ * drops the connection without RST, it blocks forever and the
|
|
+ * whole getaddrinfo() caller hangs (observed: RC launcher
|
|
+ * stall on clientconfig.rpg.riotgames.com, thread parked in
|
|
+ * _sys_read <- _dns_res_send <- _res_9_nsend_2). Bound it so a
|
|
+ * stalled server falls through to the normal retry/next-server
|
|
+ * path instead of wedging the process.
|
|
+ */
|
|
+ {
|
|
+ struct timeval tv;
|
|
+ tv.tv_sec = statp->retrans > 0 ? statp->retrans : RES_TIMEOUT;
|
|
+ if (tv.tv_sec > 30) tv.tv_sec = 30;
|
|
+ tv.tv_usec = 0;
|
|
+ setsockopt(statp->_vcsock, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));
|
|
+ setsockopt(statp->_vcsock, SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(tv));
|
|
+ }
|
|
+#endif
|
|
+
|
|
statp->_flags |= RES_F_VC;
|
|
}
|
|
|