0007-Retry-SERVFAIL-DNSSEC-queries-to-a-different-server-.patch 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. From 1f60a18ea1c64beb8b6cffa0650a2bfad95ac352 Mon Sep 17 00:00:00 2001
  2. From: Simon Kelley <[email protected]>
  3. Date: Fri, 11 May 2018 16:44:16 +0100
  4. Subject: [PATCH 07/17] Retry SERVFAIL DNSSEC queries to a different server, if
  5. possible.
  6. Signed-off-by: Kevin Darbyshire-Bryant <[email protected]>
  7. ---
  8. src/forward.c | 53 ++++++++++++++++++++++++++++++++++++++++++-----------
  9. 1 file changed, 42 insertions(+), 11 deletions(-)
  10. --- a/src/forward.c
  11. +++ b/src/forward.c
  12. @@ -825,9 +825,12 @@ void reply_query(int fd, int family, tim
  13. size_t plen;
  14. int is_sign;
  15. +#ifdef HAVE_DNSSEC
  16. /* For DNSSEC originated queries, just retry the query to the same server. */
  17. if (forward->flags & (FREC_DNSKEY_QUERY | FREC_DS_QUERY))
  18. {
  19. + struct server *start;
  20. +
  21. blockdata_retrieve(forward->stash, forward->stash_len, (void *)header);
  22. plen = forward->stash_len;
  23. @@ -839,26 +842,54 @@ void reply_query(int fd, int family, tim
  24. else
  25. log_query(F_NOEXTRA | F_DNSSEC | F_IPV6, "retry", (struct all_addr *)&forward->sentto->addr.in6.sin6_addr, "dnssec");
  26. #endif
  27. -
  28. - if (forward->sentto->sfd)
  29. - fd = forward->sentto->sfd->fd;
  30. +
  31. + start = forward->sentto;
  32. +
  33. + /* for non-domain specific servers, see if we can find another to try. */
  34. + if ((forward->sentto->flags & SERV_TYPE) == 0)
  35. + while (1)
  36. + {
  37. + if (!(start = start->next))
  38. + start = daemon->servers;
  39. + if (start == forward->sentto)
  40. + break;
  41. +
  42. + if ((start->flags & SERV_TYPE) == 0 &&
  43. + (start->flags & SERV_DO_DNSSEC))
  44. + break;
  45. + }
  46. +
  47. +
  48. + if (start->sfd)
  49. + fd = start->sfd->fd;
  50. else
  51. {
  52. #ifdef HAVE_IPV6
  53. - if (forward->sentto->addr.sa.sa_family == AF_INET6)
  54. - fd = forward->rfd6->fd;
  55. + if (start->addr.sa.sa_family == AF_INET6)
  56. + {
  57. + /* may have changed family */
  58. + if (!forward->rfd6)
  59. + forward->rfd6 = allocate_rfd(AF_INET6);
  60. + fd = forward->rfd6->fd;
  61. + }
  62. else
  63. #endif
  64. - fd = forward->rfd4->fd;
  65. + {
  66. + /* may have changed family */
  67. + if (!forward->rfd4)
  68. + forward->rfd4 = allocate_rfd(AF_INET);
  69. + fd = forward->rfd4->fd;
  70. + }
  71. }
  72. -
  73. +
  74. while (retry_send(sendto(fd, (char *)header, plen, 0,
  75. - &forward->sentto->addr.sa,
  76. - sa_len(&forward->sentto->addr))));
  77. + &start->addr.sa,
  78. + sa_len(&start->addr))));
  79. return;
  80. }
  81. -
  82. +#endif
  83. +
  84. /* In strict order mode, there must be a server later in the chain
  85. left to send to, otherwise without the forwardall mechanism,
  86. code further on will cycle around the list forwever if they
  87. @@ -1024,7 +1055,7 @@ void reply_query(int fd, int family, tim
  88. while (1)
  89. {
  90. if (type == (start->flags & (SERV_TYPE | SERV_DO_DNSSEC)) &&
  91. - (type != SERV_HAS_DOMAIN || hostname_isequal(domain, start->domain)) &&
  92. + ((type & SERV_TYPE) != SERV_HAS_DOMAIN || hostname_isequal(domain, start->domain)) &&
  93. !(start->flags & (SERV_LITERAL_ADDRESS | SERV_LOOP)))
  94. {
  95. new_server = start;