2001-11-11 Marcus Brinkmann <marcus@g10code.de>
authorMarcus Brinkmann <mb@g10code.com>
Sun, 11 Nov 2001 18:54:57 +0000 (18:54 +0000)
committerMarcus Brinkmann <mb@g10code.com>
Sun, 11 Nov 2001 18:54:57 +0000 (18:54 +0000)
* rungpg.c (_gpgme_gpg_release): Release GPG->cmd.cb_data.
Release all members of the list GPG->arglist.
Reported by Michael Schmidt <mschmidt@cs.uni-sb.de>.

gpgme/ChangeLog
gpgme/rungpg.c

index 8e932b9..664bab7 100644 (file)
@@ -1,3 +1,9 @@
+2001-11-11  Marcus Brinkmann  <marcus@g10code.de>
+
+       * rungpg.c (_gpgme_gpg_release): Release GPG->cmd.cb_data.
+       Release all members of the list GPG->arglist.
+       Reported by Michael Schmidt <mschmidt@cs.uni-sb.de>.
+
 2001-11-02  Marcus Brinkmann  <marcus@g10code.de>
 
        * rungpg.c (pipemode_copy): Change type of NBYTES to size_t.
index cbc727c..60cfa22 100644 (file)
@@ -244,45 +244,56 @@ _gpgme_gpg_new ( GpgObject *r_gpg )
 
 
 void
-_gpgme_gpg_release ( GpgObject gpg )
+_gpgme_gpg_release (GpgObject gpg)
 {
-    if ( !gpg )
-        return;
-    xfree (gpg->status.buffer);
-    xfree (gpg->colon.buffer);
-    if ( gpg->argv )
-        free_argv (gpg->argv);
-    xfree (gpg->cmd.keyword);
-
-    if (gpg->pid != -1) 
-        _gpgme_remove_proc_from_wait_queue ( gpg->pid );
-    if (gpg->status.fd[0] != -1 )
-        _gpgme_io_close (gpg->status.fd[0]);
-    if (gpg->status.fd[1] != -1 )
-        _gpgme_io_close (gpg->status.fd[1]);
-    if (gpg->colon.fd[0] != -1 )
-        _gpgme_io_close (gpg->colon.fd[0]);
-    if (gpg->colon.fd[1] != -1 )
-        _gpgme_io_close (gpg->colon.fd[1]);
-    free_fd_data_map (gpg->fd_data_map);
-    if (gpg->running) {
-        int pid = gpg->pid;
-        struct reap_s *r;
-
-        /* resuse the memory, so that we don't need to allocate another
-         * mem block and have to handle errors */
-        assert (sizeof *r < sizeof *gpg );
-        r = (void*)gpg;
-        memset (r, 0, sizeof *r);
-        r->pid = pid;
-        r->entered = time (NULL);
-        LOCK(reap_list_lock);
-        r->next = reap_list;
-        reap_list = r;
-        UNLOCK(reap_list_lock);
+  if (!gpg)
+    return;
+
+  while (gpg->arglist)
+    {
+      struct arg_and_data_s *next = gpg->arglist->next;
+
+      xfree (gpg->arglist);
+      gpg->arglist = next;
     }
-    else
-        xfree (gpg);
+
+  xfree (gpg->status.buffer);
+  xfree (gpg->colon.buffer);
+  if (gpg->argv)
+    free_argv (gpg->argv);
+  xfree (gpg->cmd.cb_data);
+  xfree (gpg->cmd.keyword);
+
+  if (gpg->pid != -1) 
+    _gpgme_remove_proc_from_wait_queue (gpg->pid);
+  if (gpg->status.fd[0] != -1)
+    _gpgme_io_close (gpg->status.fd[0]);
+  if (gpg->status.fd[1] != -1)
+    _gpgme_io_close (gpg->status.fd[1]);
+  if (gpg->colon.fd[0] != -1)
+    _gpgme_io_close (gpg->colon.fd[0]);
+  if (gpg->colon.fd[1] != -1)
+    _gpgme_io_close (gpg->colon.fd[1]);
+  free_fd_data_map (gpg->fd_data_map);
+  if (gpg->running)
+    {
+      int pid = gpg->pid;
+      struct reap_s *r;
+
+      /* Reuse the memory, so that we don't need to allocate another
+        memory block and to handle errors.  */
+      assert (sizeof *r < sizeof *gpg);
+      r = (void*)gpg;
+      memset (r, 0, sizeof *r);
+      r->pid = pid;
+      r->entered = time (NULL);
+      LOCK(reap_list_lock);
+      r->next = reap_list;
+      reap_list = r;
+      UNLOCK(reap_list_lock);
+    }
+  else
+    xfree (gpg);
 }