dirmngr: Start dirmngr on demand.
[gnupg.git] / dirmngr / crlcache.c
index 8505f9c..13d8a26 100644 (file)
 #include "crlfetch.h"
 #include "misc.h"
 #include "cdb.h"
-#include "estream-printf.h"
 
 /* Change this whenever the format changes */
 #define DBDIR_D (opt.system_daemon? "crls.d" : "dirmngr-cache.d")
@@ -480,7 +479,9 @@ check_dir_version (estream_t *fpadr, const char *fname,
   if (lineerr)
     return lineerr;
 
-  if (strtol (line+2, NULL, 10) != DBDIRVERSION)
+  /* The !line catches the case of an empty DIR file.  We handle this
+     the same as a non-matching version.  */
+  if (!line || strtol (line+2, NULL, 10) != DBDIRVERSION)
     {
       if (!created && cleanup_on_mismatch)
         {
@@ -818,8 +819,8 @@ update_dir (crl_cache_t cache)
       nodename = utsbuf.nodename;
 #endif
 
-    estream_asprintf (&tmpbuf, "DIR-tmp-%s-%u-%p.txt.tmp",
-                      nodename, (unsigned int)getpid (), &tmpbuf);
+    gpgrt_asprintf (&tmpbuf, "DIR-tmp-%s-%u-%p.txt.tmp",
+                    nodename, (unsigned int)getpid (), &tmpbuf);
     if (!tmpbuf)
       {
         err = gpg_error_from_errno (errno);
@@ -858,7 +859,7 @@ update_dir (crl_cache_t cache)
                  field, thus we can compare it pretty easily. */
               *endp = 0;
               e = find_entry ( cache->entries, fieldp);
-              *endp = ':'; /* Restore orginal line. */
+              *endp = ':'; /* Restore original line. */
               if (e && e->deleted)
                 {
                   /* Marked for deletion, so don't write it. */
@@ -993,7 +994,7 @@ hash_dbfile (const char *fname, unsigned char *md5buffer)
   char *buffer;
   size_t n;
   gcry_md_hd_t md5;
-  gpg_err_code_t err;
+  gpg_error_t err;
 
   buffer = xtrymalloc (65536);
   fp = buffer? es_fopen (fname, "rb") : NULL;
@@ -1211,7 +1212,7 @@ find_entry (crl_cache_entry_t first, const char *issuer_hash)
 }
 
 
-/* Create a new CRL cache. This fucntion is usually called only once.
+/* Create a new CRL cache. This function is usually called only once.
    never fail. */
 void
 crl_cache_init(void)
@@ -1511,6 +1512,7 @@ crl_cache_cert_isvalid (ctrl_t ctrl, ksba_cert_t cert,
       break;
     case CRL_CACHE_DONTKNOW:
       err = gpg_error (GPG_ERR_NO_CRL_KNOWN);
+      break;
     case CRL_CACHE_CANTUSE:
       err = gpg_error (GPG_ERR_NO_CRL_KNOWN);
       break;
@@ -1701,7 +1703,8 @@ crl_parse_insert (ctrl_t ctrl, ksba_crl_t crl,
         {
         case KSBA_SR_BEGIN_ITEMS:
           {
-            if (start_sig_check (crl, &md, &algo ))
+            err = start_sig_check (crl, &md, &algo);
+            if (err)
               goto failure;
 
             err = ksba_crl_get_update_times (crl, thisupdate, nextupdate);
@@ -2022,8 +2025,8 @@ crl_cache_insert (ctrl_t ctrl, const char *url, ksba_reader_t reader)
       nodename = utsbuf.nodename;
 #endif
 
-    estream_asprintf (&tmpfname, "crl-tmp-%s-%u-%p.db.tmp",
-                      nodename, (unsigned int)getpid (), &tmpfname);
+    gpgrt_asprintf (&tmpfname, "crl-tmp-%s-%u-%p.db.tmp",
+                    nodename, (unsigned int)getpid (), &tmpfname);
     if (!tmpfname)
       {
         err = gpg_error_from_syserror ();
@@ -2524,6 +2527,9 @@ crl_cache_reload_crl (ctrl_t ctrl, ksba_cert_t cert)
       issuername_uri =  ksba_name_get_uri (issuername, 0);
       ksba_name_release (issuername); issuername = NULL;
 
+      /* Close the reader.  */
+      crl_close_reader (reader);
+      reader = NULL;
     }
   if (gpg_err_code (err) == GPG_ERR_EOF)
     err = 0;
@@ -2534,11 +2540,8 @@ crl_cache_reload_crl (ctrl_t ctrl, ksba_cert_t cert)
       if (opt.verbose)
         log_info ("no distribution point - trying issuer name\n");
 
-      if (reader)
-        {
-          crl_close_reader (reader);
-          reader = NULL;
-        }
+      crl_close_reader (reader);
+      reader = NULL;
 
       issuer = ksba_cert_get_issuer (cert, 0);
       if (!issuer)
@@ -2570,8 +2573,7 @@ crl_cache_reload_crl (ctrl_t ctrl, ksba_cert_t cert)
     }
 
  leave:
-  if (reader)
-    crl_close_reader (reader);
+  crl_close_reader (reader);
   xfree (distpoint_uri);
   xfree (issuername_uri);
   ksba_name_release (distpoint);