]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
resolved: initialize libgcrypt before using it
authorLennart Poettering <lennart@poettering.net>
Mon, 14 Dec 2015 20:21:16 +0000 (21:21 +0100)
committerLennart Poettering <lennart@poettering.net>
Mon, 14 Dec 2015 20:28:39 +0000 (21:28 +0100)
src/resolve/resolved-dns-dnssec.c

index a0433b23875e1be04d06493aa07a7dbf4f65b6cd..9eb54d44db12481314c4cfe17351510ab684957f 100644 (file)
  *            Normal RR → RRSIG/DNSKEY+ → DS → RRSIG/DNSKEY+ → DS → ... → DS → RRSIG/DNSKEY+ → DS
  */
 
+static void initialize_libgcrypt(void) {
+        const char *p;
+
+        if (gcry_control(GCRYCTL_INITIALIZATION_FINISHED_P))
+                return;
+
+        p = gcry_check_version("1.4.5");
+        assert(p);
+
+        gcry_control(GCRYCTL_DISABLE_SECMEM);
+        gcry_control(GCRYCTL_INITIALIZATION_FINISHED, 0);
+}
+
 static bool dnssec_algorithm_supported(int algorithm) {
         return IN_SET(algorithm,
                       DNSSEC_ALGORITHM_RSASHA1,
@@ -329,6 +342,8 @@ int dnssec_verify_rrset(
         /* Bring the RRs into canonical order */
         qsort_safe(list, n, sizeof(DnsResourceRecord*), rr_compare);
 
+        initialize_libgcrypt();
+
         /* OK, the RRs are now in canonical order. Let's calculate the digest */
         switch (rrsig->rrsig.algorithm) {
 
@@ -717,6 +732,8 @@ int dnssec_verify_dnskey(DnsResourceRecord *dnskey, DnsResourceRecord *ds) {
         if (dnssec_keytag(dnskey) != ds->ds.key_tag)
                 return 0;
 
+        initialize_libgcrypt();
+
         algorithm = digest_to_gcrypt(ds->ds.digest_type);
         if (algorithm < 0)
                 return algorithm;