Add Assert check to catch vsnprintf overrunning its buffer. (Seen to
authorTom Lane
Mon, 4 Mar 2002 18:34:02 +0000 (18:34 +0000)
committerTom Lane
Mon, 4 Mar 2002 18:34:02 +0000 (18:34 +0000)
occur on Solaris 7 in 64-bit mode, for one.)

src/backend/lib/stringinfo.c

index 1745f0f9ca139274fee392b2dabeccf4d8a8056f..544ae1b3a205d0dfd322ba382441e9d74fa6d5e4 100644 (file)
@@ -9,7 +9,7 @@
  * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- *   $Id: stringinfo.c,v 1.29 2001/10/25 05:49:29 momjian Exp $
+ *   $Id: stringinfo.c,v 1.30 2002/03/04 18:34:02 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -114,11 +114,22 @@ appendStringInfo(StringInfo str, const char *fmt,...)
        avail = str->maxlen - str->len - 1;
        if (avail > 16)
        {
+           /*
+            * Assert check here is to catch buggy vsnprintf that overruns
+            * the specified buffer length.  Solaris 7 in 64-bit mode is
+            * an example of a platform with such a bug.
+            */
+#ifdef USE_ASSERT_CHECKING
+           str->data[str->maxlen-1] = '\0';
+#endif
+
            va_start(args, fmt);
            nprinted = vsnprintf(str->data + str->len, avail,
                                 fmt, args);
            va_end(args);
 
+           Assert(str->data[str->maxlen-1] == '\0');
+
            /*
             * Note: some versions of vsnprintf return the number of chars
             * actually stored, but at least one returns -1 on failure. Be