diff --git a/gpgme/ChangeLog b/gpgme/ChangeLog index 8e932b98..664bab76 100644 --- a/gpgme/ChangeLog +++ b/gpgme/ChangeLog @@ -1,3 +1,9 @@ +2001-11-11 Marcus Brinkmann + + * rungpg.c (_gpgme_gpg_release): Release GPG->cmd.cb_data. + Release all members of the list GPG->arglist. + Reported by Michael Schmidt . + 2001-11-02 Marcus Brinkmann * rungpg.c (pipemode_copy): Change type of NBYTES to size_t. diff --git a/gpgme/rungpg.c b/gpgme/rungpg.c index cbc727c0..60cfa225 100644 --- a/gpgme/rungpg.c +++ b/gpgme/rungpg.c @@ -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) + return; - 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; + while (gpg->arglist) + { + struct arg_and_data_s *next = gpg->arglist->next; - /* 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); + 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); }