summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--NEWS6
-rw-r--r--misc/syslog.c82
3 files changed, 66 insertions, 28 deletions
diff --git a/ChangeLog b/ChangeLog
index 8d892c9072..fae15e5732 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+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].
+
2000-06-13 Ulrich Drepper <drepper@redhat.com>
* malloc/Makefile (distribute): Add memprof.sh and memprofstat.c.
diff --git a/NEWS b/NEWS
index b90e7dbdda..fe2aec0d9e 100644
--- a/NEWS
+++ b/NEWS
@@ -47,6 +47,12 @@ Version 2.2
* A port to Hitachi SH3 and SH4 has been contributed by Kazumoto Kojima
and Yutaka Niibe.
+* POSIX clocks and timers implemented by Kaz Kylheku and Ulrich Drepper.
+
+* POSIX spawn function family implemented by Ulrich Drepper.
+
+* POSIX spinlocks are now available.
+
Version 2.1.3
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);
}