gpgme-tool: Fix handling of file descriptors
* src/gpgme-tool.c (server_reset_fds): Use close/CloseHandle instead of the assuan close functions. (_cmd_decrypt_verify, _cmd_sign_encrypt, cmd_verify, cmd_import) (cmd_export, cmd_genkey, cmd_getauditlog): Use SERVER object instead of assuan_get_*_fd functions. -- Although we used our own handlers for INPUT and OUTPUT, we still used assuan_get_input_fd, assuan_get_output_fd and their close functions. That clearly can't work because libassuan does not have any values for them.
This commit is contained in:
parent
d230b7c2f9
commit
193eb62538
@ -1900,7 +1900,10 @@ server_write_data (void *hook, const void *buf, size_t len)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Wrapper around assuan_command_parse_fd to also handle a
|
||||||
|
"file=FILENAME" argument. On success either a filename is returned
|
||||||
|
at FILENAME or a file descriptor at RFD; the other one is set to
|
||||||
|
NULL respective ASSUAN_INVALID_FD. */
|
||||||
static gpg_error_t
|
static gpg_error_t
|
||||||
server_parse_fd (assuan_context_t ctx, char *line, assuan_fd_t *rfd,
|
server_parse_fd (assuan_context_t ctx, char *line, assuan_fd_t *rfd,
|
||||||
char **filename)
|
char **filename)
|
||||||
@ -1974,8 +1977,24 @@ server_reset_fds (struct server *server)
|
|||||||
/* assuan closes the input and output FDs for us when doing a RESET,
|
/* assuan closes the input and output FDs for us when doing a RESET,
|
||||||
but we use this same function after commands, so repeat it
|
but we use this same function after commands, so repeat it
|
||||||
here. */
|
here. */
|
||||||
assuan_close_input_fd (server->assuan_ctx);
|
if (server->input_fd != ASSUAN_INVALID_FD)
|
||||||
assuan_close_output_fd (server->assuan_ctx);
|
{
|
||||||
|
#if HAVE_W32_SYSTEM
|
||||||
|
CloseHandle (server->input_fd);
|
||||||
|
#else
|
||||||
|
close (server->input_fd);
|
||||||
|
#endif
|
||||||
|
server->input_fd = ASSUAN_INVALID_FD;
|
||||||
|
}
|
||||||
|
if (server->output_fd != ASSUAN_INVALID_FD)
|
||||||
|
{
|
||||||
|
#if HAVE_W32_SYSTEM
|
||||||
|
CloseHandle (server->output_fd);
|
||||||
|
#else
|
||||||
|
close (server->output_fd);
|
||||||
|
#endif
|
||||||
|
server->output_fd = ASSUAN_INVALID_FD;
|
||||||
|
}
|
||||||
if (server->message_fd != ASSUAN_INVALID_FD)
|
if (server->message_fd != ASSUAN_INVALID_FD)
|
||||||
{
|
{
|
||||||
/* FIXME: Assuan should provide a close function. */
|
/* FIXME: Assuan should provide a close function. */
|
||||||
@ -2331,11 +2350,11 @@ _cmd_decrypt_verify (assuan_context_t ctx, char *line, int verify)
|
|||||||
gpgme_data_t inp_data;
|
gpgme_data_t inp_data;
|
||||||
gpgme_data_t out_data;
|
gpgme_data_t out_data;
|
||||||
|
|
||||||
inp_fd = assuan_get_input_fd (ctx);
|
inp_fd = server->input_fd;
|
||||||
inp_fn = server->input_filename;
|
inp_fn = server->input_filename;
|
||||||
if (inp_fd == ASSUAN_INVALID_FD && !inp_fn)
|
if (inp_fd == ASSUAN_INVALID_FD && !inp_fn)
|
||||||
return GPG_ERR_ASS_NO_INPUT;
|
return GPG_ERR_ASS_NO_INPUT;
|
||||||
out_fd = assuan_get_output_fd (ctx);
|
out_fd = server->output_fd;
|
||||||
out_fn = server->output_filename;
|
out_fn = server->output_filename;
|
||||||
if (out_fd == ASSUAN_INVALID_FD && !out_fn)
|
if (out_fd == ASSUAN_INVALID_FD && !out_fn)
|
||||||
return GPG_ERR_ASS_NO_OUTPUT;
|
return GPG_ERR_ASS_NO_OUTPUT;
|
||||||
@ -2411,9 +2430,9 @@ _cmd_sign_encrypt (assuan_context_t ctx, char *line, int sign)
|
|||||||
if (strstr (line, "--expect-sign"))
|
if (strstr (line, "--expect-sign"))
|
||||||
flags |= GPGME_ENCRYPT_EXPECT_SIGN;
|
flags |= GPGME_ENCRYPT_EXPECT_SIGN;
|
||||||
|
|
||||||
inp_fd = assuan_get_input_fd (ctx);
|
inp_fd = server->input_fd;
|
||||||
inp_fn = server->input_filename;
|
inp_fn = server->input_filename;
|
||||||
out_fd = assuan_get_output_fd (ctx);
|
out_fd = server->output_fd;
|
||||||
out_fn = server->output_filename;
|
out_fn = server->output_filename;
|
||||||
if (inp_fd != ASSUAN_INVALID_FD || inp_fn)
|
if (inp_fd != ASSUAN_INVALID_FD || inp_fn)
|
||||||
{
|
{
|
||||||
@ -2502,11 +2521,11 @@ cmd_sign (assuan_context_t ctx, char *line)
|
|||||||
if (strstr (line, "--detach"))
|
if (strstr (line, "--detach"))
|
||||||
mode = GPGME_SIG_MODE_DETACH;
|
mode = GPGME_SIG_MODE_DETACH;
|
||||||
|
|
||||||
inp_fd = assuan_get_input_fd (ctx);
|
inp_fd = server->input_fd;
|
||||||
inp_fn = server->input_filename;
|
inp_fn = server->input_filename;
|
||||||
if (inp_fd == ASSUAN_INVALID_FD && !inp_fn)
|
if (inp_fd == ASSUAN_INVALID_FD && !inp_fn)
|
||||||
return GPG_ERR_ASS_NO_INPUT;
|
return GPG_ERR_ASS_NO_INPUT;
|
||||||
out_fd = assuan_get_output_fd (ctx);
|
out_fd = server->output_fd;
|
||||||
out_fn = server->output_filename;
|
out_fn = server->output_filename;
|
||||||
if (out_fd == ASSUAN_INVALID_FD && !out_fn)
|
if (out_fd == ASSUAN_INVALID_FD && !out_fn)
|
||||||
return GPG_ERR_ASS_NO_OUTPUT;
|
return GPG_ERR_ASS_NO_OUTPUT;
|
||||||
@ -2555,13 +2574,13 @@ cmd_verify (assuan_context_t ctx, char *line)
|
|||||||
gpgme_data_t msg_data = NULL;
|
gpgme_data_t msg_data = NULL;
|
||||||
gpgme_data_t out_data = NULL;
|
gpgme_data_t out_data = NULL;
|
||||||
|
|
||||||
inp_fd = assuan_get_input_fd (ctx);
|
inp_fd = server->input_fd;
|
||||||
inp_fn = server->input_filename;
|
inp_fn = server->input_filename;
|
||||||
if (inp_fd == ASSUAN_INVALID_FD && !inp_fn)
|
if (inp_fd == ASSUAN_INVALID_FD && !inp_fn)
|
||||||
return GPG_ERR_ASS_NO_INPUT;
|
return GPG_ERR_ASS_NO_INPUT;
|
||||||
msg_fd = server->message_fd;
|
msg_fd = server->message_fd;
|
||||||
msg_fn = server->message_filename;
|
msg_fn = server->message_filename;
|
||||||
out_fd = assuan_get_output_fd (ctx);
|
out_fd = server->output_fd;
|
||||||
out_fn = server->output_filename;
|
out_fn = server->output_filename;
|
||||||
|
|
||||||
err = server_data_obj (inp_fd, inp_fn, 0, server->input_enc, &inp_data,
|
err = server_data_obj (inp_fd, inp_fn, 0, server->input_enc, &inp_data,
|
||||||
@ -2628,7 +2647,7 @@ cmd_import (assuan_context_t ctx, char *line)
|
|||||||
char *inp_fn;
|
char *inp_fn;
|
||||||
gpgme_data_t inp_data;
|
gpgme_data_t inp_data;
|
||||||
|
|
||||||
inp_fd = assuan_get_input_fd (ctx);
|
inp_fd = server->input_fd;
|
||||||
inp_fn = server->input_filename;
|
inp_fn = server->input_filename;
|
||||||
if (inp_fd == ASSUAN_INVALID_FD && !inp_fn)
|
if (inp_fd == ASSUAN_INVALID_FD && !inp_fn)
|
||||||
return GPG_ERR_ASS_NO_INPUT;
|
return GPG_ERR_ASS_NO_INPUT;
|
||||||
@ -2664,7 +2683,7 @@ cmd_export (assuan_context_t ctx, char *line)
|
|||||||
gpgme_export_mode_t mode = 0;
|
gpgme_export_mode_t mode = 0;
|
||||||
const char *pattern[2];
|
const char *pattern[2];
|
||||||
|
|
||||||
out_fd = assuan_get_output_fd (ctx);
|
out_fd = server->output_fd;
|
||||||
out_fn = server->output_filename;
|
out_fn = server->output_filename;
|
||||||
if (out_fd == ASSUAN_INVALID_FD && !out_fn)
|
if (out_fd == ASSUAN_INVALID_FD && !out_fn)
|
||||||
return GPG_ERR_ASS_NO_OUTPUT;
|
return GPG_ERR_ASS_NO_OUTPUT;
|
||||||
@ -2724,11 +2743,11 @@ cmd_genkey (assuan_context_t ctx, char *line)
|
|||||||
gpgme_data_t parms_data = NULL;
|
gpgme_data_t parms_data = NULL;
|
||||||
const char *parms;
|
const char *parms;
|
||||||
|
|
||||||
inp_fd = assuan_get_input_fd (ctx);
|
inp_fd = server->input_fd;
|
||||||
inp_fn = server->input_filename;
|
inp_fn = server->input_filename;
|
||||||
if (inp_fd == ASSUAN_INVALID_FD && !inp_fn)
|
if (inp_fd == ASSUAN_INVALID_FD && !inp_fn)
|
||||||
return GPG_ERR_ASS_NO_INPUT;
|
return GPG_ERR_ASS_NO_INPUT;
|
||||||
out_fd = assuan_get_output_fd (ctx);
|
out_fd = server->output_fd;
|
||||||
out_fn = server->output_filename;
|
out_fn = server->output_filename;
|
||||||
|
|
||||||
err = server_data_obj (inp_fd, inp_fn, 0, server->input_enc, &inp_data,
|
err = server_data_obj (inp_fd, inp_fn, 0, server->input_enc, &inp_data,
|
||||||
@ -2899,7 +2918,7 @@ cmd_getauditlog (assuan_context_t ctx, char *line)
|
|||||||
gpgme_data_t out_data;
|
gpgme_data_t out_data;
|
||||||
unsigned int flags = 0;
|
unsigned int flags = 0;
|
||||||
|
|
||||||
out_fd = assuan_get_output_fd (ctx);
|
out_fd = server->output_fd;
|
||||||
out_fn = server->output_filename;
|
out_fn = server->output_filename;
|
||||||
if (out_fd == ASSUAN_INVALID_FD && !out_fn)
|
if (out_fd == ASSUAN_INVALID_FD && !out_fn)
|
||||||
return GPG_ERR_ASS_NO_OUTPUT;
|
return GPG_ERR_ASS_NO_OUTPUT;
|
||||||
|
Loading…
Reference in New Issue
Block a user