From e41ebdcfcd6c7eeefafe00b4d983aa0c4855d312 Mon Sep 17 00:00:00 2001 From: Owen Taylor Date: Fri, 30 May 2003 21:11:08 +0000 Subject: [PATCH] Silently return G_IO_CHANNEL_ERROR_FAILED for EINTR, since close() can Fri May 30 16:48:26 2003 Owen Taylor * glib/giochannel.c (g_io_channel_error_from_errno): Silently return G_IO_CHANNEL_ERROR_FAILED for EINTR, since close() can return EINTR. (#11842, Balazs Scheidler) --- ChangeLog | 6 ++++++ ChangeLog.pre-2-10 | 6 ++++++ ChangeLog.pre-2-12 | 6 ++++++ ChangeLog.pre-2-4 | 6 ++++++ ChangeLog.pre-2-6 | 6 ++++++ ChangeLog.pre-2-8 | 6 ++++++ glib/giochannel.c | 15 ++++++++++++--- 7 files changed, 48 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index d35f1a8..34d3c06 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Fri May 30 16:48:26 2003 Owen Taylor + + * glib/giochannel.c (g_io_channel_error_from_errno): + Silently return G_IO_CHANNEL_ERROR_FAILED for EINTR, + since close() can return EINTR. (#11842, Balazs Scheidler) + Fri May 30 15:51:43 2003 Owen Taylor * glib/giochannel.c (g_io_error_get_from_g_error): diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index d35f1a8..34d3c06 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,9 @@ +Fri May 30 16:48:26 2003 Owen Taylor + + * glib/giochannel.c (g_io_channel_error_from_errno): + Silently return G_IO_CHANNEL_ERROR_FAILED for EINTR, + since close() can return EINTR. (#11842, Balazs Scheidler) + Fri May 30 15:51:43 2003 Owen Taylor * glib/giochannel.c (g_io_error_get_from_g_error): diff --git a/ChangeLog.pre-2-12 b/ChangeLog.pre-2-12 index d35f1a8..34d3c06 100644 --- a/ChangeLog.pre-2-12 +++ b/ChangeLog.pre-2-12 @@ -1,3 +1,9 @@ +Fri May 30 16:48:26 2003 Owen Taylor + + * glib/giochannel.c (g_io_channel_error_from_errno): + Silently return G_IO_CHANNEL_ERROR_FAILED for EINTR, + since close() can return EINTR. (#11842, Balazs Scheidler) + Fri May 30 15:51:43 2003 Owen Taylor * glib/giochannel.c (g_io_error_get_from_g_error): diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index d35f1a8..34d3c06 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,9 @@ +Fri May 30 16:48:26 2003 Owen Taylor + + * glib/giochannel.c (g_io_channel_error_from_errno): + Silently return G_IO_CHANNEL_ERROR_FAILED for EINTR, + since close() can return EINTR. (#11842, Balazs Scheidler) + Fri May 30 15:51:43 2003 Owen Taylor * glib/giochannel.c (g_io_error_get_from_g_error): diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index d35f1a8..34d3c06 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,9 @@ +Fri May 30 16:48:26 2003 Owen Taylor + + * glib/giochannel.c (g_io_channel_error_from_errno): + Silently return G_IO_CHANNEL_ERROR_FAILED for EINTR, + since close() can return EINTR. (#11842, Balazs Scheidler) + Fri May 30 15:51:43 2003 Owen Taylor * glib/giochannel.c (g_io_error_get_from_g_error): diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index d35f1a8..34d3c06 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,9 @@ +Fri May 30 16:48:26 2003 Owen Taylor + + * glib/giochannel.c (g_io_channel_error_from_errno): + Silently return G_IO_CHANNEL_ERROR_FAILED for EINTR, + since close() can return EINTR. (#11842, Balazs Scheidler) + Fri May 30 15:51:43 2003 Owen Taylor * glib/giochannel.c (g_io_error_get_from_g_error): diff --git a/glib/giochannel.c b/glib/giochannel.c index 4bbda09..caa817e 100644 --- a/glib/giochannel.c +++ b/glib/giochannel.c @@ -547,9 +547,6 @@ g_io_channel_error_from_errno (gint en) #ifdef EAGAIN g_return_val_if_fail (en != EAGAIN, G_IO_CHANNEL_ERROR_FAILED); #endif -#ifdef EINTR - g_return_val_if_fail (en != EINTR, G_IO_CHANNEL_ERROR_FAILED); -#endif switch (en) { @@ -570,6 +567,18 @@ g_io_channel_error_from_errno (gint en) return G_IO_CHANNEL_ERROR_FBIG; #endif +#ifdef EINTR + /* In general, we should catch EINTR before we get here, + * but close() is allowed to return EINTR by POSIX, so + * we need to catch it here; EINTR from close() is + * unrecoverable, because it's undefined whether + * the fd was actually closed or not, so we just return + * a generic error code. + */ + case EINTR: + return G_IO_CHANNEL_ERROR_FAILED; +#endif + #ifdef EINVAL case EINVAL: return G_IO_CHANNEL_ERROR_INVAL; -- 2.7.4