Commit e077644
committed
Send SERVFAIL response on DNS query failure to prevent client timeouts
When DnsQueryRaw fails (synchronously or asynchronously), the Windows DNS
resolver currently sends no response back to the Linux DNS client. This
forces the client to wait for its full retransmit timeout (typically 5-10
seconds per query) before moving on, causing significant DNS delays.
This change sends a minimal 12-byte DNS SERVFAIL response (RFC 1035,
RCODE=2) back to the Linux DNS client whenever:
- DnsQueryRaw returns a synchronous failure (not DNS_REQUEST_PENDING)
- The async completion callback receives null results
- The async completion returns a non-null result with no raw response
The SERVFAIL response uses the original request's transaction ID so the
client can match it to the pending query and immediately retry or fail.
This also fixes a memory leak on the Linux side: when no response was
sent, UDP request tracking entries in DnsServer::m_udpRequests were never
cleaned up. The SERVFAIL response now triggers the normal response
handling path which erases the tracking entry.
Refs: #4285 #5256 #47371 parent 107104e commit e077644
2 files changed
Lines changed: 45 additions & 1 deletion
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
223 | 223 | | |
224 | 224 | | |
225 | 225 | | |
| 226 | + | |
| 227 | + | |
| 228 | + | |
| 229 | + | |
| 230 | + | |
| 231 | + | |
226 | 232 | | |
227 | 233 | | |
228 | 234 | | |
| |||
264 | 270 | | |
265 | 271 | | |
266 | 272 | | |
| 273 | + | |
| 274 | + | |
| 275 | + | |
| 276 | + | |
267 | 277 | | |
268 | 278 | | |
269 | 279 | | |
| |||
337 | 347 | | |
338 | 348 | | |
339 | 349 | | |
| 350 | + | |
| 351 | + | |
| 352 | + | |
| 353 | + | |
| 354 | + | |
| 355 | + | |
340 | 356 | | |
341 | 357 | | |
342 | 358 | | |
| |||
349 | 365 | | |
350 | 366 | | |
351 | 367 | | |
| 368 | + | |
| 369 | + | |
| 370 | + | |
| 371 | + | |
| 372 | + | |
| 373 | + | |
| 374 | + | |
| 375 | + | |
| 376 | + | |
| 377 | + | |
| 378 | + | |
| 379 | + | |
| 380 | + | |
| 381 | + | |
| 382 | + | |
| 383 | + | |
| 384 | + | |
| 385 | + | |
| 386 | + | |
| 387 | + | |
352 | 388 | | |
353 | 389 | | |
354 | 390 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
43 | 43 | | |
44 | 44 | | |
45 | 45 | | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
46 | 50 | | |
47 | 51 | | |
48 | 52 | | |
| |||
78 | 82 | | |
79 | 83 | | |
80 | 84 | | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
81 | 89 | | |
82 | 90 | | |
83 | 91 | | |
| |||
105 | 113 | | |
106 | 114 | | |
107 | 115 | | |
108 | | - | |
| 116 | + | |
109 | 117 | | |
110 | 118 | | |
111 | 119 | | |
| |||
0 commit comments