]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Add Assert check to catch vsnprintf overrunning its buffer. (Seen to
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 4 Mar 2002 18:34:02 +0000 (18:34 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
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