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>.
This commit is contained in:
Marcus Brinkmann 2001-11-11 18:54:57 +00:00
parent 1ecdde3ced
commit 49a25a82e2
2 changed files with 52 additions and 35 deletions

View 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> 2001-11-02 Marcus Brinkmann <marcus@g10code.de>
* rungpg.c (pipemode_copy): Change type of NBYTES to size_t. * rungpg.c (pipemode_copy): Change type of NBYTES to size_t.

View File

@ -244,45 +244,56 @@ _gpgme_gpg_new ( GpgObject *r_gpg )
void void
_gpgme_gpg_release ( GpgObject gpg ) _gpgme_gpg_release (GpgObject gpg)
{ {
if ( !gpg ) if (!gpg)
return; return;
xfree (gpg->status.buffer);
xfree (gpg->colon.buffer);
if ( gpg->argv )
free_argv (gpg->argv);
xfree (gpg->cmd.keyword);
if (gpg->pid != -1) while (gpg->arglist)
_gpgme_remove_proc_from_wait_queue ( gpg->pid ); {
if (gpg->status.fd[0] != -1 ) struct arg_and_data_s *next = gpg->arglist->next;
_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 xfree (gpg->arglist);
* mem block and have to handle errors */ gpg->arglist = next;
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); 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);
} }