1
0
mirror of git://git.gnupg.org/gnupg.git synced 2024-09-21 15:01:41 +02:00

gpg-agent: Avoid getting stuck in shutdown pending state.

* agent/gpg-agent.c (handle_connections): Always check inotify fds.
--

I noticed a gpg-agent processed, probably in shutdown_pending state,
which was selecting on only these two inotify fds.  The select
returned immediately but because we did not handle the fds in
shutdown_pending state they were not read and the next select call
returned one of them immediately again.  Actually that should not
hanppen because the

          if (active_connections == 0)
            break; /* ready */

should have terminated the loop.  For unknown reasons (maybe be just a
connection thread terminated in a gdb session) that did not happen.
By moving the check outside of the shutdown_pending condition and
closing the fd after they have been triggered the code should be more
robust.

Signed-off-by: Werner Koch <wk@gnupg.org>
This commit is contained in:
Werner Koch 2017-11-13 10:52:36 +01:00
parent 80b9045434
commit 5d83eb9226
No known key found for this signature in database
GPG Key ID: E3FDFF218E45B72B

View File

@ -3000,17 +3000,16 @@ handle_connections (gnupg_fd_t listen_fd,
next timeout. */ next timeout. */
continue; continue;
if (!shutdown_pending) /* The inotify fds are set even when a shutdown is pending (see
{ * above). So we must handle them in any case. To avoid that
int idx; * they trigger a second time we close them immediately. */
ctrl_t ctrl;
npth_t thread;
if (sock_inotify_fd != -1 if (sock_inotify_fd != -1
&& FD_ISSET (sock_inotify_fd, &read_fdset) && FD_ISSET (sock_inotify_fd, &read_fdset)
&& gnupg_inotify_has_name (sock_inotify_fd, GPG_AGENT_SOCK_NAME)) && gnupg_inotify_has_name (sock_inotify_fd, GPG_AGENT_SOCK_NAME))
{ {
shutdown_pending = 1; shutdown_pending = 1;
close (sock_inotify_fd);
sock_inotify_fd = -1;
log_info ("socket file has been removed - shutting down\n"); log_info ("socket file has been removed - shutting down\n");
} }
@ -3018,9 +3017,17 @@ handle_connections (gnupg_fd_t listen_fd,
&& FD_ISSET (home_inotify_fd, &read_fdset)) && FD_ISSET (home_inotify_fd, &read_fdset))
{ {
shutdown_pending = 1; shutdown_pending = 1;
close (home_inotify_fd);
home_inotify_fd = -1;
log_info ("homedir has been removed - shutting down\n"); log_info ("homedir has been removed - shutting down\n");
} }
if (!shutdown_pending)
{
int idx;
ctrl_t ctrl;
npth_t thread;
for (idx=0; idx < DIM(listentbl); idx++) for (idx=0; idx < DIM(listentbl); idx++)
{ {
if (listentbl[idx].l_fd == GNUPG_INVALID_FD) if (listentbl[idx].l_fd == GNUPG_INVALID_FD)