Doc: clarify CVE-2016-9963
[exim.git] / src / src / tod.c
index 525f8553c6aec5021677b3785a397396e22705a8..5f451ba96de445e6b52a60b01f5a04a9ed4bc8dd 100644 (file)
@@ -1,10 +1,8 @@
-/* $Cambridge: exim/src/src/tod.c,v 1.2 2005/01/04 10:00:42 ph10 Exp $ */
-
 /*************************************************
 *     Exim - an Internet mail transport agent    *
 *************************************************/
 
-/* Copyright (c) University of Cambridge 1995 - 2005 */
+/* Copyright (c) University of Cambridge 1995 - 2014 */
 /* See the file NOTICE for conditions of use and distribution. */
 
 /* A function for returning the time of day in various formats */
@@ -34,17 +32,19 @@ a leading zero for the full stamp, since Ustrftime() doesn't provide this
 option.
 
 Argument:  type of timestamp required:
-             tod_bsdin          BSD inbox format
-             tod_epoch          Unix epoch format
-             tod_full           full date and time
-             tod_log            log file data line format,
-                                  with zone if log_timezone is TRUE
-             tod_log_bare       always without zone
-             tod_log_datestamp  for log file names when datestamped
-             tod_log_zone       always with zone
-             tod_mbx            MBX inbox format
-             tod_zone           just the timezone offset
-             tod_zulu           time in 8601 zulu format
+             tod_bsdin                  BSD inbox format
+             tod_epoch                  Unix epoch format
+             tod_epochl                 Unix epoch/usec format
+             tod_full                   full date and time
+             tod_log                    log file data line format,
+                                          with zone if log_timezone is TRUE
+             tod_log_bare               always without zone
+             tod_log_datestamp_daily    for log file names when datestamped daily
+             tod_log_datestamp_monthly  for log file names when datestamped monthly
+             tod_log_zone               always with zone
+             tod_mbx                    MBX inbox format
+             tod_zone                   just the timezone offset
+             tod_zulu                   time in 8601 zulu format
 
 Returns:   pointer to fixed buffer containing the timestamp
 */
@@ -52,9 +52,20 @@ Returns:   pointer to fixed buffer containing the timestamp
 uschar *
 tod_stamp(int type)
 {
-time_t now = time(NULL);
+time_t now;
 struct tm *t;
 
+if (type == tod_epoch_l)
+  {
+  struct timeval tv;
+  gettimeofday(&tv, NULL);
+  /* Unix epoch/usec format */
+  (void) sprintf(CS timebuf, TIME_T_FMT "%06ld", tv.tv_sec, (long) tv.tv_usec );
+  return timebuf;
+  }
+
+now = time(NULL);
+
 /* Vary log type according to timezone requirement */
 
 if (type == tod_log) type = log_timezone? tod_log_zone : tod_log_bare;
@@ -63,8 +74,8 @@ if (type == tod_log) type = log_timezone? tod_log_zone : tod_log_bare;
 
 else if (type == tod_epoch)
   {
-  (void) sprintf(CS timebuf, "%d", (int)now);  /* Unix epoch format */
-  return timebuf;
+  (void) sprintf(CS timebuf, TIME_T_FMT, now);  /* Unix epoch format */
+  return timebuf;      /* NB the above will be wrong if time_t is FP */
   }
 
 else if (type == tod_zulu)
@@ -91,16 +102,25 @@ switch(type)
   /* Format used as suffix of log file name when 'log_datestamp' is active. For
   testing purposes, it changes the file every second. */
 
-  case tod_log_datestamp:
   #ifdef TESTING_LOG_DATESTAMP
+  case tod_log_datestamp_daily:
+  case tod_log_datestamp_monthly:
   (void) sprintf(CS timebuf, "%04d%02d%02d%02d%02d",
     1900 + t->tm_year, 1 + t->tm_mon, t->tm_mday, t->tm_hour, t->tm_min);
+  break;
+
   #else
+  case tod_log_datestamp_daily:
   (void) sprintf(CS timebuf, "%04d%02d%02d",
     1900 + t->tm_year, 1 + t->tm_mon, t->tm_mday);
-  #endif
   break;
 
+  case tod_log_datestamp_monthly:
+  (void) sprintf(CS timebuf, "%04d%02d",
+    1900 + t->tm_year, 1 + t->tm_mon);
+  break;
+  #endif
+
   /* Format used in BSD inbox separator lines. Sort-of documented in RFC 976
   ("UUCP Mail Interchange Format Standard") but only by example, not by
   explicit definition. The examples show no timezone offsets, and some MUAs