diff options
| -rw-r--r-- | gpgme/ChangeLog | 16 | ||||
| -rw-r--r-- | gpgme/engine-gpgsm.c | 85 | ||||
| -rw-r--r-- | gpgme/posix-io.c | 17 | 
3 files changed, 84 insertions, 34 deletions
diff --git a/gpgme/ChangeLog b/gpgme/ChangeLog index bf9796d2..c3144523 100644 --- a/gpgme/ChangeLog +++ b/gpgme/ChangeLog @@ -1,3 +1,19 @@ +2001-12-13  Marcus Brinkmann  <[email protected]> + +	* engine-gpgsm.c (close_notify_handler): New function. +	(_gpgme_gpgsm_new): Manage the file descriptors a +	bit differently.  Do not set close-on-exec flags. +	(_gpgme_gpgsm_op_decrypt): Do not set message_fd +	to -1, this is done by the close handler. +	(_gpgme_gpgsm_op_encrypt): Likewise. +	(_gpgme_gpgsm_op_import): Likewise (also for output_fd). +	(_gpgme_gpgsm_op_keylist): Likewise (also for input_fd and output_fd). +	(_gpgme_gpgsm_op_sign): Likewise. +	(_gpgme_gpgsm_op_verify): Likewise, but for output_fd. + +	* posix-io.c (_gpgme_io_pipe): Set the close-on-exec flag for the +	non-inherited file descriptor index of the pipe. +  2001-12-13  Werner Koch  <[email protected]>  	* engine-gpgsm.c (_gpgme_gpgsm_set_colon_line_handler): New. diff --git a/gpgme/engine-gpgsm.c b/gpgme/engine-gpgsm.c index 38ce87d8..776ef0b0 100644 --- a/gpgme/engine-gpgsm.c +++ b/gpgme/engine-gpgsm.c @@ -107,59 +107,91 @@ _gpgme_gpgsm_check_version (void)      ? 0 : mk_error (Invalid_Engine);  } +static void +close_notify_handler (int fd, void *opaque) +{ +  GpgsmObject gpgsm = opaque; + +  assert (fd != -1); +  if (gpgsm->input_fd == fd) +    gpgsm->input_fd = -1; +  else if (gpgsm->output_fd == fd) +    gpgsm->output_fd = -1; +  else if (gpgsm->message_fd == fd) +    gpgsm->message_fd = -1; +} +  GpgmeError  _gpgme_gpgsm_new (GpgsmObject *r_gpgsm)  {    GpgmeError err = 0;    GpgsmObject gpgsm;    char *argv[] = { "gpgsm", "--server", NULL }; -  int ip[2] = { -1, -1 }; -  int op[2] = { -1, -1 }; -  int mp[2] = { -1, -1 }; +  int fds[2];    *r_gpgsm = NULL;    gpgsm = xtrycalloc (1, sizeof *gpgsm);    if (!gpgsm)      {        err = mk_error (Out_Of_Core); -      goto leave; +      return err;      } -  if (_gpgme_io_pipe (ip, 0) < 0) +  gpgsm->input_fd = -1; +  gpgsm->input_fd_server = -1; +  gpgsm->output_fd = -1; +  gpgsm->output_fd_server = -1; +  gpgsm->message_fd = -1; +  gpgsm->message_fd_server = -1; + +  if (_gpgme_io_pipe (fds, 0) < 0)      {        err = mk_error (General_Error);        goto leave;      } -  gpgsm->input_fd = ip[1]; -  fcntl (ip[1], F_SETFD, FD_CLOEXEC); /* FIXME */ -  gpgsm->input_fd_server = ip[0]; -  if (_gpgme_io_pipe (op, 1) < 0) +  gpgsm->input_fd = fds[1]; +  gpgsm->input_fd_server = fds[0]; + +  if (_gpgme_io_pipe (fds, 1) < 0)      {        err = mk_error (General_Error);        goto leave;      } -  gpgsm->output_fd = op[0]; -  fcntl (op[0], F_SETFD, FD_CLOEXEC); /* FIXME */ -  gpgsm->output_fd_server = op[1]; -  if (_gpgme_io_pipe (mp, 0) < 0) +  gpgsm->output_fd = fds[0]; +  gpgsm->output_fd_server = fds[1]; + +  if (_gpgme_io_pipe (fds, 0) < 0)      {        err = mk_error (General_Error);        goto leave;      } -  gpgsm->message_fd = mp[1]; -  fcntl (mp[1], F_SETFD, FD_CLOEXEC); /* FIXME */ -  gpgsm->message_fd_server = mp[0]; +  gpgsm->message_fd = fds[1]; +  gpgsm->message_fd_server = fds[0];    err = assuan_pipe_connect (&gpgsm->assuan_ctx,  			     _gpgme_get_gpgsm_path (), argv); +  if (!err && +      (_gpgme_io_set_close_notify (gpgsm->input_fd, +				   close_notify_handler, gpgsm) +       || _gpgme_io_set_close_notify (gpgsm->output_fd, +				      close_notify_handler, gpgsm) +       || _gpgme_io_set_close_notify (gpgsm->message_fd, +				      close_notify_handler, gpgsm))) +    { +      err = mk_error (General_Error); +      goto leave; +    } +         leave: -  if (ip[0] != -1) -    _gpgme_io_close (ip[0]); -  if (op[1] != -1) -    _gpgme_io_close (op[1]); -  if (mp[0] != -1) -    _gpgme_io_close (mp[0]); +  /* Close the server ends of the pipes.  Our ends are closed in +     _gpgme_gpgsm_release.  */ +  if (gpgsm->input_fd_server != -1) +    _gpgme_io_close (gpgsm->input_fd_server); +  if (gpgsm->output_fd_server != -1) +    _gpgme_io_close (gpgsm->output_fd_server); +  if (gpgsm->message_fd_server != -1) +    _gpgme_io_close (gpgsm->message_fd_server);    if (err)      _gpgme_gpgsm_release (gpgsm); @@ -256,7 +288,6 @@ _gpgme_gpgsm_op_decrypt (GpgsmObject gpgsm, GpgmeData ciph, GpgmeData plain)    if (err)      return mk_error (General_Error);	/* FIXME */    _gpgme_io_close (gpgsm->message_fd); -  gpgsm->message_fd = -1;    return 0;  } @@ -330,7 +361,6 @@ _gpgme_gpgsm_op_encrypt (GpgsmObject gpgsm, GpgmeRecipients recp,    if (err)      return mk_error (General_Error);	/* FIXME */    _gpgme_io_close (gpgsm->message_fd); -  gpgsm->message_fd = -1;    err = gpgsm_set_recipients (gpgsm->assuan_ctx, recp);    if (err) @@ -371,9 +401,7 @@ _gpgme_gpgsm_op_import (GpgsmObject gpgsm, GpgmeData keydata)    if (err)      return mk_error (General_Error);	/* FIXME */    _gpgme_io_close (gpgsm->output_fd); -  gpgsm->output_fd = -1;    _gpgme_io_close (gpgsm->message_fd); -  gpgsm->message_fd = -1;    return 0;  } @@ -394,11 +422,8 @@ _gpgme_gpgsm_op_keylist (GpgsmObject gpgsm, const char *pattern,    strcpy (&line[9], pattern);    _gpgme_io_close (gpgsm->input_fd); -  gpgsm->input_fd = -1;    _gpgme_io_close (gpgsm->output_fd); -  gpgsm->output_fd = -1;    _gpgme_io_close (gpgsm->message_fd); -  gpgsm->message_fd = -1;    gpgsm->command = line;    return 0; @@ -429,7 +454,6 @@ _gpgme_gpgsm_op_sign (GpgsmObject gpgsm, GpgmeData in, GpgmeData out,    if (err)      return mk_error (General_Error);	/* FIXME */    _gpgme_io_close (gpgsm->message_fd); -  gpgsm->message_fd = -1;    return 0;  } @@ -463,7 +487,6 @@ _gpgme_gpgsm_op_verify (GpgsmObject gpgsm, GpgmeData sig, GpgmeData text)    if (err)      return mk_error (General_Error);	/* FIXME */    _gpgme_io_close (gpgsm->output_fd); -  gpgsm->output_fd = -1;    return 0;  } diff --git a/gpgme/posix-io.c b/gpgme/posix-io.c index 2043854e..eaa8950c 100644 --- a/gpgme/posix-io.c +++ b/gpgme/posix-io.c @@ -75,10 +75,21 @@ _gpgme_io_write ( int fd, const void *buffer, size_t count )  }  int -_gpgme_io_pipe ( int filedes[2], int inherit_idx ) +_gpgme_io_pipe (int filedes[2], int inherit_idx)  { -    /* we don't need inherit_idx in this implementation */ -    return pipe ( filedes ); +  int err; + +  err = pipe (filedes); +  if (err < 0) +    return err; +  /* FIXME: Should get the old flags first.  */ +  err = fcntl (filedes[1 - inherit_idx], F_SETFD, FD_CLOEXEC); +  if (err < 0) +    { +      close (filedes[0]); +      close (filedes[1]); +    } +  return err;  }  int  | 
