From 01fa318be0f8ca60c78d99403fbfb75edb521b16 Mon Sep 17 00:00:00 2001 From: NIIBE Yutaka Date: Mon, 17 Jun 2024 11:44:41 +0900 Subject: [PATCH] scd: Fix how scdaemon pipe server finishes. * scd/scdaemon.h (scd_command_handler): Fix the return type. * scd/command.c (scd_command_handler): Not return a value. * scd/scdaemon.c (pipe_server): Make it auto variable in main. (main): Use auto PIPE_SERVER variable. (start_connection_thread): When it's a pipe connection and it finishes, let the service shutdown. -- GnuPG-bug-id: 7151 Signed-off-by: NIIBE Yutaka --- scd/command.c | 8 ++------ scd/scdaemon.c | 13 +++++-------- scd/scdaemon.h | 2 +- 3 files changed, 8 insertions(+), 15 deletions(-) diff --git a/scd/command.c b/scd/command.c index 97e6accff..6e1a6e223 100644 --- a/scd/command.c +++ b/scd/command.c @@ -2475,9 +2475,8 @@ register_commands (assuan_context_t ctx) /* Startup the server. If FD is given as -1 this is simple pipe - server, otherwise it is a regular server. Returns true if there - are no more active asessions. */ -int + server, otherwise it is a regular server. */ +void scd_command_handler (ctrl_t ctrl, gnupg_fd_t fd) { int rc; @@ -2576,9 +2575,6 @@ scd_command_handler (ctrl_t ctrl, gnupg_fd_t fd) if (stopme) scd_exit (0); - - /* If there are no more sessions return true. */ - return !session_list; } diff --git a/scd/scdaemon.c b/scd/scdaemon.c index 0127c8dda..d3c8c6ba2 100644 --- a/scd/scdaemon.c +++ b/scd/scdaemon.c @@ -249,9 +249,6 @@ static int shutdown_pending; /* It is possible that we are currently running under setuid permissions */ static int maybe_setuid = 1; -/* Flag telling whether we are running as a pipe server. */ -static int pipe_server; - /* Name of the communication socket */ static char *socket_name; /* Name of the redirected socket or NULL. */ @@ -457,6 +454,7 @@ main (int argc, char **argv ) int greeting = 0; int nogreeting = 0; int multi_server = 0; + int pipe_server = 0; int is_daemon = 0; int nodetach = 0; int csh_style = 0; @@ -467,7 +465,6 @@ main (int argc, char **argv ) int allow_coredump = 0; struct assuan_malloc_hooks malloc_hooks; int res; - npth_t pipecon_handler; const char *application_priority = NULL; early_system_init (); @@ -763,6 +760,7 @@ main (int argc, char **argv ) ctrl_t ctrl; npth_attr_t tattr; gnupg_fd_t fd = GNUPG_INVALID_FD; + npth_t pipecon_handler; #ifndef HAVE_W32_SYSTEM { @@ -1218,12 +1216,11 @@ start_connection_thread (void *arg) log_info (_("handler for fd %d started\n"), FD_DBG (ctrl->thread_startup.fd)); - /* If this is a pipe server, we request a shutdown if the command - handler asked for it. With the next ticker event and given that + /* If this thread is the pipe connection thread, flag that a + shutdown is required. With the next ticker event and given that no other connections are running the shutdown will then happen. */ - if (scd_command_handler (ctrl, ctrl->thread_startup.fd) - && pipe_server) + if (ctrl->thread_startup.fd == GNUPG_INVALID_FD) shutdown_pending = 1; if (opt.verbose) diff --git a/scd/scdaemon.h b/scd/scdaemon.h index 16873c54b..5076588f0 100644 --- a/scd/scdaemon.h +++ b/scd/scdaemon.h @@ -141,7 +141,7 @@ const char *scd_get_socket_name (void); /*-- command.c --*/ gpg_error_t initialize_module_command (void); -int scd_command_handler (ctrl_t, gnupg_fd_t); +void scd_command_handler (ctrl_t, gnupg_fd_t); void send_status_info (ctrl_t ctrl, const char *keyword, ...) GPGRT_ATTR_SENTINEL(1); gpg_error_t send_status_direct (ctrl_t ctrl,