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
This commit is contained in:
Jonathan Lennox 2002-11-18 22:42:35 +00:00 committed by Paolo Carlini
parent 8c9aa0cba9
commit 5bdb1440a1
3 changed files with 38 additions and 3 deletions

View 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)

View 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;

View 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