2002-11-18 Jonathan Lennox <lennox@cs.columbia.edu>
authorpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 18 Nov 2002 22:42:35 +0000 (22:42 +0000)
committerpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 18 Nov 2002 22:42:35 +0000 (22:42 +0000)
* include/bits/streambuf.tcc (__copy_streambufs): verify
__sbin->gptr() + __bufsize < __sbin->egptr() before using.
* testsuite/27_io/ostream_inserter_other.cc (test_buffer_4): Add.
(test05): Use test_buffer_4.  Delete unused ostringstream
variables.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@59234 138bc75d-0d04-0410-961f-82ee72b054a4

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/streambuf.tcc
libstdc++-v3/testsuite/27_io/ostream_inserter_other.cc

index 7934d74..6798340 100644 (file)
@@ -1,3 +1,11 @@
+2002-11-18  Jonathan Lennox  <lennox@cs.columbia.edu>
+
+       * include/bits/streambuf.tcc (__copy_streambufs): verify
+       __sbin->gptr() + __bufsize < __sbin->egptr() before using.
+       * testsuite/27_io/ostream_inserter_other.cc (test_buffer_4): Add.
+       (test05): Use test_buffer_4.  Delete unused ostringstream
+       variables.
+
 2002-11-18  Paolo Carlini  <pcarlini@unitus.it>
 
        PR libstdc++/6745 (continued)
index cdaab2e..2862dff 100644 (file)
@@ -213,7 +213,8 @@ namespace std
        {
          while (__testput && __bufsize != -1)
            {
-             if (__bufsize != 0 && __sbin->gptr() != NULL) 
+             if (__bufsize != 0 && __sbin->gptr() != NULL
+                 && __sbin->gptr() + __bufsize <= __sbin->egptr()) 
                {
                  __xtrct = __sbout->sputn(__sbin->gptr(), __bufsize);
                  __ret += __xtrct;
index 9d8cc0f..4ae1f3b 100644 (file)
@@ -198,6 +198,28 @@ private:
   std::string::const_iterator it;
 };
 
+class test_buffer_4 : public std::streambuf {
+public:
+  test_buffer_4(const std::string& s) : str(s), it(str.begin())
+  {
+    if (it != str.end()) {
+      buf[0] = *it++;
+      setg(buf, buf, buf+1);
+    }
+  }
+
+protected:
+  virtual int underflow() { return (it != str.end() ? *it : EOF); }
+  virtual int uflow() { return (it != str.end() ? *it++ : EOF); }
+  virtual std::streamsize showmanyc() {
+    std::streamsize ret = std::distance(it, str.end());
+    return ret > 0 ? ret : -1;
+  }
+private:
+  const std::string str;
+  std::string::const_iterator it;
+  char buf[1];
+};
 
 void test(const std::string& str, std::streambuf& buf)
 {
@@ -218,8 +240,6 @@ void test(const std::string& str, std::streambuf& buf)
 // Jonathan Lennox  <lennox@cs.columbia.edu>
 void test05()
 {
-  std::ostringstream out_1, out_2, out_3, out_4;
-
   std::string string_a("Hello, world!");
   std::string string_b("");
 
@@ -232,6 +252,9 @@ void test05()
   test_buffer_3 buf3a(string_a);
   test_buffer_3 buf3b(string_b);
 
+  test_buffer_4 buf4a(string_a);
+  test_buffer_4 buf4b(string_b);
+
   test(string_a, buf1a);
   test(string_b, buf1b);
 
@@ -240,6 +263,9 @@ void test05()
 
   test(string_a, buf3a);
   test(string_b, buf3b);
+
+  test(string_a, buf4a);
+  test(string_b, buf4b);
 }
 
 int