libsyslog: handle EOVERFLOW from gettimeofday()
Turns out that gettimeofday() can return EOVERFLOW on systems with 32-bit time_t. This occurs when the UNIX Epoch wraps around, the exact time is 03:14:07 UTC on 19 January 2038. EOVERFLOW is not documented in gettimeofday(2), but instead of messing up the entire syslog message -- causing syslogd to drop it -- we can handle the overflow by falling back to time(NULL) (returning seconds since start of Epoch) and rely on syslogd to, in turn, handle the wraparound gracefully. Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
This commit is contained in:
parent
30a5c6628d
commit
cea845aaf4
@ -243,7 +243,12 @@ vsyslogp_r(int pri, struct syslog_data *data, const char *msgid,
|
||||
} else
|
||||
prlen = 0;
|
||||
|
||||
if (gettimeofday(&tv, NULL) != -1) {
|
||||
if (gettimeofday(&tv, NULL) == -1) {
|
||||
tv.tv_sec = time(NULL);
|
||||
tv.tv_usec = 0;
|
||||
}
|
||||
|
||||
{
|
||||
/* strftime() implies tzset(), localtime_r() doesn't. */
|
||||
tzset();
|
||||
now = (time_t) tv.tv_sec;
|
||||
|
Loading…
Reference in New Issue
Block a user