* editfns.c (Fcurrent_time_zone): Don't overrun buffer
authorPaul Eggert <eggert@cs.ucla.edu>
Mon, 29 Aug 2011 15:53:21 +0000 (08:53 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Mon, 29 Aug 2011 15:53:21 +0000 (08:53 -0700)
even if the time zone offset is outlandishly large.
Don't mishandle offset == INT_MIN.

src/ChangeLog
src/editfns.c

index 4336d6a..afd78a4 100644 (file)
        * dispnew.c (add_window_display_history): Don't overrun buffer.
        Truncate instead; this is OK since it's just a log.
 
+       * editfns.c (Fcurrent_time_zone): Don't overrun buffer
+       even if the time zone offset is outlandishly large.
+       Don't mishandle offset == INT_MIN.
+
 2011-08-26  Paul Eggert  <eggert@cs.ucla.edu>
 
        Integer and memory overflow issues (Bug#9196).
index 6759016..580298c 100644 (file)
@@ -2014,7 +2014,7 @@ the data it can't find.  */)
     {
       int offset = tm_diff (t, &gmt);
       char *s = 0;
-      char buf[6];
+      char buf[sizeof "+00" + INT_STRLEN_BOUND (int)];
 
 #ifdef HAVE_TM_ZONE
       if (t->tm_zone)
@@ -2029,7 +2029,8 @@ the data it can't find.  */)
       if (!s)
        {
          /* No local time zone name is available; use "+-NNNN" instead.  */
-         int am = (offset < 0 ? -offset : offset) / 60;
+         int m = offset / 60;
+         int am = offset < 0 ? - m : m;
          sprintf (buf, "%c%02d%02d", (offset < 0 ? '-' : '+'), am/60, am%60);
          s = buf;
        }