]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR libfortran/32977 (All gfortran tests fail on Tru64 UNIX V4.0F: vsnprintf missing)
authorThomas Koenig <tkoenig@gcc.gnu.org>
Fri, 3 Aug 2007 22:09:10 +0000 (22:09 +0000)
committerThomas Koenig <tkoenig@gcc.gnu.org>
Fri, 3 Aug 2007 22:09:10 +0000 (22:09 +0000)
2007-08-03  Thomas Koenig  <tkoenig@gcc.gnu.org>

PR libfortran/32977
* io/unix.c:  If there is no vsnprintf, use vsprintf and issue
a fatal error when a buffer overrun occurs.

From-SVN: r127187

libgfortran/ChangeLog
libgfortran/io/unix.c

index eb03d0ad688ec8266d5c6bbf62944d7833873281..2ccb46b02dd1ef3fd13c9b9da01b24416f9c0ba8 100644 (file)
@@ -1,3 +1,9 @@
+2007-08-03  Thomas Koenig  <tkoenig@gcc.gnu.org>
+
+       PR libfortran/32977
+       * io/unix.c:  If there is no vsnprintf, use vsprintf and issue
+       a fatal error when a buffer overrun occurs.
+
 2007-08-03  Francois-Xavier Coudert  <fxcoudert@gcc.gnu.org>
 
        PR fortran/31202
index e9ad164ba964b08e250563d882ff57becd862f9f..75721cc2ff5e9c829152a796a4e6efea752140a1 100644 (file)
@@ -1386,7 +1386,8 @@ error_stream (void)
    overruns, we limit the length of the buffer to ST_VPRINTF_SIZE.  2k
    is big enough to completely fill a 80x25 terminal, so it shuld be
    OK.  We use a direct write() because it is simpler and least likely
-   to be clobbered by memory corruption.  */
+   to be clobbered by memory corruption.  Writing an error message
+   longer than that is an error.  */
 
 #define ST_VPRINTF_SIZE 2048
 
@@ -1401,8 +1402,22 @@ st_vprintf (const char *format, va_list ap)
 #ifdef HAVE_VSNPRINTF
   written = vsnprintf(buffer, ST_VPRINTF_SIZE, format, ap);
 #else
-  written = __builtin_vsnprintf(buffer, ST_VPRINTF_SIZE, format, ap);
+  written = vsprintf(buffer, format, ap);
+
+  if (written >= ST_VPRINTF_SIZE-1)
+    {
+      /* The error message was longer than our buffer.  Ouch.  Because
+        we may have messed up things badly, report the error and
+        quit.  */
+#define ERROR_MESSAGE "Internal error: buffer overrun in st_vprintf()\n"
+      write (fd, buffer, ST_VPRINTF_SIZE-1);
+      write (fd, ERROR_MESSAGE, strlen(ERROR_MESSAGE));
+      sys_exit(2);
+#undef ERROR_MESSAGE
+
+    }
 #endif
+
   written = write (fd, buffer, written);
   return written;
 }