misc: syslog: Assume MSG_NOSIGNAL support (BZ #17144)

MSG_NOSIGNAL was added on POSIX 2008 and Hurd seems to support it.
The SIGPIPE handling also makes the implementation not thread-safe
(due the sigaction usage).

Checked on x86_64-linux-gnu.
This commit is contained in:
Adhemerval Zanella 2021-04-09 15:53:04 -03:00
parent 7cb10381a4
commit ded3cef361
2 changed files with 4 additions and 49 deletions

View File

@ -74,13 +74,6 @@ __libc_lock_define_initialized (static, syslog_lock)
static void openlog_internal(const char *, int, int); static void openlog_internal(const char *, int, int);
static void closelog_internal(void); static void closelog_internal(void);
#ifndef NO_SIGPIPE
static void sigpipe_handler (int);
#endif
#ifndef send_flags
# define send_flags 0
#endif
struct cleanup_arg struct cleanup_arg
{ {
@ -95,15 +88,8 @@ cancel_handler (void *ptr)
struct cleanup_arg *clarg = (struct cleanup_arg *) ptr; struct cleanup_arg *clarg = (struct cleanup_arg *) ptr;
if (clarg != NULL) if (clarg != NULL)
{ /* Free the memstream buffer, */
#ifndef NO_SIGPIPE free (clarg->buf);
if (clarg->oldaction != NULL)
__sigaction (SIGPIPE, clarg->oldaction, NULL);
#endif
/* Free the memstream buffer, */
free (clarg->buf);
}
/* Free the lock. */ /* Free the lock. */
__libc_lock_unlock (syslog_lock); __libc_lock_unlock (syslog_lock);
@ -160,10 +146,6 @@ __vsyslog_internal(int pri, const char *fmt, va_list ap,
char *buf = 0; char *buf = 0;
size_t bufsize = 0; size_t bufsize = 0;
size_t msgoff; size_t msgoff;
#ifndef NO_SIGPIPE
struct sigaction action, oldaction;
int sigpipe;
#endif
int saved_errno = errno; int saved_errno = errno;
char failbuf[3 * sizeof (pid_t) + sizeof "out of memory []"]; char failbuf[3 * sizeof (pid_t) + sizeof "out of memory []"];
@ -273,16 +255,6 @@ __vsyslog_internal(int pri, const char *fmt, va_list ap,
(void)__writev(STDERR_FILENO, iov, v - iov + 1); (void)__writev(STDERR_FILENO, iov, v - iov + 1);
} }
#ifndef NO_SIGPIPE
/* Prepare for a broken connection. */
memset (&action, 0, sizeof (action));
action.sa_handler = sigpipe_handler;
sigemptyset (&action.sa_mask);
sigpipe = __sigaction (SIGPIPE, &action, &oldaction);
if (sigpipe == 0)
clarg.oldaction = &oldaction;
#endif
/* Get connected, output the message to the local logger. */ /* Get connected, output the message to the local logger. */
if (!connected) if (!connected)
openlog_internal(NULL, LogStat | LOG_NDELAY, LogFacility); openlog_internal(NULL, LogStat | LOG_NDELAY, LogFacility);
@ -292,7 +264,7 @@ __vsyslog_internal(int pri, const char *fmt, va_list ap,
if (LogType == SOCK_STREAM) if (LogType == SOCK_STREAM)
++bufsize; ++bufsize;
if (!connected || __send(LogFile, buf, bufsize, send_flags) < 0) if (!connected || __send(LogFile, buf, bufsize, MSG_NOSIGNAL) < 0)
{ {
if (connected) if (connected)
{ {
@ -302,7 +274,7 @@ __vsyslog_internal(int pri, const char *fmt, va_list ap,
openlog_internal(NULL, LogStat | LOG_NDELAY, LogFacility); openlog_internal(NULL, LogStat | LOG_NDELAY, LogFacility);
} }
if (!connected || __send(LogFile, buf, bufsize, send_flags) < 0) if (!connected || __send(LogFile, buf, bufsize, MSG_NOSIGNAL) < 0)
{ {
closelog_internal (); /* attempt re-open next time */ closelog_internal (); /* attempt re-open next time */
/* /*
@ -320,11 +292,6 @@ __vsyslog_internal(int pri, const char *fmt, va_list ap,
} }
} }
#ifndef NO_SIGPIPE
if (sigpipe == 0)
__sigaction (SIGPIPE, &oldaction, (struct sigaction *) NULL);
#endif
out: out:
/* End of critical section. */ /* End of critical section. */
__libc_cleanup_pop (0); __libc_cleanup_pop (0);
@ -396,14 +363,6 @@ openlog (const char *ident, int logstat, int logfac)
__libc_cleanup_pop (1); __libc_cleanup_pop (1);
} }
#ifndef NO_SIGPIPE
static void
sigpipe_handler (int signo)
{
closelog_internal ();
}
#endif
static void static void
closelog_internal (void) closelog_internal (void)
{ {

View File

@ -1,4 +0,0 @@
#define NO_SIGPIPE
#define send_flags MSG_NOSIGNAL
#include <misc/syslog.c>