svn commit: trunk/uClibc/libc/misc/syslog
vda at uclibc.org
vda at uclibc.org
Fri Jun 6 07:45:09 UTC 2008
Author: vda
Date: 2008-06-06 00:45:08 -0700 (Fri, 06 Jun 2008)
New Revision: 22245
Log:
Fix hard-to-rigger locking bug in vsyslog():
SIGPIPE handler was attempting to re-acquire an already taken lock.
While at it, stop checking for sigaction failure which is not possible here.
Sizes:
text data bss dec hex filename
- 1123 13 2 1138 472 libc/misc/syslog/syslog.o
+ 1112 13 2 1127 467 libc/misc/syslog/syslog.o
Run tested.
Modified:
trunk/uClibc/libc/misc/syslog/syslog.c
Changeset:
Modified: trunk/uClibc/libc/misc/syslog/syslog.c
===================================================================
--- trunk/uClibc/libc/misc/syslog/syslog.c 2008-06-06 07:25:12 UTC (rev 22244)
+++ trunk/uClibc/libc/misc/syslog/syslog.c 2008-06-06 07:45:08 UTC (rev 22245)
@@ -129,7 +129,7 @@
static void
closelog_intern(int sig)
{
- __UCLIBC_MUTEX_LOCK(mylock);
+ /* mylock must be held by the caller */
if (LogFile != -1) {
(void) close(LogFile);
}
@@ -141,7 +141,6 @@
LogFacility = LOG_USER;
LogMask = 0xff;
}
- __UCLIBC_MUTEX_UNLOCK(mylock);
}
/*
@@ -205,12 +204,14 @@
int rc;
char tbuf[1024]; /* syslogd is unable to handle longer messages */
struct sigaction action, oldaction;
- int sigpipe;
memset(&action, 0, sizeof(action));
action.sa_handler = closelog_intern;
sigemptyset(&action.sa_mask); /* TODO: memset already zeroed it out! */
- sigpipe = sigaction(SIGPIPE, &action, &oldaction);
+ /* Only two errors are possible for sigaction:
+ * EFAULT (bad address of &oldaction) and EINVAL (invalid signo)
+ * none of which can happen here. */
+ /*int sigpipe =*/ sigaction(SIGPIPE, &action, &oldaction);
saved_errno = errno;
@@ -306,7 +307,7 @@
/* should mode be O_WRONLY | O_NOCTTY? -- Uli */
/* yes, but in Linux "/dev/console" never becomes ctty anyway -- vda */
if ((LogStat & LOG_CONS) &&
- (fd = open(_PATH_CONSOLE, O_WRONLY)) >= 0) {
+ (fd = open(_PATH_CONSOLE, O_WRONLY | O_NOCTTY)) >= 0) {
p = strchr(tbuf, '>') + 1;
last_chr[0] = '\r';
last_chr[1] = '\n';
@@ -316,7 +317,7 @@
getout:
__UCLIBC_MUTEX_UNLOCK(mylock);
- if (sigpipe == 0)
+ /*if (sigpipe == 0)*/
sigaction(SIGPIPE, &oldaction, (struct sigaction *) NULL);
}
libc_hidden_def(vsyslog)
@@ -338,7 +339,9 @@
void
closelog(void)
{
+ __UCLIBC_MUTEX_LOCK(mylock);
closelog_intern(0); /* 0: reset LogXXX globals to default */
+ __UCLIBC_MUTEX_UNLOCK(mylock);
}
libc_hidden_def(closelog)
@@ -348,9 +351,10 @@
int omask;
omask = LogMask;
- __UCLIBC_MUTEX_LOCK(mylock);
- if (pmask != 0)
+ if (pmask != 0) {
+ __UCLIBC_MUTEX_LOCK(mylock);
LogMask = pmask;
- __UCLIBC_MUTEX_UNLOCK(mylock);
+ __UCLIBC_MUTEX_UNLOCK(mylock);
+ }
return omask;
}
More information about the uClibc-cvs
mailing list