]> diplodocus.org Git - nmh/commitdiff
Resized buffer and provided timezone its own buffer.
authorDavid Levine <levinedl@acm.org>
Wed, 31 Oct 2018 22:51:23 +0000 (18:51 -0400)
committerDavid Levine <levinedl@acm.org>
Wed, 31 Oct 2018 22:51:23 +0000 (18:51 -0400)
gcc 8 noticed that snprintfs could have overrun them.

sbr/dtime.c

index a8b8432ca98f42e1f315020151bf7c3889706055..9a1002652c5f6b80363a415653942854da95aa4b 100644 (file)
 extern long timezone;
 #endif
 
 extern long timezone;
 #endif
 
+/* Size of largest possible int representing a time zone offset in minutes:
+   2,147,483,648 / 60 = 35,791,394 */
+#define DTZ_BUFFER_SIZE (sizeof "+3579139459")
+
 /*
  * The number of days in the year, accounting for leap years
  */
 /*
  * The number of days in the year, accounting for leap years
  */
@@ -249,7 +253,8 @@ dtime (time_t *clock, int alpha_timezone)
 char *
 dasctime (struct tws *tw, int flags)
 {
 char *
 dasctime (struct tws *tw, int flags)
 {
-    char buffer[80];
+    char buffer[77];
+    char tzbuffer[DTZ_BUFFER_SIZE];
     static char result[80];
     int twf;
 
     static char result[80];
     int twf;
 
@@ -258,14 +263,14 @@ dasctime (struct tws *tw, int flags)
 
     /* Display timezone if known */
     if (tw->tw_flags & TW_SZEXP)
 
     /* Display timezone if known */
     if (tw->tw_flags & TW_SZEXP)
-       snprintf(result, sizeof(result), " %s", dtimezone(tw->tw_zone, tw->tw_flags | flags));
+       snprintf(tzbuffer, sizeof(tzbuffer), " %s", dtimezone(tw->tw_zone, tw->tw_flags | flags));
     else
     else
-       result[0] = '\0';
+       tzbuffer[0] = '\0';
 
     snprintf(buffer, sizeof(buffer), "%02d %s %0*d %02d:%02d:%02d%s",
            tw->tw_mday, tw_moty[tw->tw_mon],
            tw->tw_year < 100 ? 2 : 4, tw->tw_year,
 
     snprintf(buffer, sizeof(buffer), "%02d %s %0*d %02d:%02d:%02d%s",
            tw->tw_mday, tw_moty[tw->tw_mon],
            tw->tw_year < 100 ? 2 : 4, tw->tw_year,
-           tw->tw_hour, tw->tw_min, tw->tw_sec, result);
+           tw->tw_hour, tw->tw_min, tw->tw_sec, tzbuffer);
 
     if ((twf = tw->tw_flags & TW_SDAY)) {
         if (twf == TW_SEXP)
 
     if ((twf = tw->tw_flags & TW_SDAY)) {
         if (twf == TW_SEXP)
@@ -289,7 +294,7 @@ dasctime (struct tws *tw, int flags)
 char *
 dtimezone(int offset, int flags)
 {
 char *
 dtimezone(int offset, int flags)
 {
-    static char buffer[sizeof "+3579139459"]; /* 2,147,483,648 / 60 = 35,791,394 */
+    static char buffer[DTZ_BUFFER_SIZE];
     bool pos;
     unsigned os, hours, mins;
 
     bool pos;
     unsigned os, hours, mins;