Extend patch
[gpg4win.git] / patches / dirmngr-1.1.0 / 01-mmap.patch
1 #! /bin/sh
2 patch -p0 -f $* < $0
3 exit $?
4
5 src/
6 2010-12-14  Werner Koch  <wk@g10code.com>
7
8         * cdb.h (struct cdb) [W32]: Add field CDB_MAPPING.
9         * cdblib.c (cdb_init) [W32]: Save mapping handle.
10         (cdb_free) [W32]: Don't leak the mapping handle from cdb_init by
11         using the saved one.  Fixes bug#1010.
12
13 src/
14 2010-12-17 Werner Koch  <wk@g10code.com>
15
16         * crlcache.c (crl_cache_insert): Try to close unused but open
17         cache files.  Backported from GnuPG trunk.
18
19
20 --- src/cdblib.c        (revision 345)
21 +++ src/cdblib.c        (working copy)
22 @@ -138,6 +138,7 @@
23    mem = (unsigned char *)MapViewOfFile(hMapping, FILE_MAP_READ, 0, 0, 0);
24    if (!mem)
25      return -1;
26 +  cdbp->cdb_mapping = hMapping;
27  #else
28    mem = (unsigned char*)mmap(NULL, fsize, PROT_READ, MAP_SHARED, fd, 0);
29    if (mem == MAP_FAILED)
30 @@ -174,13 +175,9 @@
31  {
32    if (cdbp->cdb_mem) {
33  #ifdef _WIN32
34 -    HANDLE hFile, hMapping;
35 -#endif
36 -#ifdef _WIN32
37 -    hFile = (HANDLE) _get_osfhandle(cdbp->cdb_fd);
38 -    hMapping = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
39      UnmapViewOfFile((void*) cdbp->cdb_mem);
40 -    CloseHandle(hMapping);
41 +    CloseHandle (cdbp->cdb_mapping);
42 +    cdbp->cdb_mapping = NULL;
43  #else
44      munmap((void*)cdbp->cdb_mem, cdbp->cdb_fsize);
45  #endif /* _WIN32 */
46
47
48 --- src/cdb.h   (revision 345)
49 +++ src/cdb.h   (working copy)
50 @@ -20,6 +20,9 @@
51  struct cdb {
52    int cdb_fd;                  /* file descriptor */
53    /* private members */
54 +#ifdef HAVE_W32_SYSTEM
55 +  void *cdb_mapping;            /* Mapping handle.  */
56 +#endif
57    cdbi_t cdb_fsize;            /* datafile size */
58    const unsigned char *cdb_mem; /* mmap'ed file memory */
59    cdbi_t cdb_vpos, cdb_vlen;   /* found data */
60
61
62 --- src/crlcache.c~     2009-08-07 14:00:17.000000000 +0200
63 +++ src/crlcache.c      2010-12-17 16:42:13.000000000 +0100
64 @@ -2166,6 +2166,32 @@ crl_cache_insert (ctrl_t ctrl, const cha
65    newfname = make_db_file_name (entry->issuer_hash);
66    if (opt.verbose)
67      log_info (_("creating cache file `%s'\n"), newfname);
68 +
69 +  /* Just in case close unused matching files.  Actually we need this
70 +     only under Windows but saving file descriptors is never bad.  */
71 +  {
72 +    int any;
73 +    do 
74 +      {
75 +        any = 0;
76 +        for (e = cache->entries; e; e = e->next)
77 +          if (!e->cdb_use_count && e->cdb
78 +              && !strcmp (e->issuer_hash, entry->issuer_hash))
79 +            {
80 +              int fd = cdb_fileno (e->cdb);
81 +              cdb_free (e->cdb);
82 +              xfree (e->cdb);
83 +              e->cdb = NULL;
84 +              if (close (fd))
85 +                log_error (_("error closing cache file: %s\n"),
86 +                           strerror(errno));
87 +              any = 1;
88 +              break;
89 +            }
90 +      }
91 +    while (any);
92 +  }
93 +
94  #ifdef HAVE_W32_SYSTEM
95    unlink (newfname);
96  #endif
97