diff options
author | Thomas Koenig <tkoenig@gcc.gnu.org> | 2007-08-03 22:09:10 +0000 |
---|---|---|
committer | Thomas Koenig <tkoenig@gcc.gnu.org> | 2007-08-03 22:09:10 +0000 |
commit | f353733a26494c2b5684382f06d152381529077b (patch) | |
tree | 7c1981a62b5a05fcb566b6985611348493c6918d /libgfortran/io/unix.c | |
parent | 0a4221f6e4bedc3d1e395a69f60f263f52361c09 (diff) | |
download | gcc-f353733a26494c2b5684382f06d152381529077b.zip gcc-f353733a26494c2b5684382f06d152381529077b.tar.gz gcc-f353733a26494c2b5684382f06d152381529077b.tar.bz2 |
re PR libfortran/32977 (All gfortran tests fail on Tru64 UNIX V4.0F: vsnprintf missing)
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
Diffstat (limited to 'libgfortran/io/unix.c')
-rw-r--r-- | libgfortran/io/unix.c | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/libgfortran/io/unix.c b/libgfortran/io/unix.c index e9ad164..75721cc 100644 --- a/libgfortran/io/unix.c +++ b/libgfortran/io/unix.c @@ -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; } |