diff options
Diffstat (limited to 'daemon')
-rw-r--r-- | daemon/auth.c | 2 | ||||
-rw-r--r-- | daemon/cookie.c | 4 | ||||
-rw-r--r-- | daemon/display.c | 8 | ||||
-rw-r--r-- | daemon/errorgui.c | 28 | ||||
-rw-r--r-- | daemon/filecheck.c | 7 | ||||
-rw-r--r-- | daemon/gdm-net.c | 24 | ||||
-rw-r--r-- | daemon/gdm.c | 77 | ||||
-rw-r--r-- | daemon/gdm.h | 7 | ||||
-rw-r--r-- | daemon/getvt.c | 6 | ||||
-rw-r--r-- | daemon/misc.c | 71 | ||||
-rw-r--r-- | daemon/server.c | 54 | ||||
-rw-r--r-- | daemon/slave.c | 225 | ||||
-rw-r--r-- | daemon/xdmcp.c | 2 |
13 files changed, 266 insertions, 249 deletions
diff --git a/daemon/auth.c b/daemon/auth.c index a1d0a155..5e475282 100644 --- a/daemon/auth.c +++ b/daemon/auth.c @@ -580,7 +580,7 @@ gdm_auth_user_remove (GdmDisplay *d, uid_t user) /* If we are using the fallback cookie location, simply nuke the * cookie file */ if (d->authfb) { - unlink (d->userauth); + IGNORE_EINTR (unlink (d->userauth)); g_free (d->userauth); d->userauth = NULL; return; diff --git a/daemon/cookie.c b/daemon/cookie.c index bf852ec2..0fb048bd 100644 --- a/daemon/cookie.c +++ b/daemon/cookie.c @@ -81,14 +81,14 @@ gdm_cookie_generate (GdmDisplay *d) for (i = 0; i < RNGS; i++) { if ((fd = open (rngs[i].path, O_RDONLY|O_NONBLOCK)) >= 0) { - r = read (fd, buf, sizeof (buf)); + IGNORE_EINTR (r = read (fd, buf, sizeof (buf))); if (r > 0) gdm_md5_update (&ctx, buf, r); else r = 0; - close (fd); + IGNORE_EINTR (close (fd)); if (r >= rngs[i].length) break; diff --git a/daemon/display.c b/daemon/display.c index ac370806..ce67c610 100644 --- a/daemon/display.c +++ b/daemon/display.c @@ -314,7 +314,7 @@ gdm_display_manage (GdmDisplay *d) gdm_debug ("gdm_display_manage: Forked slave: %d", (int)pid); d->master_notify_fd = fds[1]; - close (fds[0]); + IGNORE_EINTR (close (fds[0])); break; } @@ -387,12 +387,12 @@ gdm_display_dispose (GdmDisplay *d) } if (d->slave_notify_fd >= 0) { - close (d->slave_notify_fd); + IGNORE_EINTR (close (d->slave_notify_fd)); d->slave_notify_fd = -1; } if (d->master_notify_fd >= 0) { - close (d->master_notify_fd); + IGNORE_EINTR (close (d->master_notify_fd)); d->master_notify_fd = -1; } @@ -433,7 +433,7 @@ gdm_display_dispose (GdmDisplay *d) d->authfile_gdm = NULL; if (d->xnest_temp_auth_file != NULL) - unlink (d->xnest_temp_auth_file); + IGNORE_EINTR (unlink (d->xnest_temp_auth_file)); g_free (d->xnest_temp_auth_file); d->xnest_temp_auth_file = NULL; diff --git a/daemon/errorgui.c b/daemon/errorgui.c index 328f8e6b..e5e282c8 100644 --- a/daemon/errorgui.c +++ b/daemon/errorgui.c @@ -251,11 +251,13 @@ gdm_error_box_full (GdmDisplay *d, GtkMessageType type, const char *error, if (details_file) { FILE *fp; struct stat s; + int r; gboolean valid_utf8 = TRUE; GString *gs = g_string_new (NULL); fp = NULL; - if (stat (details_file, &s) == 0) { + IGNORE_EINTR (r = stat (details_file, &s)); + if (r == 0) { if (S_ISREG (s.st_mode)) fp = fopen (details_file, "r"); else { @@ -479,17 +481,17 @@ gdm_failsafe_question (GdmDisplay *d, char buf[BUFSIZ]; int bytes; - close (p[1]); + IGNORE_EINTR (close (p[1])); gdm_wait_for_extra (NULL); - bytes = read (p[0], buf, BUFSIZ-1); + IGNORE_EINTR (bytes = read (p[0], buf, BUFSIZ-1)); if (bytes > 0) { - close (p[0]); + IGNORE_EINTR (close (p[0])); buf[bytes] = '\0'; return g_strdup (buf); } - close (p[0]); + IGNORE_EINTR (close (p[0])); } else { gdm_error (_("%s: Cannot fork to display error/info box"), "gdm_failsafe_question"); @@ -564,19 +566,19 @@ gdm_failsafe_yesno (GdmDisplay *d, char buf[BUFSIZ]; int bytes; - close (p[1]); + IGNORE_EINTR (close (p[1])); gdm_wait_for_extra (NULL); - bytes = read (p[0], buf, BUFSIZ-1); + IGNORE_EINTR (bytes = read (p[0], buf, BUFSIZ-1)); if (bytes > 0) { - close (p[0]); + IGNORE_EINTR (close (p[0])); if (buf[0] == 'y') return TRUE; else return FALSE; } - close (p[0]); + IGNORE_EINTR (close (p[0])); } else { gdm_error (_("%s: Cannot fork to display error/info box"), "gdm_failsafe_yesno"); @@ -659,21 +661,21 @@ gdm_failsafe_ask_buttons (GdmDisplay *d, char buf[BUFSIZ]; int bytes; - close (p[1]); + IGNORE_EINTR (close (p[1])); gdm_wait_for_extra (NULL); - bytes = read (p[0], buf, BUFSIZ-1); + IGNORE_EINTR (bytes = read (p[0], buf, BUFSIZ-1)); if (bytes > 0) { int i; - close (p[0]); + IGNORE_EINTR (close (p[0])); buf[bytes] = '\0'; if (sscanf (buf, "%d", &i) == 1) return i; else return -1; } - close (p[0]); + IGNORE_EINTR (close (p[0])); } else { gdm_error (_("%s: Cannot fork to display error/info box"), "gdm_failsafe_ask_buttons"); diff --git a/daemon/filecheck.c b/daemon/filecheck.c index 7aeb653e..5cf58670 100644 --- a/daemon/filecheck.c +++ b/daemon/filecheck.c @@ -45,9 +45,11 @@ gdm_file_check (const gchar *caller, uid_t user, const gchar *dir, { struct stat statbuf; gchar *fullpath; + int r; /* Stat directory */ - if (stat (dir, &statbuf) == -1) { + IGNORE_EINTR (r = stat (dir, &statbuf)); + if (r < 0) { if ( ! absentdirok) syslog (LOG_WARNING, _("%s: Directory %s does not exist."), caller, dir); @@ -75,7 +77,8 @@ gdm_file_check (const gchar *caller, uid_t user, const gchar *dir, fullpath = g_strconcat(dir, "/", file, NULL); /* Stat file */ - if (stat (fullpath, &statbuf) == -1) { + IGNORE_EINTR (r = stat (fullpath, &statbuf)); + if (r < 0) { /* Return true if file does not exist and that is ok */ if (absentok) { g_free (fullpath); diff --git a/daemon/gdm-net.c b/daemon/gdm-net.c index b4823cc3..8da6a788 100644 --- a/daemon/gdm-net.c +++ b/daemon/gdm-net.c @@ -99,7 +99,7 @@ gdm_connection_handler (GIOChannel *source, if ( ! (cond & G_IO_IN)) return close_if_needed (conn, cond); - len = read (conn->fd, buf, sizeof (buf) -1); + IGNORE_EINTR (len = read (conn->fd, buf, sizeof (buf) -1)); if (len <= 0) { return close_if_needed (conn, cond); } @@ -158,10 +158,10 @@ gdm_connection_write (GdmConnection *conn, const char *str) return FALSE; #ifdef MSG_NOSIGNAL - ret = send (conn->fd, str, strlen (str), MSG_NOSIGNAL); + IGNORE_EINTR (ret = send (conn->fd, str, strlen (str), MSG_NOSIGNAL)); #else old_handler = signal (SIGPIPE, SIG_IGN); - ret = send (conn->fd, str, strlen (str), 0); + IGNORE_EINTR (ret = send (conn->fd, str, strlen (str), 0)); signal (SIGPIPE, old_handler); #endif @@ -186,9 +186,9 @@ gdm_socket_handler (GIOChannel *source, if ( ! (cond & G_IO_IN)) return TRUE; - fd = accept (conn->fd, - (struct sockaddr *)&addr, - &addr_size); + IGNORE_EINTR (fd = accept (conn->fd, + (struct sockaddr *)&addr, + &addr_size)); if (fd < 0) { gdm_debug ("gdm_socket_handler: Rejecting connection"); return TRUE; @@ -241,7 +241,7 @@ gdm_connection_open_unix (const char *sockname, mode_t mode) struct sockaddr_un addr; int fd; - unlink (sockname); + IGNORE_EINTR (unlink (sockname)); fd = socket (AF_UNIX, SOCK_STREAM, 0); if (fd < 0) { @@ -257,11 +257,11 @@ gdm_connection_open_unix (const char *sockname, mode_t mode) (struct sockaddr *) &addr, sizeof (addr)) < 0) { gdm_error (_("%s: Could not bind socket"), "gdm_connection_open_unix"); - close (fd); + IGNORE_EINTR (close (fd)); return NULL; } - chmod (sockname, mode); + IGNORE_EINTR (chmod (sockname, mode)); conn = g_new0 (GdmConnection, 1); conn->close_level = 0; @@ -328,7 +328,7 @@ gdm_connection_open_fifo (const char *fifo, mode_t mode) GdmConnection *conn; int fd; - unlink (fifo); + IGNORE_EINTR (unlink (fifo)); if (mkfifo (fifo, 0660) < 0) { gdm_error (_("%s: Could not make FIFO"), @@ -344,7 +344,7 @@ gdm_connection_open_fifo (const char *fifo, mode_t mode) return NULL; } - chmod (fifo, mode); + IGNORE_EINTR (chmod (fifo, mode)); conn = g_new0 (GdmConnection, 1); conn->close_level = 0; @@ -453,7 +453,7 @@ gdm_connection_close (GdmConnection *conn) } if (conn->fd > 0) { - close (conn->fd); + IGNORE_EINTR (close (conn->fd)); conn->fd = -1; } diff --git a/daemon/gdm.c b/daemon/gdm.c index 34755416..c9ea3597 100644 --- a/daemon/gdm.c +++ b/daemon/gdm.c @@ -222,8 +222,11 @@ compare_displays (gconstpointer a, gconstpointer b) static void check_servauthdir (struct stat *statbuf) { + int r; + /* Enter paranoia mode */ - if (stat (GdmServAuthDir, statbuf) == -1) { + IGNORE_EINTR (r = stat (GdmServAuthDir, statbuf)); + if (r < 0) { char *s = g_strdup_printf (_("Server Authorization directory " "(daemon/ServAuthDir) is set to %s " @@ -256,8 +259,10 @@ static void check_logdir (void) { struct stat statbuf; + int r; - if (stat (GdmLogDir, &statbuf) == -1 || + IGNORE_EINTR (r = stat (GdmLogDir, &statbuf)); + if (r < 0 || ! S_ISDIR (statbuf.st_mode)) { gdm_error (_("%s: Logdir %s does not exist or isn't a directory. Using ServAuthDir %s."), "gdm_config_parse", GdmLogDir, GdmServAuthDir); @@ -281,11 +286,13 @@ gdm_config_parse (void) gchar *bin; VeConfig *cfg; GList *list, *li; + int r; displays = NULL; high_display_num = 0; - if (stat (GDM_CONFIG_FILE, &statbuf) == -1) { + IGNORE_EINTR (r = stat (GDM_CONFIG_FILE, &statbuf)); + if (r < 0) { gdm_error (_("%s: No configuration file: %s. Using defaults."), "gdm_config_parse", GDM_CONFIG_FILE); } else { @@ -828,12 +835,12 @@ gdm_daemonify (void) gdm_fail (_("%s: setsid() failed: %s!"), "gdm_daemonify", strerror(errno)); - chdir (GdmServAuthDir); + IGNORE_EINTR (chdir (GdmServAuthDir)); umask (022); - close (0); - close (1); - close (2); + IGNORE_EINTR (close (0)); + IGNORE_EINTR (close (1)); + IGNORE_EINTR (close (2)); gdm_open_dev_null (O_RDONLY); /* open stdin - fd 0 */ gdm_open_dev_null (O_RDWR); /* open stdout - fd 1 */ @@ -928,7 +935,7 @@ gdm_final_cleanup (void) char *path; gdm_connection_close (fifoconn); path = g_strconcat (GdmServAuthDir, "/.gdmfifo", NULL); - unlink (path); + IGNORE_EINTR (unlink (path)); g_free (path); fifoconn = NULL; } @@ -939,20 +946,20 @@ gdm_final_cleanup (void) } if (slave_fifo_pipe_fd >= 0) { - close (slave_fifo_pipe_fd); + IGNORE_EINTR (close (slave_fifo_pipe_fd)); slave_fifo_pipe_fd = -1; } if (unixconn != NULL) { gdm_connection_close (unixconn); - unlink (GDM_SUP_SOCKET); + IGNORE_EINTR (unlink (GDM_SUP_SOCKET)); unixconn = NULL; } closelog(); if (GdmPidFile != NULL) - unlink (GdmPidFile); + IGNORE_EINTR (unlink (GdmPidFile)); } static gboolean @@ -1037,7 +1044,7 @@ deal_with_x_crashes (GdmDisplay *d) ve_setenv ("TEXTDOMAIN", GETTEXT_PACKAGE, TRUE); ve_setenv ("TEXTDOMAINDIR", GNOMELOCALEDIR, TRUE); - execv (argv[0], argv); + IGNORE_EINTR (execv (argv[0], argv)); /* yaikes! */ _exit (32); @@ -1125,10 +1132,10 @@ suspend_machine (void) /* Also make a new process group */ setsid (); - chdir ("/"); + IGNORE_EINTR (chdir ("/")); argv = ve_split (GdmSuspendReal); - execv (argv[0], argv); + IGNORE_EINTR (execv (argv[0], argv)); /* FIXME: what about fail */ _exit (1); } @@ -1139,8 +1146,8 @@ static void change_to_first_and_clear (gboolean reboot) { gdm_change_vt (1); - close (1); - close (2); + IGNORE_EINTR (close (1)); + IGNORE_EINTR (close (2)); open ("/dev/tty1", O_WRONLY); open ("/dev/tty1", O_WRONLY); /* yet again lazy */ @@ -1323,14 +1330,14 @@ start_autopsy: gdm_info (_("Master rebooting...")); gdm_final_cleanup (); - chdir ("/"); + IGNORE_EINTR (chdir ("/")); #ifdef __linux__ change_to_first_and_clear (TRUE /* reboot */); #endif /* __linux */ argv = ve_split (GdmRebootReal); - execv (argv[0], argv); + IGNORE_EINTR (execv (argv[0], argv)); gdm_error (_("%s: Reboot failed: %s"), "gdm_child_action", strerror (errno)); @@ -1343,14 +1350,14 @@ start_autopsy: gdm_info (_("Master halting...")); gdm_final_cleanup (); - chdir ("/"); + IGNORE_EINTR (chdir ("/")); #ifdef __linux__ change_to_first_and_clear (FALSE /* reboot */); #endif /* __linux */ argv = ve_split (GdmHaltReal); - execv (argv[0], argv); + IGNORE_EINTR (execv (argv[0], argv)); gdm_error (_("%s: Halt failed: %s"), "gdm_child_action", strerror (errno)); @@ -1475,7 +1482,7 @@ gdm_restart_now (void) gdm_info (_("GDM restarting ...")); gdm_final_cleanup (); gdm_restoreenv (); - execvp (stored_argv[0], stored_argv); + IGNORE_EINTR (execvp (stored_argv[0], stored_argv)); gdm_error (_("Failed to restart self")); _exit (1); } @@ -1589,8 +1596,8 @@ create_connections (void) &pipeconn, close_notify); } else { - close (p[0]); - close (p[1]); + IGNORE_EINTR (close (p[0])); + IGNORE_EINTR (close (p[1])); slave_fifo_pipe_fd = -1; } @@ -1658,7 +1665,7 @@ ensure_desc_012 (void) /* Once we are up to 3, we're beyond stdin, * stdout and stderr */ if (fd >= 3) { - close (fd); + IGNORE_EINTR (close (fd)); break; } } @@ -1799,7 +1806,7 @@ main (int argc, char *argv[]) fclose (pf); } - chdir (GdmServAuthDir); + IGNORE_EINTR (chdir (GdmServAuthDir)); umask (022); } else @@ -1961,16 +1968,12 @@ send_slave_ack (GdmDisplay *d, const char *resp) char not[2]; not[0] = GDM_SLAVE_NOTIFY_ACK; not[1] = '\n'; - while (write (d->master_notify_fd, not, 2) < 0 && - errno == EINTR) - ; + IGNORE_EINTR (write (d->master_notify_fd, not, 2)); } else { char *not = g_strdup_printf ("%c%s\n", GDM_SLAVE_NOTIFY_ACK, resp); - while (write (d->master_notify_fd, not, strlen (not)) < 0 && - errno == EINTR) - ; + IGNORE_EINTR (write (d->master_notify_fd, not, strlen (not))); g_free (not); } } @@ -1991,9 +1994,7 @@ send_slave_command (GdmDisplay *d, const char *command) char *cmd = g_strdup_printf ("%c%s\n", GDM_SLAVE_NOTIFY_COMMAND, command); - while (write (d->master_notify_fd, cmd, strlen (cmd)) < 0 && - errno == EINTR) - ; + IGNORE_EINTR (write (d->master_notify_fd, cmd, strlen (cmd))); g_free (cmd); } if (d->slavepid > 1) { @@ -2652,6 +2653,7 @@ handle_flexi_server (GdmConnection *conn, int type, const char *server, if (type == TYPE_FLEXI_XNEST) { struct stat s; + int r; gboolean authorized = TRUE; seteuid (xnest_uid); @@ -2660,7 +2662,8 @@ handle_flexi_server (GdmConnection *conn, int type, const char *server, g_assert (xnest_disp != NULL); g_assert (xnest_cookie != NULL); - if (stat (xnest_auth_file, &s) < 0) + IGNORE_EINTR (r = stat (xnest_auth_file, &s)); + if (r < 0) authorized = FALSE; if (authorized && /* if readable or writable by group or others, @@ -2829,8 +2832,10 @@ update_config (const char *key) { struct stat statbuf; VeConfig *cfg; + int r; - if (stat (GDM_CONFIG_FILE, &statbuf) == -1) { + IGNORE_EINTR (r = stat (GDM_CONFIG_FILE, &statbuf)); + if (r < 0) { /* if the file didn't exist before either */ if (config_file_mtime == 0) return TRUE; diff --git a/daemon/gdm.h b/daemon/gdm.h index 9900327d..de1583e1 100644 --- a/daemon/gdm.h +++ b/daemon/gdm.h @@ -672,6 +672,13 @@ enum { * from a local display we started */ }; +#define IGNORE_EINTR(expr) \ + do { \ + errno = 0; \ + expr; \ + } while (errno == EINTR); + + #endif /* GDM_H */ /* EOF */ diff --git a/daemon/getvt.c b/daemon/getvt.c index a133b655..61efd50a 100644 --- a/daemon/getvt.c +++ b/daemon/getvt.c @@ -45,13 +45,13 @@ get_free_vt (int *vtfd) return -1; if ((ioctl(fd, VT_OPENQRY, &vtno) < 0) || (vtno == -1)) { - close (fd); + IGNORE_EINTR (close (fd)); return -1; } fdv = open_vt (vtno); if (fdv < 0) { - close (fd); + IGNORE_EINTR (close (fd)); return -1; } @@ -81,7 +81,7 @@ get_free_vt (int *vtfd) cleanup: for (li = to_close_vts; li != NULL; li = li->next) { - close (GPOINTER_TO_INT (li->data)); + IGNORE_EINTR (close (GPOINTER_TO_INT (li->data))); } return vtno; } diff --git a/daemon/misc.c b/daemon/misc.c index 33ac182b..12eae94e 100644 --- a/daemon/misc.c +++ b/daemon/misc.c @@ -219,9 +219,7 @@ gdm_fdprintf (int fd, const gchar *format, ...) s = g_strdup_vprintf (format, args); va_end (args); - while (write (fd, s, strlen (s)) < 0 && - errno == EINTR) - ; + IGNORE_EINTR (write (fd, s, strlen (s))); g_free (s); } @@ -328,6 +326,7 @@ gdm_get_free_display (int start, uid_t server_uid) struct stat s; char buf[256]; FILE *fp; + int r; for (li = displays; li != NULL; li = li->next) { GdmDisplay *dsp = li->data; @@ -345,17 +344,19 @@ gdm_get_free_display (int start, uid_t server_uid) serv_addr.sin_port = htons (6000 + i); errno = 0; - if (connect (sock, (struct sockaddr *)&serv_addr, - sizeof (serv_addr)) >= 0 || - errno != ECONNREFUSED) { - close (sock); + IGNORE_EINTR (connect (sock, + (struct sockaddr *)&serv_addr, + sizeof (serv_addr))); + if (errno != 0 && errno != ECONNREFUSED) { + IGNORE_EINTR (close (sock)); continue; } - close (sock); + IGNORE_EINTR (close (sock)); /* if lock file exists and the process exists */ g_snprintf (buf, sizeof (buf), "/tmp/.X%d-lock", i); - if (stat (buf, &s) == 0 && + IGNORE_EINTR (r = stat (buf, &s)); + if (r == 0 && ! S_ISREG (s.st_mode)) { /* Eeeek! not a regular file? Perhaps someone is trying to play tricks on us */ @@ -376,7 +377,7 @@ gdm_get_free_display (int start, uid_t server_uid) fclose (fp); /* whack the file, it's a stale lock file */ - unlink (buf); + IGNORE_EINTR (unlink (buf)); } /* if starting as root, we'll be able to overwrite any @@ -385,14 +386,16 @@ gdm_get_free_display (int start, uid_t server_uid) if (server_uid > 0) { g_snprintf (buf, sizeof (buf), "/tmp/.X11-unix/X%d", i); - if (stat (buf, &s) == 0 && + IGNORE_EINTR (r = stat (buf, &s)); + if (r == 0 && s.st_uid != server_uid) { continue; } g_snprintf (buf, sizeof (buf), "/tmp/.X%d-lock", i); - if (stat (buf, &s) == 0 && + IGNORE_EINTR (r = stat (buf, &s)); + if (r == 0 && s.st_uid != server_uid) { continue; } @@ -532,7 +535,7 @@ gdm_text_yesno_dialog (const char *msg, gboolean *ret) return FALSE; } - close (tempfd); + IGNORE_EINTR (close (tempfd)); argv[0] = EXPANDED_LIBEXECDIR "/gdmopen"; argv[1] = "-l"; @@ -569,7 +572,7 @@ gdm_text_yesno_dialog (const char *msg, gboolean *ret) } } - unlink (tempname); + IGNORE_EINTR (unlink (tempname)); g_free (msg_quoted); return TRUE; @@ -611,7 +614,7 @@ gdm_exec_wait (char * const *argv, gboolean no_display, ve_unsetenv ("XAUTHORITY"); } - execv (argv[0], argv); + IGNORE_EINTR (execv (argv[0], argv)); _exit (-1); } @@ -781,15 +784,18 @@ gdm_ensure_sanity (void) if (mkdir ("/tmp/.ICE-unix", 0777) == 0) { /* Make sure it is root */ - if (chown ("/tmp/.ICE-unix", 0, 0) == 0) - chmod ("/tmp/.ICE-unix", 01777); + IGNORE_EINTR (chown ("/tmp/.ICE-unix", 0, 0)); + if (errno != 0) + IGNORE_EINTR (chmod ("/tmp/.ICE-unix", 01777)); } else { struct stat s; - if (lstat ("/tmp/.ICE-unix", &s) == 0 && - S_ISDIR (s.st_mode)) { + int r; + IGNORE_EINTR (r = lstat ("/tmp/.ICE-unix", &s)); + if (r == 0 && S_ISDIR (s.st_mode)) { /* Make sure it is root and sticky */ - if (chown ("/tmp/.ICE-unix", 0, 0) == 0) - chmod ("/tmp/.ICE-unix", 01777); + IGNORE_EINTR (chown ("/tmp/.ICE-unix", 0, 0)); + if (errno != 0) + IGNORE_EINTR (chmod ("/tmp/.ICE-unix", 01777)); } } @@ -847,7 +853,7 @@ gdm_peek_local_address_list (void) "gdm_peek_local_address_list"); g_free (buf); if (sockfd != gdm_xdmcpfd) - close (sockfd); + IGNORE_EINTR (close (sockfd)); addr = g_new0 (struct in_addr, 1); addr->s_addr = INADDR_LOOPBACK; return g_list_append (NULL, addr); @@ -879,7 +885,7 @@ gdm_peek_local_address_list (void) } if (sockfd != gdm_xdmcpfd) - close (sockfd); + IGNORE_EINTR (close (sockfd)); g_free (buf); #else /* SIOCGIFCONF */ @@ -1068,10 +1074,7 @@ gdm_fdgetc (int fd) char buf[1]; int bytes; - do { - errno = 0; - bytes = read (fd, buf, 1); - } while (bytes < 0 && errno == EINTR); + IGNORE_EINTR (bytes = read (fd, buf, 1)); if (bytes != 1) return EOF; else @@ -1110,7 +1113,7 @@ gdm_close_all_descriptors (int from, int except, int except2) int max = sysconf (_SC_OPEN_MAX); for (i = from; i < max; i++) { if (i != except && i != except2) - close(i); + IGNORE_EINTR (close(i)); } } @@ -1354,7 +1357,8 @@ jumpback_sighandler (int signal) GdmHostent * gdm_gethostbyname (const char *name) { - struct hostent *he_; + /* static because of Setjmp */ + static struct hostent * he_; SETUP_INTERRUPTS_FOR_TERM_DECLS /* the cached address */ @@ -1362,6 +1366,8 @@ gdm_gethostbyname (const char *name) static time_t last_time = 0; static char *cached_hostname = NULL; + he_ = NULL; + if (cached_hostname != NULL && strcmp (cached_hostname, name) == 0) { /* don't check more then every 60 seconds */ @@ -1396,7 +1402,8 @@ gdm_gethostbyname (const char *name) GdmHostent * gdm_gethostbyaddr (struct in_addr *ia) { - struct hostent *he_; + /* static because of Setjmp */ + static struct hostent * he_; SETUP_INTERRUPTS_FOR_TERM_DECLS /* the cached address */ @@ -1404,6 +1411,8 @@ gdm_gethostbyaddr (struct in_addr *ia) static time_t last_time = 0; static struct in_addr cached_addr; + he_ = NULL; + if (last_time != 0 && memcmp (&cached_addr, ia, sizeof (struct in_addr)) == 0) { /* don't check more then every 60 seconds */ @@ -1476,7 +1485,7 @@ FILE * gdm_safe_fopen_w (const char *file) { int fd; - unlink (file); + IGNORE_EINTR (unlink (file)); fd = open (file, O_EXCL|O_CREAT|O_TRUNC|O_WRONLY, 0644); if (fd < 0) return NULL; diff --git a/daemon/server.c b/daemon/server.c index d9f8a624..0af8ece8 100644 --- a/daemon/server.c +++ b/daemon/server.c @@ -96,12 +96,12 @@ gdm_server_whack_lockfile (GdmDisplay *disp) /* if lock file exists and it is our process, whack it! */ g_snprintf (buf, sizeof (buf), "/tmp/.X%d-lock", disp->dispnum); - unlink (buf); + IGNORE_EINTR (unlink (buf)); /* whack the unix socket as well */ g_snprintf (buf, sizeof (buf), "/tmp/.X11-unix/X%d", disp->dispnum); - unlink (buf); + IGNORE_EINTR (unlink (buf)); } @@ -110,11 +110,11 @@ void gdm_server_wipe_cookies (GdmDisplay *disp) { if ( ! ve_string_empty (disp->authfile)) - unlink (disp->authfile); + IGNORE_EINTR (unlink (disp->authfile)); g_free (disp->authfile); disp->authfile = NULL; if ( ! ve_string_empty (disp->authfile_gdm)) - unlink (disp->authfile_gdm); + IGNORE_EINTR (unlink (disp->authfile_gdm)); g_free (disp->authfile_gdm); disp->authfile_gdm = NULL; } @@ -166,8 +166,12 @@ gdm_server_reinit (GdmDisplay *disp) d->servstat = SERVER_PENDING; if (disp->dsp != NULL) { - int (*old_xerror_handler)(Display *, XErrorEvent *) = NULL; - int (*old_xioerror_handler)(Display *) = NULL; + /* static because of the Setjmp */ + static int (*old_xerror_handler)(Display *, XErrorEvent *) = NULL; + static int (*old_xioerror_handler)(Display *) = NULL; + + old_xerror_handler = NULL; + old_xioerror_handler = NULL; /* Do note the interaction of this Setjmp and the signal handlers and the Setjmp in slave.c */ @@ -462,8 +466,8 @@ setup_server_wait (GdmDisplay *d) if (sigaction (SIGUSR1, &usr1, NULL) < 0) { gdm_error (_("%s: Error setting up %s signal handler: %s"), "gdm_server_start", "USR1", strerror (errno)); - close (server_signal_pipe[0]); - close (server_signal_pipe[1]); + IGNORE_EINTR (close (server_signal_pipe[0])); + IGNORE_EINTR (close (server_signal_pipe[1])); return FALSE; } @@ -476,8 +480,8 @@ setup_server_wait (GdmDisplay *d) gdm_error (_("%s: Error setting up %s signal handler: %s"), "gdm_server_start", "CHLD", strerror (errno)); gdm_signal_ignore (SIGUSR1); - close (server_signal_pipe[0]); - close (server_signal_pipe[1]); + IGNORE_EINTR (close (server_signal_pipe[0])); + IGNORE_EINTR (close (server_signal_pipe[1])); return FALSE; } @@ -552,7 +556,7 @@ do_server_wait (GdmDisplay *d) if (select (server_signal_pipe[0]+1, &rfds, NULL, NULL, &tv) > 0) { char buf[4]; /* read the Yay! */ - read (server_signal_pipe[0], buf, 4); + IGNORE_EINTR (read (server_signal_pipe[0], buf, 4)); } if ( ! server_signal_notified && t + SERVER_WAIT_ALARM < time (NULL)) { @@ -575,8 +579,8 @@ do_server_wait (GdmDisplay *d) sigaction (SIGCHLD, &old_svr_wait_chld, NULL); sigprocmask (SIG_SETMASK, &old_svr_wait_mask, NULL); - close (server_signal_pipe[0]); - close (server_signal_pipe[1]); + IGNORE_EINTR (close (server_signal_pipe[0])); + IGNORE_EINTR (close (server_signal_pipe[1])); if (d->servpid <= 1) { d->servstat = SERVER_ABORT; @@ -655,7 +659,7 @@ gdm_server_start (GdmDisplay *disp, gboolean treat_as_flexi, /* If we were holding a vt open for the server, close it now as it has * already taken the bait. */ if (vtfd > 0) - close (vtfd); + IGNORE_EINTR (close (vtfd)); switch (d->servstat) { @@ -784,16 +788,16 @@ safer_rename (const char *a, const char *b) errno = 0; if (link (a, b) < 0) { if (errno == EEXIST) { - unlink (a); + IGNORE_EINTR (unlink (a)); return; } - unlink (b); + IGNORE_EINTR (unlink (b)); /* likely this system doesn't support hard links */ rename (a, b); - unlink (a); + IGNORE_EINTR (unlink (a)); return; } - unlink (a); + IGNORE_EINTR (unlink (a)); } static void @@ -807,7 +811,7 @@ rotate_logs (const char *dname) char *fname = g_strconcat (GdmLogDir, "/", dname, ".log", NULL); /* Rotate the logs (keep 4 last) */ - unlink (fname4); + IGNORE_EINTR (unlink (fname4)); safer_rename (fname3, fname4); safer_rename (fname2, fname3); safer_rename (fname1, fname2); @@ -1008,12 +1012,12 @@ gdm_server_spawn (GdmDisplay *d, const char *vtarg) /* Log all output from spawned programs to a file */ logfile = g_strconcat (GdmLogDir, "/", d->name, ".log", NULL); - unlink (logfile); + IGNORE_EINTR (unlink (logfile)); logfd = open (logfile, O_CREAT|O_TRUNC|O_WRONLY|O_EXCL, 0644); if (logfd != -1) { - dup2 (logfd, 1); - dup2 (logfd, 2); + IGNORE_EINTR (dup2 (logfd, 1)); + IGNORE_EINTR (dup2 (logfd, 2)); } else { gdm_error (_("%s: Could not open logfile for display %s!"), "gdm_server_spawn", d->name); @@ -1133,7 +1137,7 @@ gdm_server_spawn (GdmDisplay *d, const char *vtarg) setgroups (1, groups); } - execv (argv[0], argv); + IGNORE_EINTR (execv (argv[0], argv)); gdm_error (_("%s: Xserver not found: %s"), "gdm_server_spawn", command); @@ -1178,7 +1182,7 @@ gdm_server_usr1_handler (gint sig) server_signal_notified = TRUE; /* this will quit the select */ - write (server_signal_pipe[1], "Yay!", 4); + IGNORE_EINTR (write (server_signal_pipe[1], "Yay!", 4)); gdm_in_signal--; } @@ -1202,7 +1206,7 @@ gdm_server_child_handler (int signal) gdm_slave_child_handler (signal); /* this will quit the select */ - write (server_signal_pipe[1], "Yay!", 4); + IGNORE_EINTR (write (server_signal_pipe[1], "Yay!", 4)); gdm_in_signal--; } diff --git a/daemon/slave.c b/daemon/slave.c index 8ab1ddf1..c2c0ec7c 100644 --- a/daemon/slave.c +++ b/daemon/slave.c @@ -237,9 +237,7 @@ slave_waitpid_notify_all (void) for (li = slave_waitpids; li != NULL; li = li->next) { GdmWaitPid *wp = li->data; if (wp->fd_w >= 0) { - while (write (wp->fd_w, "N", 1) < 0 && - errno == EINTR) - ; + IGNORE_EINTR (write (wp->fd_w, "N", 1)); } } @@ -308,7 +306,7 @@ slave_waitpid (GdmWaitPid *wp) ret = select (wp->fd_r+1, &rfds, NULL, NULL, NULL); if (ret == 1) - read (wp->fd_r, buf, 1); + IGNORE_EINTR (read (wp->fd_r, buf, 1)); check_notifies_now (); } while (wp->pid > 1); check_notifies_now (); @@ -316,8 +314,8 @@ slave_waitpid (GdmWaitPid *wp) gdm_sigchld_block_push (); - close (wp->fd_r); - close (wp->fd_w); + IGNORE_EINTR (close (wp->fd_r)); + IGNORE_EINTR (close (wp->fd_w)); wp->fd_r = -1; wp->fd_w = -1; wp->pid = -1; @@ -409,10 +407,10 @@ static void whack_greeter_fds (void) { if (greeter_fd_out > 0) - close (greeter_fd_out); + IGNORE_EINTR (close (greeter_fd_out)); greeter_fd_out = -1; if (greeter_fd_in > 0) - close (greeter_fd_in); + IGNORE_EINTR (close (greeter_fd_in)); greeter_fd_in = -1; } @@ -473,8 +471,8 @@ gdm_slave_start (GdmDisplay *display) { time_t first_time; int death_count; - static sigset_t mask; struct sigaction alrm, term, child, usr2; + sigset_t mask; /* Ignore SIGUSR1/SIGPIPE, and especially ignore it before the Setjmp */ @@ -1163,7 +1161,7 @@ focus_first_x_window (const char *class_res_name) fd_set rfds; struct timeval tv; - close (p[1]); + IGNORE_EINTR (close (p[1])); FD_ZERO(&rfds); FD_SET(p[0], &rfds); @@ -1174,7 +1172,7 @@ focus_first_x_window (const char *class_res_name) select(p[0]+1, &rfds, NULL, NULL, &tv); - close (p[0]); + IGNORE_EINTR (close (p[0])); } return; } @@ -1218,8 +1216,8 @@ focus_first_x_window (const char *class_res_name) SubstructureNotifyMask); if (p[1] >= 0) { - write (p[1], "!", 1); - close (p[1]); + IGNORE_EINTR (write (p[1], "!", 1)); + IGNORE_EINTR (close (p[1])); } for (;;) { @@ -1336,15 +1334,16 @@ run_config (GdmDisplay *display, struct passwd *pwent) openlog ("gdm", LOG_PID, LOG_DAEMON); - if (chdir (pwent->pw_dir) != 0) - chdir ("/"); + IGNORE_EINTR (chdir (pwent->pw_dir)); + if (errno != 0) + IGNORE_EINTR (chdir ("/")); /* exec the configurator */ argv = ve_split (GdmConfigurator); if (argv != NULL && argv[0] != NULL && access (argv[0], X_OK) == 0) - execv (argv[0], argv); + IGNORE_EINTR (execv (argv[0], argv)); gdm_error_box (d, GTK_MESSAGE_ERROR, @@ -1358,7 +1357,7 @@ run_config (GdmDisplay *display, struct passwd *pwent) (EXPANDED_BINDIR "/gdmsetup --disable-sound --disable-crash-dialog"); if (access (argv[0], X_OK) == 0) - execv (argv[0], argv); + IGNORE_EINTR (execv (argv[0], argv)); gdm_error_box (d, GTK_MESSAGE_ERROR, @@ -1652,7 +1651,7 @@ run_pictures (void) for (;;) { struct stat s; char *tmp, *ret; - int i; + int i, r; g_free (response); response = gdm_slave_greeter_ctl (GDM_NEEDPIC, ""); @@ -1808,7 +1807,8 @@ run_pictures (void) g_free (picdir); } - if (stat (picfile, &s) < 0) { + IGNORE_EINTR (r = stat (picfile, &s)); + if (r < 0) { seteuid (0); setegid (GdmGroupId); @@ -1859,28 +1859,22 @@ run_pictures (void) int written; /* write until we succeed in writing something */ - do { - errno = 0; - written = write (greeter_fd_out, buf, bytes); - if (written < 0 && errno == EPIPE) { - /* something very, very bad has happened */ - gdm_slave_quick_exit (DISPLAY_REMANAGE); - } - } while (written < 0 && errno == EINTR); + IGNORE_EINTR (written = write (greeter_fd_out, buf, bytes)); + if (written < 0 && errno == EPIPE) { + /* something very, very bad has happened */ + gdm_slave_quick_exit (DISPLAY_REMANAGE); + } /* write until we succeed in writing everything */ while (written < bytes) { int n; - do { - errno = 0; - n = write (greeter_fd_out, &buf[written], bytes-written); - if (n < 0 && errno == EPIPE) { - /* something very, very bad has happened */ - gdm_slave_quick_exit (DISPLAY_REMANAGE); - } - if (n > 0) - written += n; - } while (n < 0 && errno == EINTR); + IGNORE_EINTR (n = write (greeter_fd_out, &buf[written], bytes-written)); + if (n < 0 && errno == EPIPE) { + /* something very, very bad has happened */ + gdm_slave_quick_exit (DISPLAY_REMANAGE); + } + if (n > 0) + written += n; } /* we have written bytes btyes if it likes it or not */ @@ -1934,25 +1928,22 @@ copy_auth_file (uid_t fromuid, uid_t touid, const char *file) name = g_strconcat (GdmServAuthDir, "/", d->name, ".XnestAuth", NULL); - unlink (name); + IGNORE_EINTR (unlink (name)); authfd = open (name, O_EXCL|O_TRUNC|O_WRONLY|O_CREAT, 0600); if (authfd < 0) { - close (fromfd); + IGNORE_EINTR (close (fromfd)); seteuid (old); g_free (name); return NULL; } /* Make it owned by the user that Xnest is started as */ - fchown (authfd, touid, -1); + IGNORE_EINTR (fchown (authfd, touid, -1)); for (;;) { int written, n; - do { - errno = 0; - bytes = read (fromfd, buf, sizeof (buf)); - } while (bytes < 0 && errno == EINTR); + IGNORE_EINTR (bytes = read (fromfd, buf, sizeof (buf))); /* EOF */ if (bytes == 0) @@ -1960,14 +1951,11 @@ copy_auth_file (uid_t fromuid, uid_t touid, const char *file) written = 0; do { - do { - errno = 0; - n = write (authfd, &buf[written], bytes-written); - } while (n < 0 && errno == EINTR); + IGNORE_EINTR (n = write (authfd, &buf[written], bytes-written)); if (n < 0) { /*Error writing*/ - close (fromfd); - close (authfd); + IGNORE_EINTR (close (fromfd)); + IGNORE_EINTR (close (authfd)); setuid (old); g_free (name); return NULL; @@ -1976,8 +1964,8 @@ copy_auth_file (uid_t fromuid, uid_t touid, const char *file) } while (written < bytes); } - close (fromfd); - close (authfd); + IGNORE_EINTR (close (fromfd)); + IGNORE_EINTR (close (authfd)); seteuid (old); @@ -2025,11 +2013,11 @@ gdm_slave_greeter (void) gdm_unset_signals (); /* Plumbing */ - close (pipe1[1]); - close (pipe2[0]); + IGNORE_EINTR (close (pipe1[1])); + IGNORE_EINTR (close (pipe2[0])); - dup2 (pipe1[0], STDIN_FILENO); - dup2 (pipe2[1], STDOUT_FILENO); + IGNORE_EINTR (dup2 (pipe1[0], STDIN_FILENO)); + IGNORE_EINTR (dup2 (pipe2[1], STDOUT_FILENO)); closelog (); @@ -2184,14 +2172,14 @@ gdm_slave_greeter (void) perhaps it's the modules causing the problem in the first place */ ! d->try_different_greeter) { gchar *modules = g_strdup_printf("--gtk-module=%s", GdmGtkModulesList); - execl (argv[0], argv[0], modules, NULL); + IGNORE_EINTR (execl (argv[0], argv[0], modules, NULL)); /* Something went wrong */ gdm_error (_("%s: Cannot start greeter with gtk modules: %s. Trying without modules"), "gdm_slave_greeter", GdmGtkModulesList); g_free(modules); } - execv (argv[0], argv); + IGNORE_EINTR (execv (argv[0], argv)); gdm_error (_("%s: Cannot start greeter trying default: %s"), "gdm_slave_greeter", @@ -2202,7 +2190,7 @@ gdm_slave_greeter (void) argv = g_new0 (char *, 2); argv[0] = EXPANDED_BINDIR "/gdmlogin"; argv[1] = NULL; - execv (argv[0], argv); + IGNORE_EINTR (execv (argv[0], argv)); gdm_error_box (d, GTK_MESSAGE_ERROR, @@ -2220,11 +2208,8 @@ gdm_slave_greeter (void) gdm_slave_exit (DISPLAY_REMANAGE, _("%s: Can't fork gdmgreeter process"), "gdm_slave_greeter"); default: - close (pipe1[0]); - close (pipe2[1]); - - fcntl(pipe1[1], F_SETFD, fcntl(pipe1[1], F_GETFD, 0) | FD_CLOEXEC); - fcntl(pipe2[0], F_SETFD, fcntl(pipe2[0], F_GETFD, 0) | FD_CLOEXEC); + IGNORE_EINTR (close (pipe1[0])); + IGNORE_EINTR (close (pipe2[1])); whack_greeter_fds (); @@ -2322,8 +2307,9 @@ gdm_slave_send (const char *str, gboolean wait_for_ack) gdm_fdprintf (fd, "\n%s\n", str); - if (fd != slave_fifo_pipe_fd) - close (fd); + if (fd != slave_fifo_pipe_fd) { + IGNORE_EINTR (close (fd)); + } #if defined(_POSIX_PRIORITY_SCHEDULING) && defined(HAVE_SCHED_YIELD) if (wait_for_ack && ! gdm_got_ack) { @@ -2494,14 +2480,14 @@ gdm_slave_chooser (void) gdm_unset_signals (); /* Plumbing */ - close (p[0]); + IGNORE_EINTR (close (p[0])); if (p[1] != STDOUT_FILENO) - dup2 (p[1], STDOUT_FILENO); + IGNORE_EINTR (dup2 (p[1], STDOUT_FILENO)); closelog (); - close (0); + IGNORE_EINTR (close (0)); gdm_close_all_descriptors (2 /* from */, -1 /* except */, -1 /* except2 */); gdm_open_dev_null (O_RDONLY); /* open stdin - fd 0 */ @@ -2553,7 +2539,7 @@ gdm_slave_chooser (void) ve_setenv ("RUNNING_UNDER_GDM", "true", TRUE); argv = ve_split (GdmChooser); - execv (argv[0], argv); + IGNORE_EINTR (execv (argv[0], argv)); gdm_error_box (d, GTK_MESSAGE_ERROR, @@ -2570,9 +2556,7 @@ gdm_slave_chooser (void) gdm_debug ("gdm_slave_chooser: Chooser on pid %d", d->chooserpid); gdm_slave_send_num (GDM_SOP_CHOOSERPID, d->chooserpid); - close (p[1]); - - fcntl(p[0], F_SETFD, fcntl(p[0], F_GETFD, 0) | FD_CLOEXEC); + IGNORE_EINTR (close (p[1])); /* wait for the chooser to die */ @@ -2588,9 +2572,9 @@ gdm_slave_chooser (void) /* Note: Nothing affecting the chooser needs update * from notifies */ - bytes = read (p[0], buf, sizeof(buf)-1); + IGNORE_EINTR (bytes = read (p[0], buf, sizeof(buf)-1)); if (bytes > 0) { - close (p[0]); + IGNORE_EINTR (close (p[0])); if (buf[bytes-1] == '\n') buf[bytes-1] ='\0'; @@ -2606,7 +2590,7 @@ gdm_slave_chooser (void) } } - close (p[0]); + IGNORE_EINTR (close (p[0])); gdm_slave_quick_exit (DISPLAY_REMANAGE); break; @@ -2751,7 +2735,7 @@ session_child_run (struct passwd *pwent, setegid (pwent->pw_gid); seteuid (pwent->pw_uid); /* unlink to be anal */ - unlink (filename); + IGNORE_EINTR (unlink (filename)); logfd = open (filename, O_EXCL|O_CREAT|O_TRUNC|O_WRONLY, 0644); seteuid (old); setegid (oldg); @@ -2759,25 +2743,25 @@ session_child_run (struct passwd *pwent, g_free (filename); if (logfd != -1) { - dup2 (logfd, 1); - dup2 (logfd, 2); - close (logfd); + IGNORE_EINTR (dup2 (logfd, 1)); + IGNORE_EINTR (dup2 (logfd, 2)); + IGNORE_EINTR (close (logfd)); } else { - close (1); - close (2); + IGNORE_EINTR (close (1)); + IGNORE_EINTR (close (2)); gdm_open_dev_null (O_RDWR); /* open stdout - fd 1 */ gdm_open_dev_null (O_RDWR); /* open stderr - fd 2 */ gdm_error (_("%s: Could not open ~/.xsession-errors"), "run_session_child"); } } else { - close (1); - close (2); + IGNORE_EINTR (close (1)); + IGNORE_EINTR (close (2)); gdm_open_dev_null (O_RDWR); /* open stdout - fd 1 */ gdm_open_dev_null (O_RDWR); /* open stderr - fd 2 */ } - close (0); + IGNORE_EINTR (close (0)); gdm_open_dev_null (O_RDONLY); /* open stdin - fd 0 */ /* Set this for the PreSession script */ @@ -2832,7 +2816,7 @@ session_child_run (struct passwd *pwent, /* Now still as root make the system authfile not readable by others, and therefore not by the gdm user */ - chmod (GDM_AUTHFILE (d), 0640); + IGNORE_EINTR (chmod (GDM_AUTHFILE (d), 0640)); setpgid (0, 0); @@ -2849,8 +2833,9 @@ session_child_run (struct passwd *pwent, * not to leave the egid around */ setegid (pwent->pw_gid); - if (chdir (home_dir) != 0) { - chdir ("/"); + IGNORE_EINTR (chdir (home_dir)); + if (errno != 0) { + IGNORE_EINTR (chdir ("/")); } #ifdef HAVE_LOGINCAP @@ -3038,7 +3023,7 @@ session_child_run (struct passwd *pwent, _exit (0); } - execv (argv[0], argv); + IGNORE_EINTR (execv (argv[0], argv)); /* will go to .xsession-errors */ fprintf (stderr, _("%s: Could not exec %s %s %s"), @@ -3351,7 +3336,7 @@ gdm_slave_session_start (void) /* Now still as root make the system authfile readable by others, and therefore by the gdm user */ - chmod (GDM_AUTHFILE (d), 0644); + IGNORE_EINTR (chmod (GDM_AUTHFILE (d), 0644)); end_time = time (NULL); @@ -3414,7 +3399,7 @@ gdm_slave_session_stop (gboolean run_post_session, /* Now still as root make the system authfile not readable by others, and therefore not by the gdm user */ if (GDM_AUTHFILE (d) != NULL) - chmod (GDM_AUTHFILE (d), 0640); + IGNORE_EINTR (chmod (GDM_AUTHFILE (d), 0640)); gdm_debug ("gdm_slave_session_stop: %s on %s", local_login, d->name); @@ -3446,7 +3431,7 @@ gdm_slave_session_stop (gboolean run_post_session, TRUE /* set_parent */); } - unlink (x_servers_file); + IGNORE_EINTR (unlink (x_servers_file)); g_free (x_servers_file); g_free (local_login); @@ -3643,9 +3628,7 @@ gdm_slave_child_handler (int sig) if (wp->pid == pid) { wp->pid = -1; if (wp->fd_w >= 0) { - while (write (wp->fd_w, "!", 1) < 0 && - errno == EINTR) - ; + IGNORE_EINTR (write (wp->fd_w, "!", 1)); } } } @@ -3760,7 +3743,7 @@ gdm_slave_handle_usr2_message (void) char **vec; int i; - count = read (d->slave_notify_fd, buf, sizeof (buf) -1); + IGNORE_EINTR (count = read (d->slave_notify_fd, buf, sizeof (buf) -1)); if (count <= 0) { return; } @@ -4094,7 +4077,7 @@ gdm_slave_whack_temp_auth_file (void) if (old != 0) seteuid (0); if (d->xnest_temp_auth_file != NULL) - unlink (d->xnest_temp_auth_file); + IGNORE_EINTR (unlink (d->xnest_temp_auth_file)); g_free (d->xnest_temp_auth_file); d->xnest_temp_auth_file = NULL; if (old != 0) @@ -4107,7 +4090,7 @@ create_temp_auth_file (void) if (d->type == TYPE_FLEXI_XNEST && d->xnest_auth_file != NULL) { if (d->xnest_temp_auth_file != NULL) - unlink (d->xnest_temp_auth_file); + IGNORE_EINTR (unlink (d->xnest_temp_auth_file)); g_free (d->xnest_temp_auth_file); d->xnest_temp_auth_file = copy_auth_file (d->server_uid, @@ -4195,12 +4178,12 @@ gdm_slave_exec_script (GdmDisplay *d, const gchar *dir, const char *login, case 0: closelog (); - close (0); + IGNORE_EINTR (close (0)); gdm_open_dev_null (O_RDONLY); /* open stdin - fd 0 */ if ( ! pass_stdout) { - close (1); - close (2); + IGNORE_EINTR (close (1)); + IGNORE_EINTR (close (2)); /* No error checking here - if it's messed the best response * is to ignore & try to continue */ gdm_open_dev_null (O_RDWR); /* open stdout - fd 1 */ @@ -4224,12 +4207,13 @@ gdm_slave_exec_script (GdmDisplay *d, const gchar *dir, const char *login, if (ve_string_empty (pwent->pw_dir)) { ve_setenv ("HOME", "/", TRUE); ve_setenv ("PWD", "/", TRUE); - chdir ("/"); + IGNORE_EINTR (chdir ("/")); } else { ve_setenv ("HOME", pwent->pw_dir, TRUE); ve_setenv ("PWD", pwent->pw_dir, TRUE); - if (chdir (pwent->pw_dir) != 0) { - chdir ("/"); + IGNORE_EINTR (chdir (pwent->pw_dir)); + if (errno != 0) { + IGNORE_EINTR (chdir ("/")); ve_setenv ("PWD", "/", TRUE); } } @@ -4237,7 +4221,7 @@ gdm_slave_exec_script (GdmDisplay *d, const gchar *dir, const char *login, } else { ve_setenv ("HOME", "/", TRUE); ve_setenv ("PWD", "/", TRUE); - chdir ("/"); + IGNORE_EINTR (chdir ("/")); ve_setenv ("SHELL", "/bin/sh", TRUE); } @@ -4262,7 +4246,7 @@ gdm_slave_exec_script (GdmDisplay *d, const gchar *dir, const char *login, ve_setenv ("RUNNING_UNDER_GDM", "true", TRUE); ve_unsetenv ("MAIL"); argv = ve_split (script); - execv (argv[0], argv); + IGNORE_EINTR (execv (argv[0], argv)); syslog (LOG_ERR, _("%s: Failed starting: %s"), "gdm_slave_exec_script", script); _exit (EXIT_SUCCESS); @@ -4376,9 +4360,9 @@ gdm_parse_enriched_login (const gchar *s, GdmDisplay *display) /* The child will write the username to stdout based on the DISPLAY environment variable. */ - close (pipe1[0]); + IGNORE_EINTR (close (pipe1[0])); if(pipe1[1] != STDOUT_FILENO) - dup2 (pipe1[1], STDOUT_FILENO); + IGNORE_EINTR (dup2 (pipe1[1], STDOUT_FILENO)); closelog (); @@ -4396,7 +4380,7 @@ gdm_parse_enriched_login (const gchar *s, GdmDisplay *display) ve_unsetenv ("MAIL"); argv = ve_split (str->str); - execv (argv[0], argv); + IGNORE_EINTR (execv (argv[0], argv)); gdm_error (_("%s: Failed executing: %s"), "gdm_parse_enriched_login", str->str); @@ -4405,24 +4389,27 @@ gdm_parse_enriched_login (const gchar *s, GdmDisplay *display) case -1: gdm_error (_("%s: Can't fork script process!"), "gdm_parse_enriched_login"); - close (pipe1[0]); - close (pipe1[1]); + IGNORE_EINTR (close (pipe1[0])); + IGNORE_EINTR (close (pipe1[1])); break; default: /* The parent reads username from the pipe a chunk at a time */ - close(pipe1[1]); - g_string_truncate(str,0); - while((in_buffer_len = read(pipe1[0],in_buffer, - sizeof(in_buffer)/sizeof(char)- 1)) > 0) { - in_buffer[in_buffer_len] = '\000'; - g_string_append(str,in_buffer); - } + IGNORE_EINTR (close (pipe1[1])); + g_string_truncate (str, 0); + do { + IGNORE_EINTR (in_buffer_len = read (pipe1[0], in_buffer, + sizeof(in_buffer) - 1)); + if (in_buffer_len > 0) { + in_buffer[in_buffer_len] = '\0'; + g_string_append (str, in_buffer); + } + } while (in_buffer_len > 0); if(str->len > 0 && str->str[str->len - 1] == '\n') g_string_truncate(str, str->len - 1); - close(pipe1[0]); + IGNORE_EINTR (close(pipe1[0])); gdm_wait_for_extra (NULL); } diff --git a/daemon/xdmcp.c b/daemon/xdmcp.c index 6d6433e7..34f2c691 100644 --- a/daemon/xdmcp.c +++ b/daemon/xdmcp.c @@ -312,7 +312,7 @@ gdm_xdmcp_close (void) } if (gdm_xdmcpfd > 0) { - close (gdm_xdmcpfd); + IGNORE_EINTR (close (gdm_xdmcpfd)); gdm_xdmcpfd = -1; } } |