From 41cf76b8c142b1d34aa817744fb6fd0e276c2709 Mon Sep 17 00:00:00 2001 From: Werner Koch Date: Wed, 5 Mar 2025 10:24:14 +0100 Subject: [PATCH] Log the Windows system error code at more places. * common/asshelp.c (log_libassuan_system_error): New. * agent/gpg-agent.c (create_server_socket): Use new log function. (handle_connections): Log system error code for a failed accept. * dirmngr/dirmngr.c (handle_connections): Ditto. * kbx/keyboxd.c (handle_connections): Ditto. * scd/scdaemon.c (handle_connections): Ditto. * tpm2d/tpm2daemon.c (handle_connections): Ditto. * dirmngr/dirmngr.c (main): Log system error code for a failed bin. * kbx/keyboxd.c (create_server_socket): Ditto. * scd/scdaemon.c (create_server_socket): Ditto. * tpm2d/tpm2daemon.c (create_server_socket): Ditto. --- agent/gpg-agent.c | 12 ++++-------- common/asshelp.c | 15 +++++++++++++++ common/asshelp.h | 2 ++ dirmngr/dirmngr.c | 5 ++++- kbx/keyboxd.c | 8 ++++++-- scd/scdaemon.c | 9 ++++++--- tpm2d/tpm2daemon.c | 9 ++++++--- 7 files changed, 43 insertions(+), 17 deletions(-) diff --git a/agent/gpg-agent.c b/agent/gpg-agent.c index 83711b59a..ae1295977 100644 --- a/agent/gpg-agent.c +++ b/agent/gpg-agent.c @@ -2329,18 +2329,12 @@ create_server_socket (char *name, int primary, int cygwin, log_error (_("error getting nonce for the socket\n")); if (rc == -1) { - int w32err = 0; - - if (assuan_sock_get_flag (fd, "w32_error", &w32err)) - w32err = -1; /* Old Libassuan or not Windows. */ - rc = gpg_error_from_syserror (); + log_libassuan_system_error (fd); /* We use gpg_strerror here because it allows us to get strings for some W32 socket error codes. */ log_error (_("error binding socket to '%s': %s\n"), unaddr->sun_path, gpg_strerror (rc)); - if (w32err != -1) - log_info ("system error code: %d (0x%x)\n", w32err, w32err); assuan_sock_close (fd); *name = 0; /* Inhibit removal of the socket by cleanup(). */ @@ -3309,8 +3303,10 @@ handle_connections (gnupg_fd_t listen_fd, (struct sockaddr *)&paddr, &plen); if (fd == GNUPG_INVALID_FD) { + gpg_error_t myerr = gpg_error_from_syserror (); + log_libassuan_system_error (listentbl[idx].l_fd); log_error ("accept failed for %s: %s\n", - listentbl[idx].name, strerror (errno)); + listentbl[idx].name, gpg_strerror (myerr)); } else if ( !(ctrl = xtrycalloc (1, sizeof *ctrl))) { diff --git a/common/asshelp.c b/common/asshelp.c index 6706154cd..0152d1243 100644 --- a/common/asshelp.c +++ b/common/asshelp.c @@ -128,6 +128,21 @@ set_libassuan_log_cats (unsigned int newcats) } +/* Get the last Windows error from an Assuan socket function and print + * the raw error code using log_info. */ +void +log_libassuan_system_error (assuan_fd_t fd) +{ + int w32err = 0; + + if (assuan_sock_get_flag (fd, "w32_error", &w32err)) + w32err = -1; /* Old Libassuan or not Windows. */ + + if (w32err != -1) + log_info ("system error code: %d (0x%x)\n", w32err, w32err); +} + + static gpg_error_t send_one_option (assuan_context_t ctx, gpg_err_source_t errsource, diff --git a/common/asshelp.h b/common/asshelp.h index bca50759d..cde6e226f 100644 --- a/common/asshelp.h +++ b/common/asshelp.h @@ -46,6 +46,8 @@ void setup_libassuan_logging (unsigned int *debug_var_address, const char *msg)); void set_libassuan_log_cats (unsigned int newcats); +void log_libassuan_system_error (assuan_fd_t fd); + gpg_error_t send_pinentry_environment (assuan_context_t ctx, diff --git a/dirmngr/dirmngr.c b/dirmngr/dirmngr.c index e9709d766..cdad4f921 100644 --- a/dirmngr/dirmngr.c +++ b/dirmngr/dirmngr.c @@ -1459,6 +1459,7 @@ main (int argc, char **argv) log_error (_("error getting nonce for the socket\n")); if (rc == -1) { + log_libassuan_system_error (fd); log_error (_("error binding socket to '%s': %s\n"), serv_addr.sun_path, gpg_strerror (gpg_error_from_syserror ())); @@ -2484,7 +2485,9 @@ handle_connections (assuan_fd_t listen_fd) (struct sockaddr *)&paddr, &plen); if (fd == GNUPG_INVALID_FD) { - log_error ("accept failed: %s\n", strerror (errno)); + gpg_error_t myerr = gpg_error_from_syserror (); + log_libassuan_system_error (listen_fd); + log_error ("accept failed: %s\n", gpg_strerror (myerr)); } else { diff --git a/kbx/keyboxd.c b/kbx/keyboxd.c index 042ed20b5..197f01c74 100644 --- a/kbx/keyboxd.c +++ b/kbx/keyboxd.c @@ -1202,8 +1202,10 @@ create_server_socket (char *name, int cygwin, assuan_sock_nonce_t *nonce) { /* We use gpg_strerror here because it allows us to get strings for some W32 socket error codes. */ + gpg_error_t myerr = gpg_error_from_syserror (); + log_libassuan_system_error (fd); log_error (_("error binding socket to '%s': %s\n"), - unaddr->sun_path, gpg_strerror (gpg_error_from_syserror ())); + unaddr->sun_path, gpg_strerror (myerr)); assuan_sock_close (fd); *name = 0; /* Inhibit removal of the socket by cleanup(). */ @@ -1732,8 +1734,10 @@ handle_connections (gnupg_fd_t listen_fd) (struct sockaddr *)&paddr, &plen); if (fd == GNUPG_INVALID_FD) { + gpg_error_t myerr = gpg_error_from_syserror (); + log_libassuan_system_error (listentbl[idx].l_fd); log_error ("accept failed for %s: %s\n", - listentbl[idx].name, strerror (errno)); + listentbl[idx].name, gpg_strerror (myerr)); } else if ( !(ctrl = xtrycalloc (1, sizeof *ctrl))) { diff --git a/scd/scdaemon.c b/scd/scdaemon.c index 5e08a5abd..e7ffc33c9 100644 --- a/scd/scdaemon.c +++ b/scd/scdaemon.c @@ -1195,9 +1195,10 @@ create_server_socket (const char *name, char **r_redir_name, log_error (_("error getting nonce for the socket\n")); if (rc == -1) { + gpg_error_t myerr = gpg_error_from_syserror (); + log_libassuan_system_error (fd); log_error (_("error binding socket to '%s': %s\n"), - unaddr->sun_path, - gpg_strerror (gpg_error_from_syserror ())); + unaddr->sun_path, gpg_strerror (myerr)); assuan_sock_close (fd); scd_exit (2); } @@ -1429,7 +1430,9 @@ handle_connections (gnupg_fd_t listen_fd) (struct sockaddr *)&paddr, &plen); if (fd == GNUPG_INVALID_FD) { - log_error ("accept failed: %s\n", strerror (errno)); + gpg_error_t myerr = gpg_error_from_syserror (); + log_libassuan_system_error (listen_fd); + log_error ("accept failed: %s\n", gpg_strerror (myerr)); } else if ( !(ctrl = xtrycalloc (1, sizeof *ctrl)) ) { diff --git a/tpm2d/tpm2daemon.c b/tpm2d/tpm2daemon.c index e25a08748..30e13e594 100644 --- a/tpm2d/tpm2daemon.c +++ b/tpm2d/tpm2daemon.c @@ -973,9 +973,10 @@ create_server_socket (const char *name, char **r_redir_name, log_error (_("error getting nonce for the socket\n")); if (rc == -1) { + gpg_error_t myerr = gpg_error_from_syserror (); + log_libassuan_system_error (fd); log_error (_("error binding socket to '%s': %s\n"), - unaddr->sun_path, - gpg_strerror (gpg_error_from_syserror ())); + unaddr->sun_path, gpg_strerror (myerr)); assuan_sock_close (fd); tpm2d_exit (2); } @@ -1240,7 +1241,9 @@ handle_connections (gnupg_fd_t listen_fd) (struct sockaddr *)&paddr, &plen); if (fd == GNUPG_INVALID_FD) { - log_error ("accept failed: %s\n", strerror (errno)); + gpg_error_t myerr = gpg_error_from_syserror (); + log_libassuan_system_error (listen_fd); + log_error ("accept failed: %s\n", gpg_strerror (myerr)); } else if ( !(ctrl = xtrycalloc (1, sizeof *ctrl)) ) {