summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorColin Watson <cjwatson@debian.org>2014-02-09 16:10:01 +0000
committerColin Watson <cjwatson@debian.org>2020-06-07 10:25:35 +0100
commitca39bb2ab1f56d8ecdeadc32d6bda1a8e73301ac (patch)
treeb419ff1b175bc0ba673d23d5a88979106897d1de
parentb78e6371a98460f5d12683406674e117d64b35f2 (diff)
Force use of DNSSEC even if "options edns0" isn't in resolv.conf
This allows SSHFP DNS records to be verified if glibc 2.11 is installed. Origin: vendor, https://cvs.fedoraproject.org/viewvc/F-12/openssh/openssh-5.2p1-edns.patch?revision=1.1&view=markup Bug: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=572049 Bug-Debian: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=572049 Last-Update: 2010-04-06 Patch-Name: dnssec-sshfp.patch
-rw-r--r--dns.c14
-rw-r--r--openbsd-compat/getrrsetbyname.c10
-rw-r--r--openbsd-compat/getrrsetbyname.h3
3 files changed, 21 insertions, 6 deletions
diff --git a/dns.c b/dns.c
index e4f9bf830..9c9fe6413 100644
--- a/dns.c
+++ b/dns.c
@@ -210,6 +210,7 @@ verify_host_key_dns(const char *hostname, struct sockaddr *address,
210{ 210{
211 u_int counter; 211 u_int counter;
212 int result; 212 int result;
213 unsigned int rrset_flags = 0;
213 struct rrsetinfo *fingerprints = NULL; 214 struct rrsetinfo *fingerprints = NULL;
214 215
215 u_int8_t hostkey_algorithm; 216 u_int8_t hostkey_algorithm;
@@ -233,8 +234,19 @@ verify_host_key_dns(const char *hostname, struct sockaddr *address,
233 return -1; 234 return -1;
234 } 235 }
235 236
237 /*
238 * Original getrrsetbyname function, found on OpenBSD for example,
239 * doesn't accept any flag and prerequisite for obtaining AD bit in
240 * DNS response is set by "options edns0" in resolv.conf.
241 *
242 * Our version is more clever and use RRSET_FORCE_EDNS0 flag.
243 */
244#ifndef HAVE_GETRRSETBYNAME
245 rrset_flags |= RRSET_FORCE_EDNS0;
246#endif
236 result = getrrsetbyname(hostname, DNS_RDATACLASS_IN, 247 result = getrrsetbyname(hostname, DNS_RDATACLASS_IN,
237 DNS_RDATATYPE_SSHFP, 0, &fingerprints); 248 DNS_RDATATYPE_SSHFP, rrset_flags, &fingerprints);
249
238 if (result) { 250 if (result) {
239 verbose("DNS lookup error: %s", dns_result_totext(result)); 251 verbose("DNS lookup error: %s", dns_result_totext(result));
240 return -1; 252 return -1;
diff --git a/openbsd-compat/getrrsetbyname.c b/openbsd-compat/getrrsetbyname.c
index dc6fe0533..e061a290a 100644
--- a/openbsd-compat/getrrsetbyname.c
+++ b/openbsd-compat/getrrsetbyname.c
@@ -209,8 +209,8 @@ getrrsetbyname(const char *hostname, unsigned int rdclass,
209 goto fail; 209 goto fail;
210 } 210 }
211 211
212 /* don't allow flags yet, unimplemented */ 212 /* Allow RRSET_FORCE_EDNS0 flag only. */
213 if (flags) { 213 if ((flags & !RRSET_FORCE_EDNS0) != 0) {
214 result = ERRSET_INVAL; 214 result = ERRSET_INVAL;
215 goto fail; 215 goto fail;
216 } 216 }
@@ -226,9 +226,9 @@ getrrsetbyname(const char *hostname, unsigned int rdclass,
226#endif /* DEBUG */ 226#endif /* DEBUG */
227 227
228#ifdef RES_USE_DNSSEC 228#ifdef RES_USE_DNSSEC
229 /* turn on DNSSEC if EDNS0 is configured */ 229 /* turn on DNSSEC if required */
230 if (_resp->options & RES_USE_EDNS0) 230 if (flags & RRSET_FORCE_EDNS0)
231 _resp->options |= RES_USE_DNSSEC; 231 _resp->options |= (RES_USE_EDNS0|RES_USE_DNSSEC);
232#endif /* RES_USE_DNSEC */ 232#endif /* RES_USE_DNSEC */
233 233
234 /* make query */ 234 /* make query */
diff --git a/openbsd-compat/getrrsetbyname.h b/openbsd-compat/getrrsetbyname.h
index 1283f5506..dbbc85a2a 100644
--- a/openbsd-compat/getrrsetbyname.h
+++ b/openbsd-compat/getrrsetbyname.h
@@ -72,6 +72,9 @@
72#ifndef RRSET_VALIDATED 72#ifndef RRSET_VALIDATED
73# define RRSET_VALIDATED 1 73# define RRSET_VALIDATED 1
74#endif 74#endif
75#ifndef RRSET_FORCE_EDNS0
76# define RRSET_FORCE_EDNS0 0x0001
77#endif
75 78
76/* 79/*
77 * Return codes for getrrsetbyname() 80 * Return codes for getrrsetbyname()