2009-04-02 Marcus Brinkmann <marcus@g10code.de>
[gpg4win.git] / patches / gnupg2-2.0.9 / 01-close-all-handle.patch
1 #! /bin/sh
2 patch -p0 -f $* < $0
3 exit $?
4
5
6 2008-04-01  Werner Koch  <wk@g10code.com>
7
8         * keybox-init.c (keybox_new, keybox_release): Track used handles.
9         (_keybox_close_file): New.
10         * keybox-update.c (keybox_insert_cert, keybox_set_flags) 
11         (keybox_delete, keybox_compress): Use the new close function.
12
13
14
15
16 Index: kbx/keybox-init.c
17 ===================================================================
18 --- kbx/keybox-init.c   (revision 4720)
19 +++ kbx/keybox-init.c   (working copy)
20 @@ -30,10 +30,9 @@
21  static KB_NAME kb_names;
22  
23  
24 -/* 
25 -  Register a filename for plain keybox files.  Returns a pointer to be
26 -  used to create a handles etc or NULL to indicate that it has already
27 -  been registered */
28 +/* Register a filename for plain keybox files.  Returns a pointer to
29 +   be used to create a handles and so on.  Returns NULL to indicate
30 +   that FNAME has already been registered.  */
31  void *
32  keybox_register_file (const char *fname, int secret)
33  {
34 @@ -50,6 +49,10 @@
35      return NULL;
36    strcpy (kr->fname, fname);
37    kr->secret = !!secret;
38 +
39 +  kr->handle_table = NULL;
40 +  kr->handle_table_size = 0;
41 +
42    /* kr->lockhd = NULL;*/
43    kr->is_locked = 0;
44    kr->did_full_scan = 0;
45 @@ -83,6 +86,7 @@
46  {
47    KEYBOX_HANDLE hd;
48    KB_NAME resource = token;
49 +  int idx;
50  
51    assert (resource && !resource->secret == !secret);
52    hd = xtrycalloc (1, sizeof *hd);
53 @@ -90,6 +94,43 @@
54      {
55        hd->kb = resource;
56        hd->secret = !!secret;
57 +      if (!resource->handle_table)
58 +        {
59 +          resource->handle_table_size = 3;
60 +          resource->handle_table = xtrycalloc (resource->handle_table_size,
61 +                                               sizeof *resource->handle_table);
62 +          if (!resource->handle_table)
63 +            {
64 +              resource->handle_table_size = 0;
65 +              xfree (hd);
66 +              return NULL;
67 +            }
68 +        }
69 +      for (idx=0; idx < resource->handle_table_size; idx++)
70 +        if (!resource->handle_table[idx])
71 +          {
72 +            resource->handle_table[idx] = hd;
73 +            break;
74 +          }
75 +      if (!(idx < resource->handle_table_size))
76 +        {
77 +          KEYBOX_HANDLE *tmptbl;
78 +          size_t newsize;
79 +
80 +          newsize = resource->handle_table_size + 5;
81 +          tmptbl = xtryrealloc (resource->handle_table, 
82 +                                newsize * sizeof (*tmptbl));
83 +          if (!tmptbl)
84 +            {
85 +              xfree (hd);
86 +              return NULL;
87 +            }
88 +          resource->handle_table = tmptbl;
89 +          resource->handle_table_size = newsize;
90 +          resource->handle_table[idx] = hd;
91 +          for (idx++; idx < resource->handle_table_size; idx++)
92 +            resource->handle_table[idx] = NULL;
93 +        }
94      }
95    return hd;
96  }
97 @@ -99,6 +140,13 @@
98  {
99    if (!hd)
100      return;
101 +  if (hd->kb->handle_table)
102 +    {
103 +      int idx;
104 +      for (idx=0; idx < hd->kb->handle_table_size; idx++)
105 +        if (hd->kb->handle_table[idx] == hd)
106 +          hd->kb->handle_table[idx] = NULL;
107 +    }
108    _keybox_release_blob (hd->found.blob);
109    if (hd->fp)
110      {
111 @@ -128,3 +176,27 @@
112    return 0;
113  }
114  
115 +
116 +/* Close the file of the resource identified by HD.  For consistent
117 +   results this fucntion closes the files of all handles pointing to
118 +   the resource identified by HD.  */
119 +void 
120 +_keybox_close_file (KEYBOX_HANDLE hd)
121 +{
122 +  int idx;
123 +  KEYBOX_HANDLE roverhd;
124 +
125 +  if (!hd || !hd->kb || !hd->kb->handle_table)
126 +    return;
127 +
128 +  for (idx=0; idx < hd->kb->handle_table_size; idx++)
129 +    if ((roverhd = hd->kb->handle_table[idx]))
130 +      {
131 +        if (roverhd->fp)
132 +          {
133 +            fclose (roverhd->fp);
134 +            roverhd->fp = NULL;
135 +          }
136 +      }
137 +  assert (!hd->fp);
138 +}
139 Index: kbx/keybox-search.c
140 ===================================================================
141 --- kbx/keybox-search.c (revision 4720)
142 +++ kbx/keybox-search.c (working copy)
143 @@ -458,7 +458,7 @@
144  #ifdef KEYBOX_WITH_X509
145  /* Return true if the key in BLOB matches the 20 bytes keygrip GRIP.
146     We don't have the keygrips as meta data, thus wen need to parse the
147 -   certificate. Fixme: We might wat to return proper error codes
148 +   certificate. Fixme: We might want to return proper error codes
149     instead of failing a search for invalid certificates etc.  */
150  static int
151  blob_x509_has_grip (KEYBOXBLOB blob, const unsigned char *grip)
152 @@ -750,10 +750,10 @@
153          }
154      }
155  
156 -  /* kludge: we need to convert an SN given as hexstring to it's
157 -     binary representation - in some cases we are not able to store it
158 -     in the search descriptor, because due to its usage it is not
159 -     possible to free allocated memory */
160 +  /* Kludge: We need to convert an SN given as hexstring to its binary
161 +     representation - in some cases we are not able to store it in the
162 +     search descriptor, because due to the way we use it, it is not
163 +     possible to free allocated memory. */
164    if (sn_array)
165      {
166        const unsigned char *s;
167 Index: kbx/keybox-update.c
168 ===================================================================
169 --- kbx/keybox-update.c (revision 4720)
170 +++ kbx/keybox-update.c (working copy)
171 @@ -136,7 +136,7 @@
172        xfree (bakfname);
173        return tmperr;
174      }
175 -  
176 +
177    *r_bakfname = bakfname;
178    *r_tmpfname = tmpfname;
179    return 0;
180 @@ -167,7 +167,7 @@
181  /*    iobuf_ioctl (NULL, 2, 0, (char*)bakfname ); */
182  /*    iobuf_ioctl (NULL, 2, 0, (char*)fname ); */
183  
184 -  /* first make a backup file except for secret keyboxs */
185 +  /* First make a backup file except for secret keyboxes. */
186    if (!secret)
187      { 
188  #if defined(HAVE_DOSISH_SYSTEM) || defined(__riscos__)
189 @@ -179,7 +179,7 @@
190         }
191      }
192    
193 -  /* then rename the file */
194 +  /* Then rename the file. */
195  #if defined(HAVE_DOSISH_SYSTEM) || defined(__riscos__)
196    remove (fname);
197  #endif
198 @@ -386,12 +386,8 @@
199  
200    /* Close this one otherwise we will mess up the position for a next
201       search.  Fixme: it would be better to adjust the position after
202 -     the write opertions.  */
203 -  if (hd->fp)
204 -    {
205 -      fclose (hd->fp);
206 -      hd->fp = NULL;
207 -    }
208 +     the write operation.  */
209 +  _keybox_close_file (hd);
210  
211    rc = _keybox_create_x509_blob (&blob, cert, sha1_digest, hd->ephemeral);
212    if (!rc)
213 @@ -453,11 +449,7 @@
214    
215    off += flag_pos;
216  
217 -  if (hd->fp)
218 -    {
219 -      fclose (hd->fp);
220 -      hd->fp = NULL;
221 -    }
222 +  _keybox_close_file (hd);
223    fp = fopen (hd->kb->fname, "r+b");
224    if (!fp)
225      return gpg_error (gpg_err_code_from_errno (errno));
226 @@ -522,12 +514,7 @@
227      return gpg_error (GPG_ERR_GENERAL);
228    off += 4;
229  
230 -  if (hd->fp)
231 -    {
232 -      fclose (hd->fp);
233 -      hd->fp = NULL;
234 -    }
235 -  
236 +  _keybox_close_file (hd);
237    fp = fopen (hd->kb->fname, "r+b");
238    if (!fp)
239      return gpg_error (gpg_err_code_from_errno (errno));
240 @@ -575,11 +562,7 @@
241    if (!fname)
242      return gpg_error (GPG_ERR_INV_HANDLE); 
243  
244 -  if (hd->fp)
245 -    {
246 -      fclose (hd->fp);
247 -      hd->fp = NULL;
248 -    }
249 +  _keybox_close_file (hd);
250  
251    /* Open the source file. Because we do a rename, we have to check the 
252       permissions of the file */
253 Index: kbx/keybox-defs.h
254 ===================================================================
255 --- kbx/keybox-defs.h   (revision 4720)
256 +++ kbx/keybox-defs.h   (working copy)
257 @@ -53,13 +53,31 @@
258  
259  
260  typedef struct keybox_name *KB_NAME;
261 -typedef struct keybox_name const * CONST_KB_NAME;
262 -struct keybox_name {
263 -  struct keybox_name *next;
264 +typedef struct keybox_name const *CONST_KB_NAME;
265 +struct keybox_name 
266 +{
267 +  /* Link to the next resources, so that we can walk all
268 +     resources.  */
269 +  KB_NAME next;
270 +
271 +  /* True if this is a keybox with secret keys.  */
272    int secret;
273 +
274    /*DOTLOCK lockhd;*/
275 +
276 +  /* A table with all the handles accessing this resources.
277 +     HANDLE_TABLE_SIZE gives the allocated length of this table unused
278 +     entrues are set to NULL.  HANDLE_TABLE may be NULL. */
279 +  KEYBOX_HANDLE *handle_table;
280 +  size_t handle_table_size;
281 +  
282 +  /* Not yet used.  */
283    int is_locked;
284 +
285 +  /* Not yet used.  */
286    int did_full_scan;
287 +
288 +  /* The name of the resource file. */
289    char fname[1];
290  };
291  
292 @@ -129,7 +147,10 @@
293  /*    int preserve_permissions; */
294  /*  } keybox_opt; */
295  
296 +/*-- keybox-init.c --*/
297 +void _keybox_close_file (KEYBOX_HANDLE hd);
298  
299 +
300  /*-- keybox-blob.c --*/
301  #ifdef KEYBOX_WITH_OPENPGP
302    /* fixme */
303
304
305
306