diff options
author | Ulrich Drepper <drepper@redhat.com> | 2000-06-14 07:14:09 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2000-06-14 07:14:09 +0000 |
commit | 594cee6c498dc6124e0ba1926d54ffd1fd5bffd8 (patch) | |
tree | 98224e9be0d476798f905126fda8155ed475d93b /misc/syslog.c | |
parent | 38161ac76efe4c50f13e244903a44645023fec83 (diff) | |
download | glibc-594cee6c498dc6124e0ba1926d54ffd1fd5bffd8.tar glibc-594cee6c498dc6124e0ba1926d54ffd1fd5bffd8.tar.gz glibc-594cee6c498dc6124e0ba1926d54ffd1fd5bffd8.tar.bz2 glibc-594cee6c498dc6124e0ba1926d54ffd1fd5bffd8.zip |
Update.
2000-06-14 Ulrich Drepper <drepper@redhat.com>
* misc/syslog.c (vsyslog): Allow open_memstream to fail without
crashing the application. Emit some simple error message.
Reported by mju@panasas.com [PR libc/1769].
Diffstat (limited to 'misc/syslog.c')
-rw-r--r-- | misc/syslog.c | 82 |
1 files changed, 54 insertions, 28 deletions
diff --git a/misc/syslog.c b/misc/syslog.c index 29cd266f09..c44f941411 100644 --- a/misc/syslog.c +++ b/misc/syslog.c @@ -120,6 +120,7 @@ vsyslog(pri, fmt, ap) struct sigaction *oldaction_ptr = NULL; int sigpipe; int saved_errno = errno; + char failbuf[3 * sizeof (pid_t) + sizeof "out of memory []"]; #define INTERNALLOG LOG_ERR|LOG_CONS|LOG_PERROR|LOG_PID /* Check for invalid bits. */ @@ -139,36 +140,61 @@ vsyslog(pri, fmt, ap) /* Build the message in a memory-buffer stream. */ f = open_memstream (&buf, &bufsize); - prioff = fprintf (f, "<%d>", pri); - (void) time (&now); + if (f == NULL) + { + /* We cannot get a stream. There is not much we can do but + emitting an error messages. */ + char numbuf[3 * sizeof (pid_t)]; + char *nump; + char *endp = __stpcpy (failbuf, "out of memory ["); + pid_t pid = __getpid (); + + nump = numbuf + sizeof (numbuf); + /* The PID can never be zero. */ + do + *--nump = '0' + pid % 10; + while ((pid /= 10) != 0); + + endp = __mempcpy (endp, nump, (nump + sizeof (numbuf)) - nump); + *endp++ = ']'; + *endp = '\0'; + buf = failbuf; + bufsize = endp - failbuf; + } + else + { + prioff = fprintf (f, "<%d>", pri); + (void) time (&now); #ifdef USE_IN_LIBIO - f->_IO_write_ptr += strftime (f->_IO_write_ptr, - f->_IO_write_end - f->_IO_write_ptr, - "%h %e %T ", - __localtime_r (&now, &now_tm)); + f->_IO_write_ptr += strftime (f->_IO_write_ptr, + f->_IO_write_end - f->_IO_write_ptr, + "%h %e %T ", + __localtime_r (&now, &now_tm)); #else - f->__bufp += strftime (f->__bufp, f->__put_limit - f->__bufp, - "%h %e %T ", __localtime_r (&now, &now_tm)); + f->__bufp += strftime (f->__bufp, f->__put_limit - f->__bufp, + "%h %e %T ", __localtime_r (&now, &now_tm)); #endif - msgoff = ftell (f); - if (LogTag == NULL) - LogTag = __progname; - if (LogTag != NULL) - fputs_unlocked (LogTag, f); - if (LogStat & LOG_PID) - fprintf (f, "[%d]", __getpid ()); - if (LogTag != NULL) - putc_unlocked (':', f), putc_unlocked (' ', f); - - /* Restore errno for %m format. */ - __set_errno (saved_errno); - - /* We have the header. Print the user's format into the buffer. */ - vfprintf (f, fmt, ap); - - /* Close the memory stream; this will finalize the data - into a malloc'd buffer in BUF. */ - fclose (f); + msgoff = ftell (f); + if (LogTag == NULL) + LogTag = __progname; + if (LogTag != NULL) + fputs_unlocked (LogTag, f); + if (LogStat & LOG_PID) + fprintf (f, "[%d]", __getpid ()); + if (LogTag != NULL) + putc_unlocked (':', f), putc_unlocked (' ', f); + + /* Restore errno for %m format. */ + __set_errno (saved_errno); + + /* We have the header. Print the user's format into the + buffer. */ + vfprintf (f, fmt, ap); + + /* Close the memory stream; this will finalize the data + into a malloc'd buffer in BUF. */ + fclose (f); + } /* Output to stderr if requested. */ if (LogStat & LOG_PERROR) { @@ -326,7 +352,7 @@ closelog () closelog_internal (); LogTag = NULL; LogType = SOCK_DGRAM; /* this is the default */ - + /* Free the lock. */ __libc_cleanup_region_end (1); } |