summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorColin Watson <cjwatson@debian.org>2014-02-09 16:10:01 +0000
committerColin Watson <cjwatson@debian.org>2020-10-18 12:07:21 +0100
commit78a7702d88713e854550a05fa9b8670f219d9bf9 (patch)
treeece1e69bc7986a68f1cd4293e5dba82bfb1d0445
parenta7d2f23b7b86f97749856482233cdc9dd970d1d3 (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()