mirror of
git://git.gnupg.org/gnupg.git
synced 2024-12-22 10:19:57 +01: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:
parent
80b9045434
commit
5d83eb9226
@ -3000,27 +3000,34 @@ handle_connections (gnupg_fd_t listen_fd,
|
|||||||
next timeout. */
|
next timeout. */
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
/* The inotify fds are set even when a shutdown is pending (see
|
||||||
|
* above). So we must handle them in any case. To avoid that
|
||||||
|
* they trigger a second time we close them immediately. */
|
||||||
|
if (sock_inotify_fd != -1
|
||||||
|
&& FD_ISSET (sock_inotify_fd, &read_fdset)
|
||||||
|
&& gnupg_inotify_has_name (sock_inotify_fd, GPG_AGENT_SOCK_NAME))
|
||||||
|
{
|
||||||
|
shutdown_pending = 1;
|
||||||
|
close (sock_inotify_fd);
|
||||||
|
sock_inotify_fd = -1;
|
||||||
|
log_info ("socket file has been removed - shutting down\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (home_inotify_fd != -1
|
||||||
|
&& FD_ISSET (home_inotify_fd, &read_fdset))
|
||||||
|
{
|
||||||
|
shutdown_pending = 1;
|
||||||
|
close (home_inotify_fd);
|
||||||
|
home_inotify_fd = -1;
|
||||||
|
log_info ("homedir has been removed - shutting down\n");
|
||||||
|
}
|
||||||
|
|
||||||
if (!shutdown_pending)
|
if (!shutdown_pending)
|
||||||
{
|
{
|
||||||
int idx;
|
int idx;
|
||||||
ctrl_t ctrl;
|
ctrl_t ctrl;
|
||||||
npth_t thread;
|
npth_t thread;
|
||||||
|
|
||||||
if (sock_inotify_fd != -1
|
|
||||||
&& FD_ISSET (sock_inotify_fd, &read_fdset)
|
|
||||||
&& gnupg_inotify_has_name (sock_inotify_fd, GPG_AGENT_SOCK_NAME))
|
|
||||||
{
|
|
||||||
shutdown_pending = 1;
|
|
||||||
log_info ("socket file has been removed - shutting down\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (home_inotify_fd != -1
|
|
||||||
&& FD_ISSET (home_inotify_fd, &read_fdset))
|
|
||||||
{
|
|
||||||
shutdown_pending = 1;
|
|
||||||
log_info ("homedir has been removed - shutting down\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
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)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user