mirror of
git://git.gnupg.org/gnupg.git
synced 2024-12-22 10:19:57 +01:00
kbx: Fix a race condition which results no status report.
* kbx/keyboxd.h (kbxd_status_printf): New. * kbx/backend-support.c (be_return_pubkey): Use kbxd_status_printf. * kbx/kbxserver.c (kbxd_status_printf): New. * kbxd_start_command_handler (kbxd_start_command_handler): Don't use set_assuan_context_func, because the function pointer is shared by multiple threads. -- GnuPG-bug-id: 5948 Signed-off-by: NIIBE Yutaka <gniibe@fsij.org>
This commit is contained in:
parent
35b1755070
commit
bd5dbdb813
@ -173,7 +173,7 @@ be_return_pubkey (ctrl_t ctrl, const void *buffer, size_t buflen,
|
||||
char hexubid[2*UBID_LEN+1];
|
||||
|
||||
bin2hex (ubid, UBID_LEN, hexubid);
|
||||
err = status_printf (ctrl, "PUBKEY_INFO", "%d %s %c%c %d %d",
|
||||
err = kbxd_status_printf (ctrl, "PUBKEY_INFO", "%d %s %c%c %d %d",
|
||||
pubkey_type, hexubid,
|
||||
is_ephemeral? 'e':'-',
|
||||
is_revoked? 'r':'-',
|
||||
@ -184,7 +184,7 @@ be_return_pubkey (ctrl_t ctrl, const void *buffer, size_t buflen,
|
||||
if (ctrl->no_data_return)
|
||||
err = 0;
|
||||
else
|
||||
err = kbxd_write_data_line(ctrl, buffer, buflen);
|
||||
err = kbxd_write_data_line (ctrl, buffer, buflen);
|
||||
|
||||
leave:
|
||||
return err;
|
||||
|
@ -173,6 +173,23 @@ kbxd_writen (estream_t fp, const void *buffer, size_t length)
|
||||
return err;
|
||||
}
|
||||
|
||||
/* This status functions expects a printf style format string. */
|
||||
gpg_error_t
|
||||
kbxd_status_printf (ctrl_t ctrl, const char *keyword, const char *format, ...)
|
||||
{
|
||||
gpg_error_t err;
|
||||
va_list arg_ptr;
|
||||
assuan_context_t ctx = get_assuan_ctx_from_ctrl (ctrl);
|
||||
|
||||
if (!ctx) /* Oops - no assuan context. */
|
||||
return gpg_error (GPG_ERR_NOT_PROCESSED);
|
||||
|
||||
va_start (arg_ptr, format);
|
||||
err = vprint_assuan_status (ctx, keyword, format, arg_ptr);
|
||||
va_end (arg_ptr);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
/* A wrapper around assuan_send_data which makes debugging the output
|
||||
* in verbose mode easier. It also takes CTRL as argument. */
|
||||
@ -975,10 +992,6 @@ kbxd_start_command_handler (ctrl_t ctrl, gnupg_fd_t fd, unsigned int session_id)
|
||||
ctrl->server_local->next_session = session_list;
|
||||
session_list = ctrl->server_local;
|
||||
|
||||
|
||||
/* The next call enable the use of status_printf. */
|
||||
set_assuan_context_func (get_assuan_ctx_from_ctrl);
|
||||
|
||||
for (;;)
|
||||
{
|
||||
rc = assuan_accept (ctx);
|
||||
@ -1029,7 +1042,6 @@ kbxd_start_command_handler (ctrl_t ctrl, gnupg_fd_t fd, unsigned int session_id)
|
||||
|
||||
assuan_close_output_fd (ctx);
|
||||
|
||||
set_assuan_context_func (NULL);
|
||||
ctrl->server_local->assuan_ctx = NULL;
|
||||
assuan_release (ctx);
|
||||
|
||||
|
@ -171,6 +171,8 @@ void kbxd_sighup_action (void);
|
||||
|
||||
|
||||
/*-- kbxserver.c --*/
|
||||
gpg_error_t kbxd_status_printf (ctrl_t ctrl, const char *keyword,
|
||||
const char *format, ...);
|
||||
gpg_error_t kbxd_write_data_line (ctrl_t ctrl,
|
||||
const void *buffer_arg, size_t size);
|
||||
void kbxd_start_command_handler (ctrl_t, gnupg_fd_t, unsigned int);
|
||||
|
Loading…
x
Reference in New Issue
Block a user