Tweaks for gpgconf.
authorWerner Koch <wk@gnupg.org>
Tue, 14 Dec 2010 19:17:58 +0000 (19:17 +0000)
committerWerner Koch <wk@gnupg.org>
Tue, 14 Dec 2010 19:17:58 +0000 (19:17 +0000)
Fixed dirmngr bug 1010.

ChangeLog
NEWS
configure.ac
dirmngr/ChangeLog
dirmngr/cdb.h
dirmngr/cdblib.c
dirmngr/crlcache.c
tools/ChangeLog
tools/gpgconf-comp.c

index 8c0a2fe..e765ef8 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2010-12-14  Werner Koch  <wk@g10code.com>
+
+       * configure.ac (BUILD_WITH_GPG, BUILD_WITH_GPGSM)
+       (BUILD_WITH_AGENT, BUILD_WITH_SCDAEMON, BUILD_WITH_DIRMNGR)
+       (BUILD_WITH_G13): New defines.
+
 2010-11-23  Werner Koch  <wk@g10code.com>
 
        * am/cmacros.am (extra_bin_ldflags): New.  For W32CE set the stack
 2010-11-23  Werner Koch  <wk@g10code.com>
 
        * am/cmacros.am (extra_bin_ldflags): New.  For W32CE set the stack
diff --git a/NEWS b/NEWS
index afd9053..2cdf854 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -12,6 +12,8 @@ Noteworthy changes in version 2.1.0beta2 (unreleased)
    these tools are written robust enough to accept this new algorithm
    name as well.
 
    these tools are written robust enough to accept this new algorithm
    name as well.
 
+ * Fixed CRL loading under W32 (bug#1010).
+
 
 Noteworthy changes in version 2.1.0beta1 (2010-10-26)
 -----------------------------------------------------
 
 Noteworthy changes in version 2.1.0beta1 (2010-10-26)
 -----------------------------------------------------
index 1fa73e0..b6ed4b3 100644 (file)
@@ -1523,7 +1523,9 @@ if test "$build_agent_only" = "yes" ; then
   build_doc=no
 fi
 
   build_doc=no
 fi
 
-
+#
+# Set variables for use by th automake makefile.
+#
 AM_CONDITIONAL(BUILD_GPG,         test "$build_gpg" = "yes")
 AM_CONDITIONAL(BUILD_GPGSM,       test "$build_gpgsm" = "yes")
 AM_CONDITIONAL(BUILD_AGENT,       test "$build_agent" = "yes")
 AM_CONDITIONAL(BUILD_GPG,         test "$build_gpg" = "yes")
 AM_CONDITIONAL(BUILD_GPGSM,       test "$build_gpgsm" = "yes")
 AM_CONDITIONAL(BUILD_AGENT,       test "$build_agent" = "yes")
@@ -1538,6 +1540,29 @@ AM_CONDITIONAL(BUILD_GPGTAR,      test "$build_gpgtar" = "yes")
 AM_CONDITIONAL(RUN_GPG_TESTS,
                test x$cross_compiling = xno -a "$build_gpg" = yes )
 
 AM_CONDITIONAL(RUN_GPG_TESTS,
                test x$cross_compiling = xno -a "$build_gpg" = yes )
 
+# 
+# Set some defines for use gpgconf.
+#
+if test "$build_gpg" = yes ; then
+    AC_DEFINE(BUILD_WITH_GPG,1,[Defined if GPG is to be build])
+fi
+if test "$build_gpgsm" = yes ; then
+    AC_DEFINE(BUILD_WITH_GPGSM,1,[Defined if GPGSM is to be build])
+fi
+if test "$build_agent" = yes ; then
+    AC_DEFINE(BUILD_WITH_AGENT,1,[Defined if GPG-AGENT is to be build])
+fi
+if test "$build_scdaemon" = yes ; then
+    AC_DEFINE(BUILD_WITH_SCDAEMON,1,[Defined if SCDAEMON is to be build])
+fi
+if test "$build_dirmngr" = yes ; then
+    AC_DEFINE(BUILD_WITH_DIRMNGR,1,[Defined if SCDAEMON is to be build])
+fi
+if test "$build_g13" = yes ; then
+    AC_DEFINE(BUILD_WITH_G13,1,[Defined if G13 is to be build])
+fi
+
+
 
 #
 # Print errors here so that they are visible all
 
 #
 # Print errors here so that they are visible all
index 11fd1b7..2c20875 100644 (file)
@@ -1,5 +1,12 @@
 2010-12-14  Werner Koch  <wk@g10code.com>
 
 2010-12-14  Werner Koch  <wk@g10code.com>
 
+       * cdb.h (struct cdb) [W32]: Add field CDB_MAPPING.
+       * cdblib.c (cdb_init) [W32]: Save mapping handle.
+       (cdb_free) [W32]: Don't leak the mapping handle from cdb_init by
+       using the saved one.
+
+       * crlcache.c (crl_cache_insert): Close unused matching files.
+
        * dirmngr.c (main) [W32CE]: Change homedir in daemon mode to /gnupg.
 
 2010-12-07  Werner Koch  <wk@g10code.com>
        * dirmngr.c (main) [W32CE]: Change homedir in daemon mode to /gnupg.
 
 2010-12-07  Werner Koch  <wk@g10code.com>
index 73cc995..0c0d270 100644 (file)
@@ -20,6 +20,9 @@ void cdb_pack(cdbi_t num, unsigned char buf[4]);
 struct cdb {
   int cdb_fd;                  /* file descriptor */
   /* private members */
 struct cdb {
   int cdb_fd;                  /* file descriptor */
   /* private members */
+#ifdef HAVE_W32_SYSTEM
+  void *cdb_mapping;            /* Mapping handle.  */
+#endif
   cdbi_t cdb_fsize;            /* datafile size */
   const unsigned char *cdb_mem; /* mmap'ed file memory */
   cdbi_t cdb_vpos, cdb_vlen;   /* found data */
   cdbi_t cdb_fsize;            /* datafile size */
   const unsigned char *cdb_mem; /* mmap'ed file memory */
   cdbi_t cdb_vpos, cdb_vlen;   /* found data */
index 16d53ae..3bfeffc 100644 (file)
@@ -135,7 +135,7 @@ cdb_init(struct cdb *cdbp, int fd)
   hFile = fd;
 # else
   hFile = (HANDLE) _get_osfhandle(fd);
   hFile = fd;
 # else
   hFile = (HANDLE) _get_osfhandle(fd);
-#endif
+# endif
   if (hFile == (HANDLE) -1)
     return -1;
   hMapping = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
   if (hFile == (HANDLE) -1)
     return -1;
   hMapping = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
@@ -144,6 +144,7 @@ cdb_init(struct cdb *cdbp, int fd)
   mem = (unsigned char *)MapViewOfFile(hMapping, FILE_MAP_READ, 0, 0, 0);
   if (!mem)
     return -1;
   mem = (unsigned char *)MapViewOfFile(hMapping, FILE_MAP_READ, 0, 0, 0);
   if (!mem)
     return -1;
+  cdbp->cdb_mapping = hMapping;
 #else
   mem = (unsigned char*)mmap(NULL, fsize, PROT_READ, MAP_SHARED, fd, 0);
   if (mem == MAP_FAILED)
 #else
   mem = (unsigned char*)mmap(NULL, fsize, PROT_READ, MAP_SHARED, fd, 0);
   if (mem == MAP_FAILED)
@@ -180,17 +181,9 @@ cdb_free(struct cdb *cdbp)
 {
   if (cdbp->cdb_mem) {
 #ifdef _WIN32
 {
   if (cdbp->cdb_mem) {
 #ifdef _WIN32
-    HANDLE hFile, hMapping;
-#endif
-#ifdef _WIN32
-#ifdef __MINGW32CE__
-    hFile = cdbp->cdb_fd;
-#else
-    hFile = (HANDLE) _get_osfhandle(cdbp->cdb_fd);
-#endif
-    hMapping = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
-    UnmapViewOfFile((void*) cdbp->cdb_mem);
-    CloseHandle(hMapping);
+    UnmapViewOfFile ((void*) cdbp->cdb_mem);
+    CloseHandle (cdbp->cdb_mapping);
+    cdbp->cdb_mapping = NULL;
 #else
     munmap((void*)cdbp->cdb_mem, cdbp->cdb_fsize);
 #endif /* _WIN32 */
 #else
     munmap((void*)cdbp->cdb_mem, cdbp->cdb_fsize);
 #endif /* _WIN32 */
index 5f04305..12d4510 100644 (file)
@@ -178,7 +178,7 @@ static crl_cache_entry_t find_entry (crl_cache_entry_t first,
 
 
 
 
 
 
-/* The currently loaded cache object.  This isi usually initialized
+/* The currently loaded cache object.  This is usually initialized
    right at startup.  */
 static crl_cache_t current_cache;
 
    right at startup.  */
 static crl_cache_t current_cache;
 
@@ -393,7 +393,7 @@ release_cache (crl_cache_t cache)
     {
       entry2 = entry->next;
       release_one_cache_entry (entry);
     {
       entry2 = entry->next;
       release_one_cache_entry (entry);
-  }
+    }
   cache->entries = NULL;
   xfree (cache);
 }
   cache->entries = NULL;
   xfree (cache);
 }
@@ -1189,6 +1189,7 @@ unlock_db_file (crl_cache_t cache, crl_cache_entry_t entry)
         cache->entries = enext;
       else
         eprev->next = enext;
         cache->entries = enext;
       else
         eprev->next = enext;
+      /* FIXME: Do we leak ENTRY? */
     }
 }
 
     }
 }
 
@@ -1204,7 +1205,6 @@ find_entry (crl_cache_entry_t first, const char *issuer_hash)
 }
 
 
 }
 
 
-
 /* Create a new CRL cache. This fucntion is usually called only once.
    never fail. */
 void
 /* Create a new CRL cache. This fucntion is usually called only once.
    never fail. */
 void
@@ -2177,6 +2177,31 @@ crl_cache_insert (ctrl_t ctrl, const char *url, ksba_reader_t reader)
   newfname = make_db_file_name (entry->issuer_hash);
   if (opt.verbose)
     log_info (_("creating cache file `%s'\n"), newfname);
   newfname = make_db_file_name (entry->issuer_hash);
   if (opt.verbose)
     log_info (_("creating cache file `%s'\n"), newfname);
+
+  /* Just in case close unused matching files.  Actually we need this
+     only under Windows but saving file descriptors is never bad.  */
+  {
+    int any;
+    do 
+      {
+        any = 0;
+        for (e = cache->entries; e; e = e->next)
+          if (!e->cdb_use_count && e->cdb
+              && !strcmp (e->issuer_hash, entry->issuer_hash))
+            {
+              int fd = cdb_fileno (e->cdb);
+              cdb_free (e->cdb);
+              xfree (e->cdb);
+              e->cdb = NULL;
+              if (close (fd))
+                log_error (_("error closing cache file: %s\n"),
+                           strerror(errno));
+              any = 1;
+              break;
+            }
+      }
+    while (any);
+  }
 #ifdef HAVE_W32_SYSTEM
   gnupg_remove (newfname);
 #endif
 #ifdef HAVE_W32_SYSTEM
   gnupg_remove (newfname);
 #endif
index c6ac332..110e43e 100644 (file)
@@ -1,3 +1,9 @@
+2010-12-14  Werner Koch  <wk@g10code.com>
+
+       * gpgconf-comp.c (gc_options_gpg_agent, gc_options_scdaemon)
+       (gc_options_gpg, gc_options_gpgsm, gc_options_dirmngr): Define to
+       NULL if corresponding BUILD_WITH_foo is not defined.
+
 2010-12-02  Werner Koch  <wk@g10code.com>
 
        * no-libgcrypt.c (gcry_cipher_algo_name): New.
 2010-12-02  Werner Koch  <wk@g10code.com>
 
        * no-libgcrypt.c (gcry_cipher_algo_name): New.
index d037246..74feadb 100644 (file)
@@ -51,7 +51,6 @@
 #include "gc-opt-flags.h"
 #include "gpgconf.h"
 
 #include "gc-opt-flags.h"
 #include "gpgconf.h"
 
-
 /* There is a problem with gpg 1.4 under Windows: --gpgconf-list
    returns a plain filename without escaping.  As long as we have not
    fixed that we need to use gpg2.  */
 /* There is a problem with gpg 1.4 under Windows: --gpgconf-list
    returns a plain filename without escaping.  As long as we have not
    fixed that we need to use gpg2.  */
@@ -467,6 +466,9 @@ typedef struct gc_option gc_option_t;
 #define GC_OPTION_NULL { NULL }
 
 \f
 #define GC_OPTION_NULL { NULL }
 
 \f
+#ifndef BUILD_WITH_AGENT
+#define gc_options_gpg_agent NULL
+#else
 /* The options of the GC_COMPONENT_GPG_AGENT component.  */
 static gc_option_t gc_options_gpg_agent[] =
  {
 /* The options of the GC_COMPONENT_GPG_AGENT component.  */
 static gc_option_t gc_options_gpg_agent[] =
  {
@@ -569,8 +571,12 @@ static gc_option_t gc_options_gpg_agent[] =
 
    GC_OPTION_NULL
  };
 
    GC_OPTION_NULL
  };
+#endif /*BUILD_WITH_AGENT*/
 
 
 
 
+#ifndef BUILD_WITH_SCDAEMON
+#define gc_options_scdaemon NULL
+#else
 /* The options of the GC_COMPONENT_SCDAEMON component.  */
 static gc_option_t gc_options_scdaemon[] =
  {
 /* The options of the GC_COMPONENT_SCDAEMON component.  */
 static gc_option_t gc_options_scdaemon[] =
  {
@@ -636,8 +642,11 @@ static gc_option_t gc_options_scdaemon[] =
 
    GC_OPTION_NULL
  };
 
    GC_OPTION_NULL
  };
+#endif /*BUILD_WITH_SCDAEMON*/
 
 
-
+#ifndef BUILD_WITH_GPG
+#define gc_options_gpg NULL
+#else
 /* The options of the GC_COMPONENT_GPG component.  */
 static gc_option_t gc_options_gpg[] =
  {
 /* The options of the GC_COMPONENT_GPG component.  */
 static gc_option_t gc_options_gpg[] =
  {
@@ -710,9 +719,12 @@ static gc_option_t gc_options_gpg[] =
 
    GC_OPTION_NULL
  };
 
    GC_OPTION_NULL
  };
+#endif /*BUILD_WITH_GPG*/
 
 
 
 
-
+#ifndef BUILD_WITH_GPGSM
+#define gc_options_gpgsm NULL
+#else
 /* The options of the GC_COMPONENT_GPGSM component.  */
 static gc_option_t gc_options_gpgsm[] =
  {
 /* The options of the GC_COMPONENT_GPGSM component.  */
 static gc_option_t gc_options_gpgsm[] =
  {
@@ -802,8 +814,12 @@ static gc_option_t gc_options_gpgsm[] =
 
    GC_OPTION_NULL
  };
 
    GC_OPTION_NULL
  };
+#endif /*BUILD_WITH_GPGSM*/
 
 
 
 
+#ifndef BUILD_WITH_DIRMNGR
+#define gc_options_dirmngr NULL
+#else
 /* The options of the GC_COMPONENT_DIRMNGR component.  */
 static gc_option_t gc_options_dirmngr[] =
  {
 /* The options of the GC_COMPONENT_DIRMNGR component.  */
 static gc_option_t gc_options_dirmngr[] =
  {
@@ -942,6 +958,7 @@ static gc_option_t gc_options_dirmngr[] =
 
    GC_OPTION_NULL
  };
 
    GC_OPTION_NULL
  };
+#endif /*BUILD_WITH_DIRMNGR*/
 
 
 /* The options of the GC_COMPONENT_PINENTRY component.  */
 
 
 /* The options of the GC_COMPONENT_PINENTRY component.  */