Commit 5bdb1440 by Jonathan Lennox Committed by Paolo Carlini

streambuf.tcc (__copy_streambufs): verify __sbin->gptr() + __bufsize <…

streambuf.tcc (__copy_streambufs): verify __sbin->gptr() + __bufsize < __sbin->egptr() before using.

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.

From-SVN: r59234
parent 8c9aa0cb
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> 2002-11-18 Paolo Carlini <pcarlini@unitus.it>
PR libstdc++/6745 (continued) PR libstdc++/6745 (continued)
......
...@@ -213,7 +213,8 @@ namespace std ...@@ -213,7 +213,8 @@ namespace std
{ {
while (__testput && __bufsize != -1) 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); __xtrct = __sbout->sputn(__sbin->gptr(), __bufsize);
__ret += __xtrct; __ret += __xtrct;
......
...@@ -198,6 +198,28 @@ private: ...@@ -198,6 +198,28 @@ private:
std::string::const_iterator it; 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) void test(const std::string& str, std::streambuf& buf)
{ {
...@@ -218,8 +240,6 @@ 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> // Jonathan Lennox <lennox@cs.columbia.edu>
void test05() void test05()
{ {
std::ostringstream out_1, out_2, out_3, out_4;
std::string string_a("Hello, world!"); std::string string_a("Hello, world!");
std::string string_b(""); std::string string_b("");
...@@ -232,6 +252,9 @@ void test05() ...@@ -232,6 +252,9 @@ void test05()
test_buffer_3 buf3a(string_a); test_buffer_3 buf3a(string_a);
test_buffer_3 buf3b(string_b); test_buffer_3 buf3b(string_b);
test_buffer_4 buf4a(string_a);
test_buffer_4 buf4b(string_b);
test(string_a, buf1a); test(string_a, buf1a);
test(string_b, buf1b); test(string_b, buf1b);
...@@ -240,6 +263,9 @@ void test05() ...@@ -240,6 +263,9 @@ void test05()
test(string_a, buf3a); test(string_a, buf3a);
test(string_b, buf3b); test(string_b, buf3b);
test(string_a, buf4a);
test(string_b, buf4b);
} }
int int
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment